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 +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 | /** |