Commit ae0c58670b3b3c0feae8bca0171fc8cb617334d4

Authored by Mumfrey
1 parent 1b0e9c50

adding PlayerMoveListener

java/client/com/mumfrey/liteloader/client/CallbackProxyClient.java
... ... @@ -13,28 +13,14 @@ import net.minecraft.client.renderer.entity.RenderManager;
13 13 import net.minecraft.client.shader.Framebuffer;
14 14 import net.minecraft.entity.Entity;
15 15 import net.minecraft.entity.player.EntityPlayer;
16   -import net.minecraft.entity.player.EntityPlayerMP;
17   -import net.minecraft.item.ItemStack;
18   -import net.minecraft.network.NetHandlerPlayServer;
19   -import net.minecraft.network.NetworkManager;
20   -import net.minecraft.network.play.client.C07PacketPlayerDigging;
21   -import net.minecraft.network.play.client.C08PacketPlayerBlockPlacement;
22   -import net.minecraft.network.play.client.C0APacketAnimation;
23   -import net.minecraft.network.play.server.S23PacketBlockChange;
24   -import net.minecraft.server.MinecraftServer;
25 16 import net.minecraft.server.integrated.IntegratedServer;
26   -import net.minecraft.server.management.ItemInWorldManager;
27   -import net.minecraft.server.management.ServerConfigurationManager;
28   -import net.minecraft.util.BlockPos;
29   -import net.minecraft.util.EnumFacing;
30 17 import net.minecraft.util.IChatComponent;
31 18 import net.minecraft.util.ScreenShotHelper;
32 19 import net.minecraft.util.Session;
33   -import net.minecraft.world.World;
34 20 import net.minecraft.world.WorldSettings;
35 21  
36 22 import com.mojang.authlib.GameProfile;
37   -import com.mumfrey.liteloader.core.LiteLoaderEventBroker.InteractType;
  23 +import com.mumfrey.liteloader.core.CallbackProxyCommon;
38 24 import com.mumfrey.liteloader.transformers.event.EventInfo;
39 25 import com.mumfrey.liteloader.transformers.event.ReturnEventInfo;
40 26  
... ... @@ -45,29 +31,33 @@ import com.mumfrey.liteloader.transformers.event.ReturnEventInfo;
45 31 *
46 32 * @author Adam Mummery-Smith
47 33 */
48   -public class CallbackProxyClient
  34 +public abstract class CallbackProxyClient extends CallbackProxyCommon
