Commit 089cab54ac110cfb383a595d4c83ef5a7ac38116
1 parent
d5d07814
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 +10,12 @@ import java.io.File; | ||
10 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; | 10 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; |
11 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; | 11 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; |
12 | 12 | ||
13 | +import com.mumfrey.liteloader.PlayerInteractionListener.MouseButton; | ||
13 | import com.mumfrey.liteloader.client.ducks.IFramebuffer; | 14 | import com.mumfrey.liteloader.client.ducks.IFramebuffer; |
14 | import com.mumfrey.liteloader.core.Proxy; | 15 | import com.mumfrey.liteloader.core.Proxy; |
15 | 16 | ||
16 | import net.minecraft.client.Minecraft; | 17 | import net.minecraft.client.Minecraft; |
18 | +import net.minecraft.client.entity.EntityPlayerSP; | ||
17 | import net.minecraft.client.gui.GuiNewChat; | 19 | import net.minecraft.client.gui.GuiNewChat; |
18 | import net.minecraft.client.renderer.RenderGlobal; | 20 | import net.minecraft.client.renderer.RenderGlobal; |
19 | import net.minecraft.client.renderer.entity.Render; | 21 | import net.minecraft.client.renderer.entity.Render; |
@@ -187,4 +189,14 @@ public abstract class ClientProxy extends Proxy | @@ -187,4 +189,14 @@ public abstract class ClientProxy extends Proxy | ||
187 | { | 189 | { |
188 | ClientProxy.broker.onPostRenderEntity(source, entity, x, y, z, yaw, pTicks, render); | 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,6 +17,8 @@ import com.mumfrey.liteloader.HUDRenderListener; | ||
17 | import com.mumfrey.liteloader.InitCompleteListener; | 17 | import com.mumfrey.liteloader.InitCompleteListener; |
18 | import com.mumfrey.liteloader.OutboundChatFilter; | 18 | import com.mumfrey.liteloader.OutboundChatFilter; |
19 | import com.mumfrey.liteloader.OutboundChatListener; | 19 | import com.mumfrey.liteloader.OutboundChatListener; |
20 | +import com.mumfrey.liteloader.PlayerClickListener; | ||
21 | +import com.mumfrey.liteloader.PlayerInteractionListener.MouseButton; | ||
20 | import com.mumfrey.liteloader.PostRenderListener; | 22 | import com.mumfrey.liteloader.PostRenderListener; |
21 | import com.mumfrey.liteloader.PreRenderListener; | 23 | import com.mumfrey.liteloader.PreRenderListener; |
22 | import com.mumfrey.liteloader.RenderListener; | 24 | import com.mumfrey.liteloader.RenderListener; |
@@ -37,6 +39,7 @@ import com.mumfrey.liteloader.launch.LoaderProperties; | @@ -37,6 +39,7 @@ import com.mumfrey.liteloader.launch.LoaderProperties; | ||
37 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; | 39 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; |
38 | 40 | ||
39 | import net.minecraft.client.Minecraft; | 41 | import net.minecraft.client.Minecraft; |
42 | +import net.minecraft.client.entity.EntityPlayerSP; | ||
40 | import net.minecraft.client.gui.GuiNewChat; | 43 | import net.minecraft.client.gui.GuiNewChat; |
41 | import net.minecraft.client.gui.ScaledResolution; | 44 | import net.minecraft.client.gui.ScaledResolution; |
42 | import net.minecraft.client.renderer.RenderGlobal; | 45 | import net.minecraft.client.renderer.RenderGlobal; |
@@ -100,6 +103,8 @@ public class LiteLoaderEventBrokerClient extends LiteLoaderEventBroker<Minecraft | @@ -100,6 +103,8 @@ public class LiteLoaderEventBrokerClient extends LiteLoaderEventBroker<Minecraft | ||
100 | private FastIterableDeque<ScreenshotListener> screenshotListeners = new HandlerList<ScreenshotListener>(ScreenshotListener.class, | 103 | private FastIterableDeque<ScreenshotListener> screenshotListeners = new HandlerList<ScreenshotListener>(ScreenshotListener.class, |
101 | ReturnLogicOp.AND_BREAK_ON_FALSE); | 104 | ReturnLogicOp.AND_BREAK_ON_FALSE); |
102 | private FastIterableDeque<EntityRenderListener> entityRenderListeners = new HandlerList<EntityRenderListener>(EntityRenderListener.class); | 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 | @SuppressWarnings("cast") | 109 | @SuppressWarnings("cast") |
105 | public LiteLoaderEventBrokerClient(LiteLoader loader, GameEngineClient engine, LoaderProperties properties) | 110 | public LiteLoaderEventBrokerClient(LiteLoader loader, GameEngineClient engine, LoaderProperties properties) |
@@ -146,6 +151,7 @@ public class LiteLoaderEventBrokerClient extends LiteLoaderEventBroker<Minecraft | @@ -146,6 +151,7 @@ public class LiteLoaderEventBrokerClient extends LiteLoaderEventBroker<Minecraft | ||
146 | delegate.registerInterface(OutboundChatFilter.class); | 151 | delegate.registerInterface(OutboundChatFilter.class); |
147 | delegate.registerInterface(ScreenshotListener.class); | 152 | delegate.registerInterface(ScreenshotListener.class); |
148 | delegate.registerInterface(EntityRenderListener.class); | 153 | delegate.registerInterface(EntityRenderListener.class); |
154 | + delegate.registerInterface(PlayerClickListener.class); | ||
149 | } | 155 | } |
150 | 156 | ||
151 | /* (non-Javadoc) | 157 | /* (non-Javadoc) |
@@ -267,6 +273,14 @@ public class LiteLoaderEventBrokerClient extends LiteLoaderEventBroker<Minecraft | @@ -267,6 +273,14 @@ public class LiteLoaderEventBrokerClient extends LiteLoaderEventBroker<Minecraft | ||
267 | { | 273 | { |
268 | this.entityRenderListeners.add(entityRenderListener); | 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 | * Late initialisation callback | 286 | * Late initialisation callback |
@@ -581,4 +595,14 @@ public class LiteLoaderEventBrokerClient extends LiteLoaderEventBroker<Minecraft | @@ -581,4 +595,14 @@ public class LiteLoaderEventBrokerClient extends LiteLoaderEventBroker<Minecraft | ||
581 | { | 595 | { |
582 | this.entityRenderListeners.all().onPostRenderEntity(render, entity, xPos, yPos, zPos, yaw, partialTicks); | 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,6 +16,7 @@ import org.spongepowered.asm.mixin.injection.Inject; | ||
16 | import org.spongepowered.asm.mixin.injection.Redirect; | 16 | import org.spongepowered.asm.mixin.injection.Redirect; |
17 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; | 17 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; |
18 | 18 | ||
19 | +import com.mumfrey.liteloader.PlayerInteractionListener.MouseButton; | ||
19 | import com.mumfrey.liteloader.client.ClientProxy; | 20 | import com.mumfrey.liteloader.client.ClientProxy; |
20 | import com.mumfrey.liteloader.client.overlays.IMinecraft; | 21 | import com.mumfrey.liteloader.client.overlays.IMinecraft; |
21 | 22 | ||
@@ -35,6 +36,9 @@ public abstract class MixinMinecraft implements IMinecraft | @@ -35,6 +36,9 @@ public abstract class MixinMinecraft implements IMinecraft | ||
35 | @Shadow private int serverPort; | 36 | @Shadow private int serverPort; |
36 | 37 | ||
37 | @Shadow abstract void resize(int width, int height); | 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 | @Inject(method = "startGame()V", at = @At("RETURN")) | 43 | @Inject(method = "startGame()V", at = @At("RETURN")) |
40 | private void onStartupComplete(CallbackInfo ci) | 44 | private void onStartupComplete(CallbackInfo ci) |
@@ -93,7 +97,7 @@ public abstract class MixinMinecraft implements IMinecraft | @@ -93,7 +97,7 @@ public abstract class MixinMinecraft implements IMinecraft | ||
93 | ClientProxy.onTimerUpdate(); | 97 | ClientProxy.onTimerUpdate(); |
94 | } | 98 | } |
95 | 99 | ||
96 | - @Inject (method = "runGameLoop()V", at = @At( | 100 | + @Inject(method = "runGameLoop()V", at = @At( |
97 | value = "INVOKE_STRING", | 101 | value = "INVOKE_STRING", |
98 | target = "Lnet/minecraft/profiler/Profiler;endStartSection(Ljava/lang/String;)V", | 102 | target = "Lnet/minecraft/profiler/Profiler;endStartSection(Ljava/lang/String;)V", |
99 | args = "ldc=gameRenderer" | 103 | args = "ldc=gameRenderer" |
@@ -102,6 +106,71 @@ public abstract class MixinMinecraft implements IMinecraft | @@ -102,6 +106,71 @@ public abstract class MixinMinecraft implements IMinecraft | ||
102 | { | 106 | { |
103 | ClientProxy.onRender(); | 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 | @Override | 175 | @Override |
107 | public Timer getTimer() | 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,7 +14,9 @@ import net.minecraft.util.math.RayTraceResult.Type; | ||
14 | 14 | ||
15 | /** | 15 | /** |
16 | * Interface for mods which want to observe the player's "interaction" status | 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 | * @author Adam Mummery-Smith | 21 | * @author Adam Mummery-Smith |
20 | */ | 22 | */ |
@@ -26,7 +28,8 @@ public interface PlayerInteractionListener extends LiteMod | @@ -26,7 +28,8 @@ public interface PlayerInteractionListener extends LiteMod | ||
26 | public static enum MouseButton | 28 | public static enum MouseButton |
27 | { | 29 | { |
28 | LEFT, | 30 | LEFT, |
29 | - RIGHT | 31 | + RIGHT, |
32 | + MIDDLE | ||
30 | } | 33 | } |
31 | 34 | ||
32 | /** | 35 | /** |