Commit 7d6e88cdecb463e37e403eaced9f3c7260a0beca
1 parent
a23a9ea1
Add PlayerClickListener
Showing
5 changed files
with
168 additions
and
3 deletions
src/client/java/com/mumfrey/liteloader/client/ClientProxy.java
... | ... | @@ -10,10 +10,12 @@ import java.io.File; |
10 | 10 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; |
11 | 11 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; |
12 | 12 | |
13 | +import com.mumfrey.liteloader.PlayerInteractionListener.MouseButton; | |
13 | 14 | import com.mumfrey.liteloader.client.ducks.IFramebuffer; |
14 | 15 | import com.mumfrey.liteloader.core.Proxy; |
15 | 16 | |
16 | 17 | import net.minecraft.client.Minecraft; |
18 | +import net.minecraft.client.entity.EntityPlayerSP; | |
17 | 19 | import net.minecraft.client.gui.GuiNewChat; |
18 | 20 | import net.minecraft.client.renderer.RenderGlobal; |
19 | 21 | import net.minecraft.client.renderer.entity.Render; |
... | ... | @@ -187,4 +189,14 @@ public abstract class ClientProxy extends Proxy |
187 | 189 | { |
188 | 190 | ClientProxy.broker.onPostRenderEntity(source, entity, x, y, z, yaw, pTicks, render); |
189 | 191 | } |
192 | + | |
193 | + public static boolean onClickMouse(EntityPlayerSP player, MouseButton button) | |
194 | + { | |
195 | + return ClientProxy.broker.onClickMouse(player, button); | |
196 | + } | |
197 | + | |
198 | + public static boolean onMouseHeld(EntityPlayerSP player, MouseButton button) | |
199 | + { | |
200 | + return ClientProxy.broker.onMouseHeld(player, button); | |
201 | + } | |
190 | 202 | } | ... | ... |
src/client/java/com/mumfrey/liteloader/client/LiteLoaderEventBrokerClient.java
... | ... | @@ -17,6 +17,8 @@ import com.mumfrey.liteloader.HUDRenderListener; |
17 | 17 | import com.mumfrey.liteloader.InitCompleteListener; |
18 | 18 | import com.mumfrey.liteloader.OutboundChatFilter; |
19 | 19 | import com.mumfrey.liteloader.OutboundChatListener; |
20 | +import com.mumfrey.liteloader.PlayerClickListener; | |
21 | +import com.mumfrey.liteloader.PlayerInteractionListener.MouseButton; | |
20 | 22 | import com.mumfrey.liteloader.PostRenderListener; |
21 | 23 | import com.mumfrey.liteloader.PreRenderListener; |
22 | 24 | import com.mumfrey.liteloader.RenderListener; |
... | ... | @@ -37,6 +39,7 @@ import com.mumfrey.liteloader.launch.LoaderProperties; |
37 | 39 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; |
38 | 40 | |
39 | 41 | import net.minecraft.client.Minecraft; |
42 | +import net.minecraft.client.entity.EntityPlayerSP; | |
40 | 43 | import net.minecraft.client.gui.GuiNewChat; |
41 | 44 | import net.minecraft.client.gui.ScaledResolution; |
42 | 45 | import net.minecraft.client.renderer.RenderGlobal; |
... | ... | @@ -100,6 +103,8 @@ public class LiteLoaderEventBrokerClient extends LiteLoaderEventBroker<Minecraft |
100 | 103 | private FastIterableDeque<ScreenshotListener> screenshotListeners = new HandlerList<ScreenshotListener>(ScreenshotListener.class, |
101 | 104 | ReturnLogicOp.AND_BREAK_ON_FALSE); |
102 | 105 | private FastIterableDeque<EntityRenderListener> entityRenderListeners = new HandlerList<EntityRenderListener>(EntityRenderListener.class); |
106 | + private FastIterableDeque<PlayerClickListener> playerClickListeners = new HandlerList<PlayerClickListener>(PlayerClickListener.class, | |
107 | + ReturnLogicOp.AND); | |
103 | 108 | |
104 | 109 | @SuppressWarnings("cast") |
105 | 110 | public LiteLoaderEventBrokerClient(LiteLoader loader, GameEngineClient engine, LoaderProperties properties) |
... | ... | @@ -146,6 +151,7 @@ public class LiteLoaderEventBrokerClient extends LiteLoaderEventBroker<Minecraft |
146 | 151 | delegate.registerInterface(OutboundChatFilter.class); |
147 | 152 | delegate.registerInterface(ScreenshotListener.class); |
148 | 153 | delegate.registerInterface(EntityRenderListener.class); |
154 | + delegate.registerInterface(PlayerClickListener.class); | |
149 | 155 | } |
150 | 156 | |
151 | 157 | /* (non-Javadoc) |
... | ... | @@ -267,6 +273,14 @@ public class LiteLoaderEventBrokerClient extends LiteLoaderEventBroker<Minecraft |
267 | 273 | { |
268 | 274 | this.entityRenderListeners.add(entityRenderListener); |
269 | 275 | } |
276 | + | |
277 | + /** | |
278 | + * @param playerClickListener | |
279 | + */ | |
280 | + public void addEntityRenderListener(PlayerClickListener playerClickListener) | |
281 | + { | |
282 | + this.playerClickListeners.add(playerClickListener); | |
283 | + } | |
270 | 284 | |
271 | 285 | /** |
272 | 286 | * Late initialisation callback |
... | ... | @@ -581,4 +595,14 @@ public class LiteLoaderEventBrokerClient extends LiteLoaderEventBroker<Minecraft |
581 | 595 | { |
582 | 596 | this.entityRenderListeners.all().onPostRenderEntity(render, entity, xPos, yPos, zPos, yaw, partialTicks); |
583 | 597 | } |
598 | + | |
599 | + public boolean onClickMouse(EntityPlayerSP player, MouseButton button) | |
600 | + { | |
601 | + return this.playerClickListeners.all().onMouseClicked(player, button); | |
602 | + } | |
603 | + | |
604 | + public boolean onMouseHeld(EntityPlayerSP player, MouseButton button) | |
605 | + { | |
606 | + return this.playerClickListeners.all().onMouseHeld(player, button); | |
607 | + } | |
584 | 608 | } | ... | ... |
src/client/java/com/mumfrey/liteloader/client/mixin/MixinMinecraft.java
... | ... | @@ -16,6 +16,7 @@ import org.spongepowered.asm.mixin.injection.Inject; |
16 | 16 | import org.spongepowered.asm.mixin.injection.Redirect; |
17 | 17 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; |
18 | 18 | |
19 | +import com.mumfrey.liteloader.PlayerInteractionListener.MouseButton; | |
19 | 20 | import com.mumfrey.liteloader.client.ClientProxy; |
20 | 21 | import com.mumfrey.liteloader.client.overlays.IMinecraft; |
21 | 22 | |
... | ... | @@ -35,6 +36,9 @@ public abstract class MixinMinecraft implements IMinecraft |
35 | 36 | @Shadow private int serverPort; |
36 | 37 | |
37 | 38 | @Shadow abstract void resize(int width, int height); |
39 | + @Shadow private void clickMouse() {} | |
40 | + @Shadow private void rightClickMouse() {} | |
41 | + @Shadow private void middleClickMouse() {} | |
38 | 42 | |
39 | 43 | @Inject(method = "startGame()V", at = @At("RETURN")) |
40 | 44 | private void onStartupComplete(CallbackInfo ci) |
... | ... | @@ -93,7 +97,7 @@ public abstract class MixinMinecraft implements IMinecraft |
93 | 97 | ClientProxy.onTimerUpdate(); |
94 | 98 | } |
95 | 99 | |
96 | - @Inject (method = "runGameLoop()V", at = @At( | |
100 | + @Inject(method = "runGameLoop()V", at = @At( | |
97 | 101 | value = "INVOKE_STRING", |
98 | 102 | target = "Lnet/minecraft/profiler/Profiler;endStartSection(Ljava/lang/String;)V", |
99 | 103 | args = "ldc=gameRenderer" |
... | ... | @@ -102,6 +106,71 @@ public abstract class MixinMinecraft implements IMinecraft |
102 | 106 | { |
103 | 107 | ClientProxy.onRender(); |
104 | 108 | } |
109 | + | |
110 | + @Redirect(method = "processKeyBinds()V", at = @At( | |
111 | + value = "INVOKE", | |
112 | + target = "Lnet/minecraft/client/Minecraft;clickMouse()V" | |
113 | + )) | |
114 | + private void onClickMouse(Minecraft self) | |
115 | + { | |
116 | + if (ClientProxy.onClickMouse(self.thePlayer, MouseButton.LEFT)) | |
117 | + { | |
118 | + this.clickMouse(); | |
119 | + } | |
120 | + } | |
121 | + | |
122 | + @Inject(method = "sendClickBlockToController(Z)V", at = @At( | |
123 | + value = "FIELD", | |
124 | + target = "Lnet/minecraft/client/Minecraft;objectMouseOver:Lnet/minecraft/util/math/RayTraceResult;", | |
125 | + ordinal = 0 | |
126 | + ), | |
127 | + cancellable = true | |
128 | + ) | |
129 | + private void onMouseHeld(boolean leftClick, CallbackInfo ci) | |
130 | + { | |
131 | + if (!ClientProxy.onMouseHeld(((Minecraft)(Object)this).thePlayer, MouseButton.LEFT)) | |
132 | + { | |
133 | + ci.cancel(); | |
134 | + } | |
135 | + } | |
136 | + | |
137 | + @Redirect(method = "processKeyBinds()V", at = @At( | |
138 | + value = "INVOKE", | |
139 | + target = "Lnet/minecraft/client/Minecraft;rightClickMouse()V", | |
140 | + ordinal = 0 | |
141 | + )) | |
142 | + private void onRightClickMouse(Minecraft self) | |
143 | + { | |
144 | + if (ClientProxy.onClickMouse(self.thePlayer, MouseButton.RIGHT)) | |
145 | + { | |
146 | + this.rightClickMouse(); | |
147 | + } | |
148 | + } | |
149 | + | |
150 | + @Redirect(method = "processKeyBinds()V", at = @At( | |
151 | + value = "INVOKE", | |
152 | + target = "Lnet/minecraft/client/Minecraft;rightClickMouse()V", | |
153 | + ordinal = 1 | |
154 | + )) | |
155 | + private void onRightMouseHeld(Minecraft self) | |
156 | + { | |
157 | + if (ClientProxy.onMouseHeld(self.thePlayer, MouseButton.RIGHT)) | |
158 | + { | |
159 | + this.rightClickMouse(); | |
160 | + } | |
161 | + } | |
162 | + | |
163 | + @Redirect(method = "processKeyBinds()V", at = @At( | |
164 | + value = "INVOKE", | |
165 | + target = "Lnet/minecraft/client/Minecraft;middleClickMouse()V" | |
166 | + )) | |
167 | + private void onMiddleClickMouse(Minecraft self) | |
168 | + { | |
169 | + if (ClientProxy.onClickMouse(self.thePlayer, MouseButton.MIDDLE)) | |
170 | + { | |
171 | + this.middleClickMouse(); | |
172 | + } | |
173 | + } | |
105 | 174 | |
106 | 175 | @Override |
107 | 176 | public Timer getTimer() | ... | ... |
src/main/java/com/mumfrey/liteloader/PlayerClickListener.java
0 → 100644
1 | +/* | |
2 | + * This file is part of LiteLoader. | |
3 | + * Copyright (C) 2012-16 Adam Mummery-Smith | |
4 | + * All Rights Reserved. | |
5 | + */ | |
6 | +package com.mumfrey.liteloader; | |
7 | + | |
8 | +import com.mumfrey.liteloader.PlayerInteractionListener.MouseButton; | |
9 | + | |
10 | +import net.minecraft.client.entity.EntityPlayerSP; | |
11 | + | |
12 | +/** | |
13 | + * Interface for mods which want to listen for and intercept mouse events on the | |
14 | + * client side <em>before</em> they trigger remote actions, or otherwise just | |
15 | + * be notified that a click is about to be dispatched. | |
16 | + * | |
17 | + * @author Adam Mummery-Smith | |
18 | + */ | |
19 | +public interface PlayerClickListener extends LiteMod | |
20 | +{ | |
21 | + /** | |
22 | + * For left, middle and right clicks. Called when the click event is | |
23 | + * processed, before any handling has been done. Note that the context of | |
24 | + * the click can be obtained from: | |
25 | + * | |
26 | + * <ul> | |
27 | + * <li><tt>Minecraft.objectMouseOver</tt> the object currently under | |
28 | + * cursor.</li> | |
29 | + * <li><tt>EntityUtilities.rayTraceFromEntity</tt> using the supplied | |
30 | + * player is useful to determine objects under the cursor at longer | |
31 | + * distances than the player's reach.</li> | |
32 | + * <li><tt>player.isRowingBoat()</tt> is used to inhibit a lot of vanilla | |
33 | + * click behaviour and is worth checking state if acting upon clicks. | |
34 | + * </li> | |
35 | + * </ul> | |
36 | + * | |
37 | + * @param player The local player | |
38 | + * @param button The mouse button which was clicked | |
39 | + * @return true to allow the click to be processed normally, false to | |
40 | + * inhibit further processing of the click. Other listeners will still | |
41 | + * be notified. | |
42 | + */ | |
43 | + public abstract boolean onMouseClicked(EntityPlayerSP player, MouseButton button); | |
44 | + | |
45 | + /** | |
46 | + * For left and right clicks only, when the player holds the key down the | |
47 | + * game periodically processes additional events (eg. mining), this event is | |
48 | + * raised after the initial click when the mouse button is held down. | |
49 | + * | |
50 | + * @param player The local player | |
51 | + * @param button The mouse button being held, only valid for LEFT and RIGHT | |
52 | + * @return true to allow the button held event to be processed normally, | |
53 | + * false to inhibit further processing of the click. Other listeners | |
54 | + * will still be notified. | |
55 | + */ | |
56 | + public abstract boolean onMouseHeld(EntityPlayerSP player, MouseButton button); | |
57 | +} | ... | ... |
src/main/java/com/mumfrey/liteloader/PlayerInteractionListener.java
... | ... | @@ -14,7 +14,9 @@ import net.minecraft.util.math.RayTraceResult.Type; |
14 | 14 | |
15 | 15 | /** |
16 | 16 | * Interface for mods which want to observe the player's "interaction" status |
17 | - * (player mouse clicks), allows block interaction events to be cancelled. | |
17 | + * (player mouse clicks), allows block interaction events to be cancelled. This | |
18 | + * listener handles clicks on the server side (integrated server in single | |
19 | + * player). For client-side interaction events use {@link PlayerClickListener}. | |
18 | 20 | * |
19 | 21 | * @author Adam Mummery-Smith |
20 | 22 | */ |
... | ... | @@ -26,7 +28,8 @@ public interface PlayerInteractionListener extends LiteMod |
26 | 28 | public static enum MouseButton |
27 | 29 | { |
28 | 30 | LEFT, |
29 | - RIGHT | |
31 | + RIGHT, | |
32 | + MIDDLE | |
30 | 33 | } |
31 | 34 | |
32 | 35 | /** | ... | ... |