49 35 {
50   - private static LiteLoaderEventBrokerClient eventBroker;
  36 + private static LiteLoaderEventBrokerClient clientEventBroker;
51 37  
52 38 private static boolean fboEnabled;
53 39  
54 40 private static boolean renderingFBO;
55 41  
  42 + private CallbackProxyClient() {}
  43 +
56 44 public static void onStartupComplete(EventInfo<Minecraft> e)
57 45 {
58   - CallbackProxyClient.eventBroker = LiteLoaderEventBrokerClient.getInstance();
  46 + CallbackProxyCommon.onStartupComplete();
  47 +
  48 + CallbackProxyClient.clientEventBroker = LiteLoaderEventBrokerClient.getInstance();
59 49  
60   - if (CallbackProxyClient.eventBroker == null)
  50 + if (CallbackProxyClient.clientEventBroker == null)
61 51 {
62 52 throw new RuntimeException("LiteLoader failed to start up properly. The game is in an unstable state and must shut down now. Check the developer log for startup errors");
63 53 }
64 54  
65   - CallbackProxyClient.eventBroker.onStartupComplete();
  55 + CallbackProxyClient.clientEventBroker.onStartupComplete();
66 56 }
67 57  
68 58 public static void onTimerUpdate(EventInfo<Minecraft> e)
69 59 {
70   - CallbackProxyClient.eventBroker.onTimerUpdate();
  60 + CallbackProxyClient.clientEventBroker.onTimerUpdate();
71 61 }
72 62  
73 63 public static void newTick(EventInfo<Minecraft> e)
... ... @@ -76,124 +66,99 @@ public class CallbackProxyClient
76 66  
77 67 public static void onTick(EventInfo<Minecraft> e)
78 68 {
79   - CallbackProxyClient.eventBroker.onTick();
  69 + CallbackProxyClient.clientEventBroker.onTick();
80 70 }
81 71  
82 72 public static void onRender(EventInfo<Minecraft> e)
83 73 {
84   - CallbackProxyClient.eventBroker.onRender();
  74 + CallbackProxyClient.clientEventBroker.onRender();
85 75 }
86 76  
87 77 public static void preRenderGUI(EventInfo<EntityRenderer> e, float partialTicks)
88 78 {
89   - CallbackProxyClient.eventBroker.preRenderGUI(partialTicks);
  79 + CallbackProxyClient.clientEventBroker.preRenderGUI(partialTicks);
90 80 }
91 81  
92 82 public static void onSetupCameraTransform(EventInfo<EntityRenderer> e, int pass, float partialTicks, long timeSlice)
93 83 {
94   - CallbackProxyClient.eventBroker.onSetupCameraTransform(partialTicks, timeSlice);
  84 + CallbackProxyClient.clientEventBroker.onSetupCameraTransform(partialTicks, timeSlice);
95 85 }
96 86  
97 87 public static void postRenderEntities(EventInfo<EntityRenderer> e, int pass, float partialTicks, long timeSlice)
98 88 {
99   - CallbackProxyClient.eventBroker.postRenderEntities(partialTicks, timeSlice);
  89 + CallbackProxyClient.clientEventBroker.postRenderEntities(partialTicks, timeSlice);
100 90 }
101 91  
102 92 public static void postRender(EventInfo<EntityRenderer> e, float partialTicks, long timeSlice)
103 93 {
104   - CallbackProxyClient.eventBroker.postRender(partialTicks, timeSlice);
  94 + CallbackProxyClient.clientEventBroker.postRender(partialTicks, timeSlice);
105 95 }
106 96  
107 97 public static void onRenderHUD(EventInfo<EntityRenderer> e, float partialTicks)
108 98 {
109   - CallbackProxyClient.eventBroker.onRenderHUD(partialTicks);
  99 + CallbackProxyClient.clientEventBroker.onRenderHUD(partialTicks);
110 100 }
111 101  
112 102 public static void onRenderChat(EventInfo<GuiIngame> e, float partialTicks)
113 103 {
114   - CallbackProxyClient.eventBroker.onRenderChat(e.getSource().getChatGUI(), partialTicks);
  104 + CallbackProxyClient.clientEventBroker.onRenderChat(e.getSource().getChatGUI(), partialTicks);
115 105 }
116 106  
117 107 public static void postRenderChat(EventInfo<GuiIngame> e, float partialTicks)
118 108 {
119   - CallbackProxyClient.eventBroker.postRenderChat(e.getSource().getChatGUI(), partialTicks);
  109 + CallbackProxyClient.clientEventBroker.postRenderChat(e.getSource().getChatGUI(), partialTicks);
120 110 }
121 111  
122 112 public static void postRenderHUD(EventInfo<EntityRenderer> e, float partialTicks)
123 113 {
124   - CallbackProxyClient.eventBroker.postRenderHUD(partialTicks);
  114 + CallbackProxyClient.clientEventBroker.postRenderHUD(partialTicks);
125 115 }
126 116  
127 117 public static void IntegratedServerCtor(EventInfo<IntegratedServer> e, Minecraft minecraft, String folderName, String worldName, WorldSettings worldSettings)
128 118 {
129   - CallbackProxyClient.eventBroker.onStartServer(e.getSource(), folderName, worldName, worldSettings);
130   - }
131   -
132   - public static void onInitializePlayerConnection(EventInfo<ServerConfigurationManager> e, NetworkManager netManager, EntityPlayerMP player)
133   - {
134   - CallbackProxyClient.eventBroker.onInitializePlayerConnection(e.getSource(), netManager, player);
135   - }
136   -
137   - public static void onPlayerLogin(EventInfo<ServerConfigurationManager> e, EntityPlayerMP player)
138   - {
139   - CallbackProxyClient.eventBroker.onPlayerLogin(e.getSource(), player);
140   - }
141   -
142   - public static void onPlayerLogout(EventInfo<ServerConfigurationManager> e, EntityPlayerMP player)
143   - {
144   - CallbackProxyClient.eventBroker.onPlayerLogout(e.getSource(), player);
145   - }
146   -
147   - public static void onSpawnPlayer(ReturnEventInfo<ServerConfigurationManager, EntityPlayerMP> e, GameProfile profile)
148   - {
149   - CallbackProxyClient.eventBroker.onSpawnPlayer(e.getSource(), e.getReturnValue(), profile);
150   - }
151   -
152   - public static void onRespawnPlayer(ReturnEventInfo<ServerConfigurationManager, EntityPlayerMP> e, EntityPlayerMP oldPlayer, int dimension, boolean won)
153   - {
154   - CallbackProxyClient.eventBroker.onRespawnPlayer(e.getSource(), e.getReturnValue(), oldPlayer, dimension, won);
  119 + CallbackProxyClient.clientEventBroker.onStartServer(e.getSource(), folderName, worldName, worldSettings);
155 120 }
156 121  
157 122 public static void onOutboundChat(EventInfo<EntityPlayerSP> e, String message)
158 123 {
159   - CallbackProxyClient.eventBroker.onSendChatMessage(e, message);
  124 + CallbackProxyClient.clientEventBroker.onSendChatMessage(e, message);
160 125 }
161 126  
162 127 public static void onResize(EventInfo<Minecraft> e)
163 128 {
164   - if (CallbackProxyClient.eventBroker == null) return;
165   - CallbackProxyClient.eventBroker.onResize(e.getSource());
  129 + if (CallbackProxyClient.clientEventBroker == null) return;
  130 + CallbackProxyClient.clientEventBroker.onResize(e.getSource());
166 131 }
167 132  
168 133 public static void preRenderFBO(EventInfo<Minecraft> e)
169 134 {
170   - if (CallbackProxyClient.eventBroker == null) return;
  135 + if (CallbackProxyClient.clientEventBroker == null) return;
171 136 CallbackProxyClient.fboEnabled = OpenGlHelper.isFramebufferEnabled();
172 137  
173 138 if (CallbackProxyClient.fboEnabled)
174 139 {
175 140 CallbackProxyClient.renderingFBO = true;
176   - CallbackProxyClient.eventBroker.preRenderFBO(e.getSource().getFramebuffer());
  141 + CallbackProxyClient.clientEventBroker.preRenderFBO(e.getSource().getFramebuffer());
177 142 }
178 143 }
179 144  
180 145 public static void postRenderFBO(EventInfo<Minecraft> e)
181 146 {
182   - if (CallbackProxyClient.eventBroker == null) return;
  147 + if (CallbackProxyClient.clientEventBroker == null) return;
183 148 CallbackProxyClient.renderingFBO = false;
184 149  
185 150 if (CallbackProxyClient.fboEnabled)
186 151 {
187   - CallbackProxyClient.eventBroker.postRenderFBO(e.getSource().getFramebuffer());
  152 + CallbackProxyClient.clientEventBroker.postRenderFBO(e.getSource().getFramebuffer());
188 153 }
189 154 }
190 155  
191 156 public static void renderFBO(EventInfo<Framebuffer> e, int width, int height, boolean flag)
192 157 {
193   - if (CallbackProxyClient.eventBroker == null) return;
  158 + if (CallbackProxyClient.clientEventBroker == null) return;
194 159 if (CallbackProxyClient.renderingFBO)
195 160 {
196   - CallbackProxyClient.eventBroker.onRenderFBO(e.getSource(), width, height);
  161 + CallbackProxyClient.clientEventBroker.onRenderFBO(e.getSource(), width, height);
197 162 }
198 163  
199 164 CallbackProxyClient.renderingFBO = false;
... ... @@ -201,96 +166,22 @@ public class CallbackProxyClient
201 166  
202 167 public static void onRenderWorld(EventInfo<EntityRenderer> e, float partialTicks, long timeSlice)
203 168 {
204   - CallbackProxyClient.eventBroker.onRenderWorld(partialTicks, timeSlice);
  169 + CallbackProxyClient.clientEventBroker.onRenderWorld(partialTicks, timeSlice);
205 170 }
206 171  
207 172 public static void onSaveScreenshot(ReturnEventInfo<ScreenShotHelper, IChatComponent> e, File gameDir, String name, int width, int height, Framebuffer fbo)
208 173 {
209   - CallbackProxyClient.eventBroker.onScreenshot(e, name, width, height, fbo);
  174 + CallbackProxyClient.clientEventBroker.onScreenshot(e, name, width, height, fbo);
210 175 }
211 176  
212 177 public static void onRenderEntity(ReturnEventInfo<RenderManager, Boolean> e, Entity entity, double xPos, double yPos, double zPos, float yaw, float partialTicks, boolean hideBoundingBox, Render render)
213 178 {
214   - CallbackProxyClient.eventBroker.onRenderEntity(e.getSource(), entity, xPos, yPos, zPos, yaw, partialTicks, render);
  179 + CallbackProxyClient.clientEventBroker.onRenderEntity(e.getSource(), entity, xPos, yPos, zPos, yaw, partialTicks, render);
215 180 }
216 181  
217 182 public static void onPostRenderEntity(ReturnEventInfo<RenderManager, Boolean> e, Entity entity, double xPos, double yPos, double zPos, float yaw, float partialTicks, boolean hideBoundingBox, Render render)
218 183 {
219   - CallbackProxyClient.eventBroker.onPostRenderEntity(e.getSource(), entity, xPos, yPos, zPos, yaw, partialTicks, render);
220   - }
221   -
222   - public static void onServerTick(EventInfo<MinecraftServer> e)
223   - {
224   - CallbackProxyClient.eventBroker.onServerTick(e.getSource());
225   - }
226   -
227   - public static void onPlaceBlock(EventInfo<NetHandlerPlayServer> e, C08PacketPlayerBlockPlacement packet)
228   - {
229   - NetHandlerPlayServer netHandler = e.getSource();
230   -
231   - EntityPlayerMP playerMP = netHandler.playerEntity;
232   - BlockPos pos = packet.getPosition();
233   - EnumFacing facing = EnumFacing.getFront(packet.getPlacedBlockDirection());
234   - if (!CallbackProxyClient.eventBroker.onPlayerInteract(InteractType.PLACE_BLOCK_MAYBE, playerMP, pos, facing))
235   - {
236   - S23PacketBlockChange cancellation = new S23PacketBlockChange(playerMP.worldObj, pos.offset(facing));
237   - netHandler.playerEntity.playerNetServerHandler.sendPacket(cancellation);
238   - playerMP.sendContainerToPlayer(playerMP.inventoryContainer);
239   - e.cancel();
240   - }
241   - }
242   -
243   - public static void onClickedAir(EventInfo<NetHandlerPlayServer> e, C0APacketAnimation packet)
244   - {
245   - NetHandlerPlayServer netHandler = e.getSource();
246   - if (!CallbackProxyClient.eventBroker.onPlayerInteract(InteractType.LEFT_CLICK, netHandler.playerEntity, null, EnumFacing.SOUTH))
247   - {
248   - e.cancel();
249   - }
250   - }
251   -
252   - public static void onPlayerDigging(EventInfo<NetHandlerPlayServer> e, C07PacketPlayerDigging packet)
253   - {
254   - if (packet.getStatus() == C07PacketPlayerDigging.Action.START_DESTROY_BLOCK)
255   - {
256   - NetHandlerPlayServer netHandler = e.getSource();
257   - BlockPos pos = packet.func_179715_a();
258   - EntityPlayerMP playerMP = netHandler.playerEntity;
259   - if (!CallbackProxyClient.eventBroker.onPlayerInteract(InteractType.DIG_BLOCK_MAYBE, playerMP, pos, EnumFacing.SOUTH))
260   - {
261   - S23PacketBlockChange cancellation = new S23PacketBlockChange(playerMP.worldObj, pos);
262   - netHandler.playerEntity.playerNetServerHandler.sendPacket(cancellation);
263   - e.cancel();
264   - }
265   - }
266   - }
267   -
268   - public static void onUseItem(ReturnEventInfo<ItemInWorldManager, Boolean> e, EntityPlayer player, World world, ItemStack itemStack, BlockPos pos, EnumFacing side, float par8, float par9, float par10)
269   - {
270   - if (player instanceof EntityPlayerMP)
271   - {
272   - EntityPlayerMP playerMP = (EntityPlayerMP)player;
273   -
274   - if (!CallbackProxyClient.eventBroker.onPlayerInteract(InteractType.PLACE_BLOCK_MAYBE, playerMP, pos, side))
275   - {
276   - System.err.println(pos);
277   - S23PacketBlockChange cancellation = new S23PacketBlockChange(playerMP.worldObj, pos);
278   - playerMP.playerNetServerHandler.sendPacket(cancellation);
279   - e.setReturnValue(false);
280   - }
281   - }
282   - }
283   -
284   - public static void onBlockClicked(EventInfo<ItemInWorldManager> e, BlockPos pos, EnumFacing side)
285   - {
286   - ItemInWorldManager manager = e.getSource();
287   -
288   - if (!CallbackProxyClient.eventBroker.onPlayerInteract(InteractType.LEFT_CLICK_BLOCK, manager.thisPlayerMP, pos, side))
289   - {
290   - S23PacketBlockChange cancellation = new S23PacketBlockChange(manager.theWorld, pos);
291   - manager.thisPlayerMP.playerNetServerHandler.sendPacket(cancellation);
292   - e.cancel();
293   - }
  184 + CallbackProxyClient.clientEventBroker.onPostRenderEntity(e.getSource(), entity, xPos, yPos, zPos, yaw, partialTicks, render);
294 185 }
295 186  
296 187 /**
... ...
java/common/com/mumfrey/liteloader/PlayerInteractionListener.java
... ... @@ -44,7 +44,7 @@ public interface PlayerInteractionListener extends LiteMod
44 44 * @param button Mouse button that was pressed (left = dig, right = interact/place)
45 45 * @param hitPos Block which was *hit*. Note that block placement will normally be at hitPos.offset(sideHit)
46 46 * @param sideHit Side of the block which was hit
47   - * @return
  47 + * @return true to allow the action to be processed (another listener may still inhibit the action), return false to cancel the action (other listeners will still be notified)
48 48 */
49 49 public abstract boolean onPlayerClickedBlock(EntityPlayerMP player, MouseButton button, BlockPos hitPos, EnumFacing sideHit);
50 50 }
... ...
java/common/com/mumfrey/liteloader/PlayerMoveListener.java 0 → 100644
  1 +package com.mumfrey.liteloader;
  2 +
  3 +import net.minecraft.entity.player.EntityPlayerMP;
  4 +
  5 +import com.mumfrey.liteloader.core.LiteLoaderEventBroker.ReturnValue;
  6 +import com.mumfrey.liteloader.util.Position;
  7 +
  8 +/**
  9 + * Interface for mods which want to monitor or control player movements
  10 + *
  11 + * @author Adam Mummery-Smith
  12 + */
  13 +public interface PlayerMoveListener extends LiteMod
  14 +{
  15 + /**
  16 + * Called when a movement/look packet is received from the client.
  17 + *
  18 + * @param playerMP Player moving
  19 + * @param from Player's previous recorded position
  20 + * @param to Position the player is attempting to move to
  21 + * @param newPos Set this position to teleport the player to newPos instead of processing the original move
  22 + *
  23 + * @return false to cancel the event or true to allow the movement to be processed as normal or newPos to be applied
  24 + */
  25 + public abstract boolean onPlayerMove(EntityPlayerMP playerMP, Position from, Position to, ReturnValue<Position> newPos);
  26 +}
... ...
java/common/com/mumfrey/liteloader/common/GameEngine.java
... ... @@ -50,7 +50,7 @@ public interface GameEngine&lt;TClient, TServer extends MinecraftServer&gt;
50 50 public abstract TServer getServer();
51 51  
52 52 /**
53   - * @return
  53 + * Get the resources manager
54 54 */
55 55 public abstract Resources<?, ?> getResources();
56 56  
... ...
java/common/com/mumfrey/liteloader/common/transformers/LiteLoaderEventTransformer.java
... ... @@ -3,11 +3,14 @@ package com.mumfrey.liteloader.common.transformers;
3 3 import static com.mumfrey.liteloader.core.runtime.Methods.*;
4 4 import static com.mumfrey.liteloader.transformers.event.InjectionPoint.*;
5 5  
  6 +import org.objectweb.asm.Opcodes;
  7 +
6 8 import com.mumfrey.liteloader.core.runtime.Obf;
7 9 import com.mumfrey.liteloader.transformers.event.Event;
8 10 import com.mumfrey.liteloader.transformers.event.EventInjectionTransformer;
9 11 import com.mumfrey.liteloader.transformers.event.InjectionPoint;
10 12 import com.mumfrey.liteloader.transformers.event.MethodInfo;
  13 +import com.mumfrey.liteloader.transformers.event.inject.BeforeFieldAccess;
11 14 import com.mumfrey.liteloader.transformers.event.inject.BeforeInvoke;
12 15 import com.mumfrey.liteloader.transformers.event.inject.BeforeNew;
13 16 import com.mumfrey.liteloader.transformers.event.inject.BeforeReturn;
... ... @@ -25,7 +28,7 @@ public abstract class LiteLoaderEventTransformer extends EventInjectionTransform
25 28 @Override
26 29 protected void addEvents()
27 30 {
28   - // Event declaraions
  31 + // Event declarations
29 32 Event onInitializePlayerConnection = Event.getOrCreate("onInitializePlayerConnection", false);
30 33 Event onPlayerLogin = Event.getOrCreate("onPlayerLogin", false);
31 34 Event onPlayerLogout = Event.getOrCreate("onPlayerLogout", false);
... ... @@ -38,12 +41,14 @@ public abstract class LiteLoaderEventTransformer extends EventInjectionTransform
38 41 Event onPlaceBlock = Event.getOrCreate("onPlaceBlock", true);
39 42 Event onClickedAir = Event.getOrCreate("onClickedAir", true);
40 43 Event onSessionProfileBad = Event.getOrCreate("onSessionProfileBad", true);
  44 + Event onPlayerMoved = Event.getOrCreate("onPlayerMoved", true);
41 45  
42 46 // Injection Points
43 47 InjectionPoint methodHead = new MethodHead();
44 48 InjectionPoint methodReturn = new BeforeReturn();
45 49 InjectionPoint beforeNewGameProfile = new BeforeNew(1, Obf.GameProfile);
46 50 InjectionPoint beforeThreadMarshall = new BeforeInvoke(checkThreadAndEnqueue);
  51 + InjectionPoint beforeGetPosY = new BeforeFieldAccess(Opcodes.GETFIELD, Obf.entityPosY, Obf.EntityPlayerMP, 4).setCaptureLocals(true);
47 52  
48 53 // Hooks
49 54 this.add(onInitializePlayerConnection, initPlayerConnection, (methodReturn), "onInitializePlayerConnection");
... ... @@ -57,9 +62,10 @@ public abstract class LiteLoaderEventTransformer extends EventInjectionTransform
57 62 this.add(onPlaceBlock, processBlockPlacement, after(beforeThreadMarshall) , "onPlaceBlock");
58 63 this.add(onClickedAir, handleAnimation, after(beforeThreadMarshall), "onClickedAir");
59 64 this.add(onPlayerDigging, processPlayerDigging, after(beforeThreadMarshall), "onPlayerDigging");
  65 + this.add(onPlayerMoved, processPlayer, (beforeGetPosY), "onPlayerMoved");
60 66  
61 67 // Compatibility handlers
62   - this.add(onSessionProfileBad, getProfile, (beforeNewGameProfile), "generateOfflineUUID");
  68 + this.add(onSessionProfileBad, getProfile, (beforeNewGameProfile), "generateOfflineUUID");
63 69 }
64 70  
65 71 protected final Event add(Event event, MethodInfo targetMethod, InjectionPoint injectionPoint, String callback)
... ...
java/common/com/mumfrey/liteloader/core/CallbackProxyCommon.java 0 → 100644
  1 +package com.mumfrey.liteloader.core;
  2 +
  3 +import net.minecraft.entity.player.EntityPlayer;
  4 +import net.minecraft.entity.player.EntityPlayerMP;
  5 +import net.minecraft.item.ItemStack;
  6 +import net.minecraft.network.NetHandlerPlayServer;
  7 +import net.minecraft.network.NetworkManager;
  8 +import net.minecraft.network.play.client.C03PacketPlayer;
  9 +import net.minecraft.network.play.client.C07PacketPlayerDigging;
  10 +import net.minecraft.network.play.client.C08PacketPlayerBlockPlacement;
  11 +import net.minecraft.network.play.client.C0APacketAnimation;
  12 +import net.minecraft.server.MinecraftServer;
  13 +import net.minecraft.server.management.ItemInWorldManager;
  14 +import net.minecraft.server.management.ServerConfigurationManager;
  15 +import net.minecraft.util.BlockPos;
  16 +import net.minecraft.util.EnumFacing;
  17 +import net.minecraft.world.World;
  18 +import net.minecraft.world.WorldServer;
  19 +
  20 +import com.mojang.authlib.GameProfile;
  21 +import com.mumfrey.liteloader.transformers.event.EventInfo;
  22 +import com.mumfrey.liteloader.transformers.event.ReturnEventInfo;
  23 +
  24 +public abstract class CallbackProxyCommon
  25 +{
  26 + private static LiteLoaderEventBroker<?, ?> eventBroker;
  27 +
  28 + protected CallbackProxyCommon() {}
  29 +
  30 + protected static void onStartupComplete()
  31 + {
  32 + CallbackProxyCommon.eventBroker = LiteLoaderEventBroker.broker;
  33 +
  34 + if (CallbackProxyCommon.eventBroker == null)
  35 + {
  36 + throw new RuntimeException("LiteLoader failed to start up properly. The game is in an unstable state and must shut down now. Check the developer log for startup errors");
  37 + }
  38 + }
  39 +
  40 + public static void onInitializePlayerConnection(EventInfo<ServerConfigurationManager> e, NetworkManager netManager, EntityPlayerMP player)
  41 + {
  42 + CallbackProxyCommon.eventBroker.onInitializePlayerConnection(e.getSource(), netManager, player);
  43 + }
  44 +
  45 + public static void onPlayerLogin(EventInfo<ServerConfigurationManager> e, EntityPlayerMP player)
  46 + {
  47 + CallbackProxyCommon.eventBroker.onPlayerLogin(e.getSource(), player);
  48 + }
  49 +
  50 + public static void onPlayerLogout(EventInfo<ServerConfigurationManager> e, EntityPlayerMP player)
  51 + {
  52 + CallbackProxyCommon.eventBroker.onPlayerLogout(e.getSource(), player);
  53 + }
  54 +
  55 + public static void onSpawnPlayer(ReturnEventInfo<ServerConfigurationManager, EntityPlayerMP> e, GameProfile profile)
  56 + {
  57 + CallbackProxyCommon.eventBroker.onSpawnPlayer(e.getSource(), e.getReturnValue(), profile);
  58 + }
  59 +
  60 + public static void onRespawnPlayer(ReturnEventInfo<ServerConfigurationManager, EntityPlayerMP> e, EntityPlayerMP oldPlayer, int dimension, boolean won)
  61 + {
  62 + CallbackProxyCommon.eventBroker.onRespawnPlayer(e.getSource(), e.getReturnValue(), oldPlayer, dimension, won);
  63 + }
  64 +
  65 + public static void onServerTick(EventInfo<MinecraftServer> e)
  66 + {
  67 + CallbackProxyCommon.eventBroker.onServerTick(e.getSource());
  68 + }
  69 +
  70 + public static void onPlaceBlock(EventInfo<NetHandlerPlayServer> e, C08PacketPlayerBlockPlacement packet)
  71 + {
  72 + NetHandlerPlayServer netHandler = e.getSource();
  73 + if (!CallbackProxyCommon.eventBroker.onPlaceBlock(netHandler, netHandler.playerEntity, packet.getPosition(), EnumFacing.getFront(packet.getPlacedBlockDirection())))
  74 + {
  75 + e.cancel();
  76 + }
  77 + }
  78 +
  79 + public static void onClickedAir(EventInfo<NetHandlerPlayServer> e, C0APacketAnimation packet)
  80 + {
  81 + if (!CallbackProxyCommon.eventBroker.onClickedAir(e.getSource()))
  82 + {
  83 + e.cancel();
  84 + }
  85 + }
  86 +
  87 + public static void onPlayerDigging(EventInfo<NetHandlerPlayServer> e, C07PacketPlayerDigging packet)
  88 + {
  89 + if (packet.getStatus() == C07PacketPlayerDigging.Action.START_DESTROY_BLOCK)
  90 + {
  91 + NetHandlerPlayServer netHandler = e.getSource();
  92 + if (!CallbackProxyCommon.eventBroker.onPlayerDigging(netHandler, packet.func_179715_a(), netHandler.playerEntity))
  93 + {
  94 + e.cancel();
  95 + }
  96 + }
  97 + }
  98 +
  99 + public static void onUseItem(ReturnEventInfo<ItemInWorldManager, Boolean> e, EntityPlayer player, World world, ItemStack itemStack, BlockPos pos, EnumFacing side, float par8, float par9, float par10)
  100 + {
  101 + if (!(player instanceof EntityPlayerMP))
  102 + {
  103 + return;
  104 + }
  105 +
  106 + if (!CallbackProxyCommon.eventBroker.onUseItem(pos, side, (EntityPlayerMP)player))
  107 + {
  108 + e.setReturnValue(false);
  109 + }
  110 + }
  111 +
  112 + public static void onBlockClicked(EventInfo<ItemInWorldManager> e, BlockPos pos, EnumFacing side)
  113 + {
  114 + ItemInWorldManager manager = e.getSource();
  115 +
  116 + if (!CallbackProxyCommon.eventBroker.onBlockClicked(pos, side, manager))
  117 + {
  118 + e.cancel();
  119 + }
  120 + }
  121 +
  122 + public static void onPlayerMoved(EventInfo<NetHandlerPlayServer> e, C03PacketPlayer packet, WorldServer world, double oldPosX, double oldPosY, double oldPosZ)
  123 + {
  124 + NetHandlerPlayServer netHandler = e.getSource();
  125 + if (!CallbackProxyCommon.eventBroker.onPlayerMove(netHandler, packet, netHandler.playerEntity, world))
  126 + {
  127 + e.cancel();
  128 + }
  129 + }
  130 +
  131 + public static void onPlayerMoved(EventInfo<NetHandlerPlayServer> e, C03PacketPlayer packet, WorldServer world, double oldPosX, double oldPosY, double oldPosZ, double deltaMoveSq, double deltaX, double deltaY, double deltaZ)
  132 + {
  133 + NetHandlerPlayServer netHandler = e.getSource();
  134 + if (!CallbackProxyCommon.eventBroker.onPlayerMove(netHandler, packet, netHandler.playerEntity, world))
  135 + {
  136 + e.cancel();
  137 + }
  138 + }
  139 +}
... ...
java/common/com/mumfrey/liteloader/core/LiteLoaderEventBroker.java
1 1 package com.mumfrey.liteloader.core;
2 2  
  3 +import java.util.Collections;
3 4 import java.util.HashMap;
4 5 import java.util.Map;
5 6 import java.util.UUID;
... ... @@ -7,21 +8,28 @@ import java.util.UUID;
7 8 import net.minecraft.command.ICommandManager;
8 9 import net.minecraft.command.ServerCommandManager;
9 10 import net.minecraft.entity.player.EntityPlayerMP;
  11 +import net.minecraft.network.NetHandlerPlayServer;
10 12 import net.minecraft.network.NetworkManager;
  13 +import net.minecraft.network.play.client.C03PacketPlayer;
11 14 import net.minecraft.network.play.client.C15PacketClientSettings;
  15 +import net.minecraft.network.play.server.S08PacketPlayerPosLook;
  16 +import net.minecraft.network.play.server.S23PacketBlockChange;
12 17 import net.minecraft.profiler.Profiler;
13 18 import net.minecraft.server.MinecraftServer;
  19 +import net.minecraft.server.management.ItemInWorldManager;
14 20 import net.minecraft.server.management.ServerConfigurationManager;
15 21 import net.minecraft.util.BlockPos;
16 22 import net.minecraft.util.EnumFacing;
17 23 import net.minecraft.util.MovingObjectPosition.MovingObjectType;
18 24 import net.minecraft.world.World;
  25 +import net.minecraft.world.WorldServer;
19 26 import net.minecraft.world.WorldSettings;
20 27  
21 28 import com.mojang.authlib.GameProfile;
22 29 import com.mumfrey.liteloader.LiteMod;
23 30 import com.mumfrey.liteloader.PlayerInteractionListener;
24 31 import com.mumfrey.liteloader.PlayerInteractionListener.MouseButton;
  32 +import com.mumfrey.liteloader.PlayerMoveListener;
25 33 import com.mumfrey.liteloader.PluginChannelListener;
26 34 import com.mumfrey.liteloader.ServerCommandProvider;
27 35 import com.mumfrey.liteloader.ServerPlayerListener;
... ... @@ -35,6 +43,7 @@ import com.mumfrey.liteloader.core.event.HandlerList.ReturnLogicOp;
35 43 import com.mumfrey.liteloader.interfaces.FastIterable;
36 44 import com.mumfrey.liteloader.interfaces.FastIterableDeque;
37 45 import com.mumfrey.liteloader.launch.LoaderProperties;
  46 +import com.mumfrey.liteloader.util.Position;
38 47 import com.mumfrey.liteloader.util.PrivateFields;
39 48 import com.mumfrey.liteloader.util.log.LiteLoaderLogger;
40 49  
... ... @@ -132,6 +141,11 @@ public abstract class LiteLoaderEventBroker&lt;TClient, TServer extends MinecraftSe
132 141 private FastIterable<PlayerInteractionListener> playerInteractionListeners = new HandlerList<PlayerInteractionListener>(PlayerInteractionListener.class, ReturnLogicOp.AND);
133 142  
134 143 /**
  144 + * List of mods which handle player movement events
  145 + */
  146 + private FastIterable<PlayerMoveListener> playerMoveListeners = new HandlerList<PlayerMoveListener>(PlayerMoveListener.class, ReturnLogicOp.AND_BREAK_ON_FALSE);
  147 +
  148 + /**
135 149 * ctor
136 150 *
137 151 * @param loader
... ... @@ -187,6 +201,7 @@ public abstract class LiteLoaderEventBroker&lt;TClient, TServer extends MinecraftSe
187 201 delegate.registerInterface(ServerCommandProvider.class);
188 202 delegate.registerInterface(ServerPlayerListener.class);
189 203 delegate.registerInterface(PlayerInteractionListener.class);
  204 + delegate.registerInterface(PlayerMoveListener.class);
190 205 delegate.registerInterface(CommonPluginChannelListener.class);
191 206 }
192 207  
... ... @@ -226,6 +241,14 @@ public abstract class LiteLoaderEventBroker&lt;TClient, TServer extends MinecraftSe
226 241 {
227 242 this.playerInteractionListeners.add(playerInteractionListener);
228 243 }
  244 +
  245 + /**
  246 + * @param playerMoveListener
  247 + */
  248 + public void addPlayerMoveListener(PlayerMoveListener playerMoveListener)
  249 + {
  250 + this.playerMoveListeners.add(playerMoveListener);
  251 + }
229 252  
230 253 /**
231 254 * @param instance
... ... @@ -331,6 +354,60 @@ public abstract class LiteLoaderEventBroker&lt;TClient, TServer extends MinecraftSe
331 354 this.playerStateList.all().onTick();
332 355 }
333 356  
  357 + public boolean onPlaceBlock(NetHandlerPlayServer netHandler, EntityPlayerMP playerMP, BlockPos pos, EnumFacing facing)
  358 + {
  359 + if (!this.onPlayerInteract(InteractType.PLACE_BLOCK_MAYBE, playerMP, pos, facing))
  360 + {
  361 + S23PacketBlockChange cancellation = new S23PacketBlockChange(playerMP.worldObj, pos.offset(facing));
  362 + netHandler.playerEntity.playerNetServerHandler.sendPacket(cancellation);
  363 + playerMP.sendContainerToPlayer(playerMP.inventoryContainer);
  364 + return false;
  365 + }
  366 +
  367 + return true;
  368 + }
  369 +
  370 + public boolean onClickedAir(NetHandlerPlayServer netHandler)
  371 + {
  372 + return this.onPlayerInteract(InteractType.LEFT_CLICK, netHandler.playerEntity, null, EnumFacing.SOUTH);
  373 + }
  374 +
  375 + public boolean onPlayerDigging(NetHandlerPlayServer netHandler, BlockPos pos, EntityPlayerMP playerMP)
  376 + {
  377 + if (!this.onPlayerInteract(InteractType.DIG_BLOCK_MAYBE, playerMP, pos, EnumFacing.SOUTH))
  378 + {
  379 + S23PacketBlockChange cancellation = new S23PacketBlockChange(playerMP.worldObj, pos);
  380 + netHandler.playerEntity.playerNetServerHandler.sendPacket(cancellation);
  381 + return false;
  382 + }
  383 +
  384 + return true;
  385 + }
  386 +
  387 + public boolean onUseItem(BlockPos pos, EnumFacing side, EntityPlayerMP playerMP)
  388 + {
  389 + if (!this.onPlayerInteract(InteractType.PLACE_BLOCK_MAYBE, playerMP, pos, side))
  390 + {
  391 + S23PacketBlockChange cancellation = new S23PacketBlockChange(playerMP.worldObj, pos);
  392 + playerMP.playerNetServerHandler.sendPacket(cancellation);
  393 + return false;
  394 + }
  395 +
  396 + return true;
  397 + }
  398 +
  399 + public boolean onBlockClicked(BlockPos pos, EnumFacing side, ItemInWorldManager manager)
  400 + {
  401 + if (!this.onPlayerInteract(InteractType.LEFT_CLICK_BLOCK, manager.thisPlayerMP, pos, side))
  402 + {
  403 + S23PacketBlockChange cancellation = new S23PacketBlockChange(manager.theWorld, pos);
  404 + manager.thisPlayerMP.playerNetServerHandler.sendPacket(cancellation);
  405 + return false;
  406 + }
  407 +
  408 + return true;
  409 + }
  410 +
334 411 public boolean onPlayerInteract(InteractType action, EntityPlayerMP player, BlockPos position, EnumFacing side)
335 412 {
336 413 PlayerEventState eventState = this.getPlayerState(player);
... ... @@ -346,7 +423,50 @@ public abstract class LiteLoaderEventBroker&lt;TClient, TServer extends MinecraftSe
346 423 {
347 424 return this.playerInteractionListeners.all().onPlayerClickedBlock(player, button, hitPos, sideHit);
348 425 }
349   -
  426 +
  427 + public boolean onPlayerMove(NetHandlerPlayServer netHandler, C03PacketPlayer packet, EntityPlayerMP playerMP, WorldServer world)
  428 + {
  429 + Position from = new Position(playerMP, true);
  430 +
  431 + double toX = playerMP.posX;
  432 + double toY = playerMP.posY;
  433 + double toZ = playerMP.posZ;
  434 + float toYaw = playerMP.rotationYaw;
  435 + float toPitch = playerMP.rotationPitch;
  436 +
  437 + if (packet.isMoving())
  438 + {
  439 + toX = packet.getPositionX();
  440 + toY = packet.getPositionY();
  441 + toZ = packet.getPositionZ();
  442 + }
  443 +
  444 + if (packet.getRotating())
  445 + {
  446 + toYaw = packet.getYaw();
  447 + toPitch = packet.getPitch();
  448 + }
  449 +
  450 + Position to = new Position(toX, toY, toZ, toYaw, toPitch);
  451 + ReturnValue<Position> pos = new ReturnValue<Position>(to);
  452 +
  453 + if (!this.playerMoveListeners.all().onPlayerMove(playerMP, from, to, pos))
  454 + {
  455 + playerMP.setPositionAndRotation(from.xCoord, from.yCoord, from.zCoord, playerMP.prevRotationYaw, playerMP.prevRotationPitch);
  456 + playerMP.playerNetServerHandler.sendPacket(new S08PacketPlayerPosLook(from.xCoord, from.yCoord, from.zCoord, playerMP.prevRotationYaw, playerMP.prevRotationPitch, Collections.emptySet()));
  457 + return false;
  458 + }
  459 +
  460 + if (pos.isSet())
  461 + {
  462 + Position newPos = pos.get();
  463 + netHandler.setPlayerLocation(newPos.xCoord, newPos.yCoord, newPos.zCoord, newPos.yaw, newPos.pitch);
  464 + return false;
  465 + }
  466 +
  467 + return true;
  468 + }
  469 +
350 470 void onPlayerSettingsReceived(EntityPlayerMP player, C15PacketClientSettings packet)
351 471 {
352 472 this.getPlayerState(player).setTraceDistance(PrivateFields.viewDistance.get(packet));
... ...
java/common/com/mumfrey/liteloader/core/runtime/Methods.java
... ... @@ -49,6 +49,7 @@ public abstract class Methods
49 49 public static final MethodInfo processPlayerDigging = new MethodInfo(Obf.NetHandlerPlayServer, Obf.processPlayerDigging, Void.TYPE, Packets.C07PacketPlayerDigging);
50 50 public static final MethodInfo serverJobs = new MethodInfo(Obf.MinecraftServer, Obf.updateTimeLightAndEntities, Void.TYPE);
51 51 public static final MethodInfo checkThreadAndEnqueue = new MethodInfo(Obf.PacketThreadUtil, Obf.checkThreadAndEnqueue);
  52 + public static final MethodInfo processPlayer = new MethodInfo(Obf.NetHandlerPlayServer, Obf.processPlayer, Void.TYPE, Packets.C03PacketPlayer);
52 53  
53 54 // Profiler
54 55 public static final MethodInfo startSection = new MethodInfo(Obf.Profiler, Obf.startSection, Void.TYPE, String.class);
... ...
java/common/com/mumfrey/liteloader/transformers/event/EventTransformer.java
1 1 package com.mumfrey.liteloader.transformers.event;
2 2  
  3 +import java.io.File;
  4 +import java.io.IOException;
3 5 import java.util.ArrayList;
4 6 import java.util.Collection;
5 7 import java.util.HashMap;
... ... @@ -9,6 +11,8 @@ import java.util.Map.Entry;
9 11 import java.util.Set;
10 12 import java.util.TreeSet;
11 13  
  14 +import org.apache.commons.io.FileUtils;
  15 +import org.apache.logging.log4j.core.helpers.Booleans;
12 16 import org.objectweb.asm.ClassWriter;
13 17 import org.objectweb.asm.Type;
14 18 import org.objectweb.asm.tree.AbstractInsnNode;
... ... @@ -17,6 +21,7 @@ import org.objectweb.asm.tree.LocalVariableNode;
17 21 import org.objectweb.asm.tree.MethodNode;
18 22 import org.objectweb.asm.util.CheckClassAdapter;
19 23  
  24 +import com.mumfrey.liteloader.core.runtime.Obf;
20 25 import com.mumfrey.liteloader.transformers.ByteCodeUtilities;
21 26 import com.mumfrey.liteloader.transformers.ClassTransformer;
22 27 import com.mumfrey.liteloader.transformers.ObfProvider;
... ... @@ -52,6 +57,10 @@ import com.mumfrey.liteloader.util.log.LiteLoaderLogger;
52 57 */
53 58 public final class EventTransformer extends ClassTransformer
54 59 {
  60 + public static final boolean DUMP = Booleans.parseBoolean(System.getProperty("liteloader.debug.dump"), false);
  61 +
  62 + public static final boolean VALIDATE = Booleans.parseBoolean(System.getProperty("liteloader.debug.validate"), false);
  63 +
55 64 /**
56 65 * Multidimensional map of class names -> target method signatures -> events to inject
57 66 */
... ... @@ -59,11 +68,6 @@ public final class EventTransformer extends ClassTransformer
59 68  
60 69 private static AccessorTransformer accessorTransformer;
61 70  
62   - /**
63   - * Runs the validator on the generated classes, only for debugging purposes
64   - */
65   - private final boolean runValidator = false;
66   -
67 71 private int globalEventID = 0;
68 72  
69 73 static class Injection
... ... @@ -246,13 +250,24 @@ public final class EventTransformer extends ClassTransformer
246 250 EventTransformer.accessorTransformer.apply(name, transformedName, basicClass, classNode);
247 251 }
248 252  
249   - if (this.runValidator)
  253 + if (EventTransformer.VALIDATE)
250 254 {
251 255 ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
252 256 classNode.accept(new CheckClassAdapter(writer));
253 257 }
254 258  
255   - return this.writeClass(classNode);
  259 + byte[] bytes = this.writeClass(classNode);
  260 +
  261 + if (EventTransformer.DUMP)
  262 + {
  263 + try
  264 + {
  265 + FileUtils.writeByteArrayToFile(new File(".classes" + Obf.lookupMCPName(transformedName).replace('.', '/') + ".class"), bytes);
  266 + }
  267 + catch (IOException ex) {}
  268 + }
  269 +
  270 + return bytes;
256 271 }
257 272  
258 273 /**
... ...
java/common/com/mumfrey/liteloader/util/Position.java 0 → 100644
  1 +package com.mumfrey.liteloader.util;
  2 +
  3 +import net.minecraft.entity.Entity;
  4 +import net.minecraft.util.Vec3;
  5 +
  6 +/**
  7 + * A 3D vector position with rotation as well
  8 + *
  9 + * @author Adam Mummery-Smith
  10 + */
  11 +public class Position extends Vec3
  12 +{
  13 + public final float yaw;
  14 +
  15 + public final float pitch;
  16 +
  17 + public Position(double x, double y, double z)
  18 + {
  19 + this(x, y, z, 0.0F, 0.0F);
  20 + }
  21 +
  22 + public Position(double x, double y, double z, float yaw, float pitch)
  23 + {
  24 + super(x, y, z);
  25 +
  26 + this.yaw = yaw;
  27 + this.pitch = pitch;
  28 + }
  29 +
  30 + public Position(Entity entity)
  31 + {
  32 + this(entity.posX, entity.posY, entity.posZ, entity.rotationYaw, entity.rotationPitch);
  33 + }
  34 +
  35 + public Position(Entity entity, boolean usePrevious)
  36 + {
  37 + this(usePrevious ? entity.prevPosX : entity.posX, usePrevious ? entity.prevPosY : entity.posY, usePrevious ? entity.prevPosZ : entity.posZ, usePrevious ? entity.prevRotationYaw : entity.rotationYaw, usePrevious ? entity.prevRotationPitch : entity.rotationPitch);
  38 + }
  39 +
  40 + public void applyTo(Entity entity)
  41 + {
  42 + entity.posX = this.xCoord;
  43 + entity.posY = this.yCoord;
  44 + entity.posZ = this.zCoord;
  45 + entity.rotationYaw = this.yaw;
  46 + entity.rotationPitch = this.pitch;
  47 + }
  48 +
  49 + @Override
  50 + public String toString()
  51 + {
  52 + return "(" + this.xCoord + ", " + this.yCoord + ", " + this.zCoord + ", " + this.yaw + ", " + this.pitch + ")";
  53 + }
  54 +}
... ...
java/common/com/mumfrey/liteloader/util/PrivateFields.java
... ... @@ -37,7 +37,7 @@ public class PrivateFields&lt;P, T&gt;
37 37 protected PrivateFields(Class<P> owner, Obf obf)
38 38 {
39 39 this.parentClass = owner;
40   - this.fieldName = Obf.getObfuscatedFieldName(obf);
  40 + this.fieldName = ObfuscationUtilities.getObfuscatedFieldName(obf);
41 41 }
42 42  
43 43 /**
... ...