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