Commit f709bce873f6962328d398e1b91aa323210efc18
1 parent
1dd64987
adding PlayerInteractionListener
Showing
11 changed files
with
452 additions
and
13 deletions
.classpath
@@ -18,7 +18,7 @@ | @@ -18,7 +18,7 @@ | ||
18 | <classpathentry exported="true" kind="lib" path="/Client/jars/libraries/net/java/jinput/jinput/2.0.5/jinput-2.0.5.jar"/> | 18 | <classpathentry exported="true" kind="lib" path="/Client/jars/libraries/net/java/jinput/jinput/2.0.5/jinput-2.0.5.jar"/> |
19 | <classpathentry exported="true" kind="lib" path="/Client/jars/libraries/com/mojang/authlib/1.5.17/authlib-1.5.17.jar"/> | 19 | <classpathentry exported="true" kind="lib" path="/Client/jars/libraries/com/mojang/authlib/1.5.17/authlib-1.5.17.jar"/> |
20 | <classpathentry exported="true" kind="lib" path="/Client/jars/libraries/org/lwjgl/lwjgl/lwjgl/2.9.1/lwjgl-2.9.1.jar"/> | 20 | <classpathentry exported="true" kind="lib" path="/Client/jars/libraries/org/lwjgl/lwjgl/lwjgl/2.9.1/lwjgl-2.9.1.jar"/> |
21 | - <classpathentry exported="true" kind="lib" path="lib/asm-debug-all-5.0.3.jar"/> | 21 | + <classpathentry exported="true" kind="lib" path="lib/asm-debug-all-5.0.3.jar" sourcepath="/ASM/src"/> |
22 | <classpathentry exported="true" kind="lib" path="/Client/jars/libraries/org/lwjgl/lwjgl/lwjgl_util/2.9.1/lwjgl_util-2.9.1.jar"/> | 22 | <classpathentry exported="true" kind="lib" path="/Client/jars/libraries/org/lwjgl/lwjgl/lwjgl_util/2.9.1/lwjgl_util-2.9.1.jar"/> |
23 | <classpathentry exported="true" kind="lib" path="/Client/jars/libraries/com/mojang/realms/1.5.5/realms-1.5.5.jar"/> | 23 | <classpathentry exported="true" kind="lib" path="/Client/jars/libraries/com/mojang/realms/1.5.5/realms-1.5.5.jar"/> |
24 | <classpathentry kind="output" path="bin"/> | 24 | <classpathentry kind="output" path="bin"/> |
java/client/com/mumfrey/liteloader/client/CallbackProxyClient.java
@@ -14,15 +14,27 @@ import net.minecraft.client.shader.Framebuffer; | @@ -14,15 +14,27 @@ import net.minecraft.client.shader.Framebuffer; | ||
14 | import net.minecraft.entity.Entity; | 14 | import net.minecraft.entity.Entity; |
15 | import net.minecraft.entity.player.EntityPlayer; | 15 | import net.minecraft.entity.player.EntityPlayer; |
16 | import net.minecraft.entity.player.EntityPlayerMP; | 16 | import net.minecraft.entity.player.EntityPlayerMP; |
17 | +import net.minecraft.item.ItemStack; | ||
18 | +import net.minecraft.network.NetHandlerPlayServer; | ||
17 | import net.minecraft.network.NetworkManager; | 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; | ||
18 | import net.minecraft.server.integrated.IntegratedServer; | 25 | import net.minecraft.server.integrated.IntegratedServer; |
26 | +import net.minecraft.server.management.ItemInWorldManager; | ||
19 | import net.minecraft.server.management.ServerConfigurationManager; | 27 | import net.minecraft.server.management.ServerConfigurationManager; |
28 | +import net.minecraft.util.BlockPos; | ||
29 | +import net.minecraft.util.EnumFacing; | ||
20 | import net.minecraft.util.IChatComponent; | 30 | import net.minecraft.util.IChatComponent; |
21 | import net.minecraft.util.ScreenShotHelper; | 31 | import net.minecraft.util.ScreenShotHelper; |
22 | import net.minecraft.util.Session; | 32 | import net.minecraft.util.Session; |
33 | +import net.minecraft.world.World; | ||
23 | import net.minecraft.world.WorldSettings; | 34 | import net.minecraft.world.WorldSettings; |
24 | 35 | ||
25 | import com.mojang.authlib.GameProfile; | 36 | import com.mojang.authlib.GameProfile; |
37 | +import com.mumfrey.liteloader.core.LiteLoaderEventBroker.InteractType; | ||
26 | import com.mumfrey.liteloader.transformers.event.EventInfo; | 38 | import com.mumfrey.liteloader.transformers.event.EventInfo; |
27 | import com.mumfrey.liteloader.transformers.event.ReturnEventInfo; | 39 | import com.mumfrey.liteloader.transformers.event.ReturnEventInfo; |
28 | 40 | ||
@@ -207,6 +219,80 @@ public class CallbackProxyClient | @@ -207,6 +219,80 @@ public class CallbackProxyClient | ||
207 | CallbackProxyClient.eventBroker.onPostRenderEntity(e.getSource(), entity, xPos, yPos, zPos, yaw, partialTicks, render); | 219 | CallbackProxyClient.eventBroker.onPostRenderEntity(e.getSource(), entity, xPos, yPos, zPos, yaw, partialTicks, render); |
208 | } | 220 | } |
209 | 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 | + } | ||
294 | + } | ||
295 | + | ||
210 | /** | 296 | /** |
211 | * Compatiblbe behaviour with FML, this method is called to generate a consistent offline UUID between client and server | 297 | * Compatiblbe behaviour with FML, this method is called to generate a consistent offline UUID between client and server |
212 | * for a given username. | 298 | * for a given username. |
java/common/com/mumfrey/liteloader/PlayerInteractionListener.java
0 → 100644
1 | +package com.mumfrey.liteloader; | ||
2 | + | ||
3 | +import net.minecraft.entity.player.EntityPlayerMP; | ||
4 | +import net.minecraft.util.BlockPos; | ||
5 | +import net.minecraft.util.EnumFacing; | ||
6 | +import net.minecraft.util.MovingObjectPosition.MovingObjectType; | ||
7 | + | ||
8 | +/** | ||
9 | + * Interface for mods which want to observe the player's "interaction" status (player mouse clicks), allows block interaction | ||
10 | + * events to be cancelled. | ||
11 | + * | ||
12 | + * @author Adam Mummery-Smith | ||
13 | + */ | ||
14 | +public interface PlayerInteractionListener extends LiteMod | ||
15 | +{ | ||
16 | + /** | ||
17 | + * Mouse buttons | ||
18 | + */ | ||
19 | + public static enum MouseButton | ||
20 | + { | ||
21 | + LEFT, | ||
22 | + RIGHT | ||
23 | + } | ||
24 | + | ||
25 | + /** | ||
26 | + * Called when the player clicks but does not "hit" a block, the trace position is raytraced to the player's current view | ||
27 | + * distance and represents the block which the player is "looking at". This method is NOT called when the player right clicks | ||
28 | + * with an empty hand. | ||
29 | + * | ||
30 | + * @param player Player | ||
31 | + * @param button Mouse button the user clicked | ||
32 | + * @param tracePos Raytraced location of the block which was hit | ||
33 | + * @param traceSideHit Raytraced side hit | ||
34 | + * @param traceHitType Type of hit, will be MISS if the trace expired without hitting anything (eg. the player clicked the sky) | ||
35 | + */ | ||
36 | + public abstract void onPlayerClickedAir(EntityPlayerMP player, MouseButton button, BlockPos tracePos, EnumFacing traceSideHit, MovingObjectType traceHitType); | ||
37 | + | ||
38 | + /** | ||
39 | + * Calls when the player clicks and hits a block, usually indicates that the player is digging or placing a block, although | ||
40 | + * a block placement does not necessarily succeed. Return true from this callback to allow the action to proceed, or false to | ||
41 | + * cancel the action. Cancelling the action does not prevent further handlers from receiving the event. | ||
42 | + * | ||
43 | + * @param player Player | ||
44 | + * @param button Mouse button that was pressed (left = dig, right = interact/place) | ||
45 | + * @param hitPos Block which was *hit*. Note that block placement will normally be at hitPos.offset(sideHit) | ||
46 | + * @param sideHit Side of the block which was hit | ||
47 | + * @return | ||
48 | + */ | ||
49 | + public abstract boolean onPlayerClickedBlock(EntityPlayerMP player, MouseButton button, BlockPos hitPos, EnumFacing sideHit); | ||
50 | +} |
java/common/com/mumfrey/liteloader/common/transformers/LiteLoaderEventTransformer.java
1 | package com.mumfrey.liteloader.common.transformers; | 1 | package com.mumfrey.liteloader.common.transformers; |
2 | 2 | ||
3 | import static com.mumfrey.liteloader.core.runtime.Methods.*; | 3 | import static com.mumfrey.liteloader.core.runtime.Methods.*; |
4 | +import static com.mumfrey.liteloader.transformers.event.InjectionPoint.*; | ||
4 | 5 | ||
5 | import com.mumfrey.liteloader.core.runtime.Obf; | 6 | import com.mumfrey.liteloader.core.runtime.Obf; |
6 | import com.mumfrey.liteloader.transformers.event.Event; | 7 | import com.mumfrey.liteloader.transformers.event.Event; |
7 | import com.mumfrey.liteloader.transformers.event.EventInjectionTransformer; | 8 | import com.mumfrey.liteloader.transformers.event.EventInjectionTransformer; |
8 | import com.mumfrey.liteloader.transformers.event.InjectionPoint; | 9 | import com.mumfrey.liteloader.transformers.event.InjectionPoint; |
9 | import com.mumfrey.liteloader.transformers.event.MethodInfo; | 10 | import com.mumfrey.liteloader.transformers.event.MethodInfo; |
11 | +import com.mumfrey.liteloader.transformers.event.inject.BeforeInvoke; | ||
10 | import com.mumfrey.liteloader.transformers.event.inject.BeforeNew; | 12 | import com.mumfrey.liteloader.transformers.event.inject.BeforeNew; |
11 | import com.mumfrey.liteloader.transformers.event.inject.BeforeReturn; | 13 | import com.mumfrey.liteloader.transformers.event.inject.BeforeReturn; |
14 | +import com.mumfrey.liteloader.transformers.event.inject.MethodHead; | ||
12 | 15 | ||
13 | /** | 16 | /** |
14 | * Injector for LiteLoader's common events | 17 | * Injector for LiteLoader's common events |
@@ -28,18 +31,32 @@ public abstract class LiteLoaderEventTransformer extends EventInjectionTransform | @@ -28,18 +31,32 @@ public abstract class LiteLoaderEventTransformer extends EventInjectionTransform | ||
28 | Event onPlayerLogout = Event.getOrCreate("onPlayerLogout", false); | 31 | Event onPlayerLogout = Event.getOrCreate("onPlayerLogout", false); |
29 | Event onSpawnPlayer = Event.getOrCreate("onSpawnPlayer", false); | 32 | Event onSpawnPlayer = Event.getOrCreate("onSpawnPlayer", false); |
30 | Event onRespawnPlayer = Event.getOrCreate("onRespawnPlayer", false); | 33 | Event onRespawnPlayer = Event.getOrCreate("onRespawnPlayer", false); |
34 | + Event onServerTick = Event.getOrCreate("onServerTick", false); | ||
35 | + Event onBlockClickedEvent = Event.getOrCreate("onBlockClicked", true); | ||
36 | + Event onActivateBlockOrUseItem = Event.getOrCreate("onActivateBlockOrUseItem", true); | ||
37 | + Event onPlayerDigging = Event.getOrCreate("onPlayerDigging", true); | ||
38 | + Event onPlaceBlock = Event.getOrCreate("onPlaceBlock", true); | ||
39 | + Event onClickedAir = Event.getOrCreate("onClickedAir", true); | ||
31 | Event onSessionProfileBad = Event.getOrCreate("onSessionProfileBad", true); | 40 | Event onSessionProfileBad = Event.getOrCreate("onSessionProfileBad", true); |
32 | 41 | ||
33 | // Injection Points | 42 | // Injection Points |
43 | + InjectionPoint methodHead = new MethodHead(); | ||
34 | InjectionPoint methodReturn = new BeforeReturn(); | 44 | InjectionPoint methodReturn = new BeforeReturn(); |
35 | InjectionPoint beforeNewGameProfile = new BeforeNew(1, Obf.GameProfile); | 45 | InjectionPoint beforeNewGameProfile = new BeforeNew(1, Obf.GameProfile); |
46 | + InjectionPoint beforeThreadMarshall = new BeforeInvoke(checkThreadAndEnqueue); | ||
36 | 47 | ||
37 | // Hooks | 48 | // Hooks |
38 | - this.add(onInitializePlayerConnection, initPlayerConnection, (methodReturn), "onInitializePlayerConnection"); | ||
39 | - this.add(onPlayerLogin, playerLoggedIn, (methodReturn), "onPlayerLogin"); | ||
40 | - this.add(onPlayerLogout, playerLoggedOut, (methodReturn), "onPlayerLogout"); | ||
41 | - this.add(onSpawnPlayer, spawnPlayer, (methodReturn), "onSpawnPlayer"); | ||
42 | - this.add(onRespawnPlayer, respawnPlayer, (methodReturn), "onRespawnPlayer"); | 49 | + this.add(onInitializePlayerConnection, initPlayerConnection, (methodReturn), "onInitializePlayerConnection"); |
50 | + this.add(onPlayerLogin, playerLoggedIn, (methodReturn), "onPlayerLogin"); | ||
51 | + this.add(onPlayerLogout, playerLoggedOut, (methodReturn), "onPlayerLogout"); | ||
52 | + this.add(onSpawnPlayer, spawnPlayer, (methodReturn), "onSpawnPlayer"); | ||
53 | + this.add(onRespawnPlayer, respawnPlayer, (methodReturn), "onRespawnPlayer"); | ||
54 | + this.add(onServerTick, serverJobs, (methodHead), "onServerTick"); | ||
55 | + this.add(onBlockClickedEvent, onBlockClicked, (methodHead), "onBlockClicked"); | ||
56 | + this.add(onActivateBlockOrUseItem, activateBlockOrUseItem, (methodHead), "onUseItem"); | ||
57 | + this.add(onPlaceBlock, processBlockPlacement, after(beforeThreadMarshall) , "onPlaceBlock"); | ||
58 | + this.add(onClickedAir, handleAnimation, after(beforeThreadMarshall), "onClickedAir"); | ||
59 | + this.add(onPlayerDigging, processPlayerDigging, after(beforeThreadMarshall), "onPlayerDigging"); | ||
43 | 60 | ||
44 | // Compatibility handlers | 61 | // Compatibility handlers |
45 | this.add(onSessionProfileBad, getProfile, (beforeNewGameProfile), "generateOfflineUUID"); | 62 | this.add(onSessionProfileBad, getProfile, (beforeNewGameProfile), "generateOfflineUUID"); |
java/common/com/mumfrey/liteloader/common/transformers/PacketEvent.java
@@ -45,7 +45,7 @@ public class PacketEvent extends Event | @@ -45,7 +45,7 @@ public class PacketEvent extends Event | ||
45 | * @see com.mumfrey.liteloader.transformers.event.Event#invokeEventInfoConstructor(org.objectweb.asm.tree.InsnList, boolean) | 45 | * @see com.mumfrey.liteloader.transformers.event.Event#invokeEventInfoConstructor(org.objectweb.asm.tree.InsnList, boolean) |
46 | */ | 46 | */ |
47 | @Override | 47 | @Override |
48 | - protected int invokeEventInfoConstructor(InsnList insns, boolean cancellable) | 48 | + protected int invokeEventInfoConstructor(InsnList insns, boolean cancellable, boolean pushReturnValue, int marshallVar) |
49 | { | 49 | { |
50 | int ctorMAXS = 0; | 50 | int ctorMAXS = 0; |
51 | 51 |
java/common/com/mumfrey/liteloader/core/IEventState.java
0 → 100644
java/common/com/mumfrey/liteloader/core/LiteLoaderEventBroker.java
1 | package com.mumfrey.liteloader.core; | 1 | package com.mumfrey.liteloader.core; |
2 | 2 | ||
3 | +import java.util.HashMap; | ||
4 | +import java.util.Map; | ||
5 | +import java.util.UUID; | ||
6 | + | ||
3 | import net.minecraft.command.ICommandManager; | 7 | import net.minecraft.command.ICommandManager; |
4 | import net.minecraft.command.ServerCommandManager; | 8 | import net.minecraft.command.ServerCommandManager; |
5 | import net.minecraft.entity.player.EntityPlayerMP; | 9 | import net.minecraft.entity.player.EntityPlayerMP; |
6 | import net.minecraft.network.NetworkManager; | 10 | import net.minecraft.network.NetworkManager; |
11 | +import net.minecraft.network.play.client.C15PacketClientSettings; | ||
7 | import net.minecraft.profiler.Profiler; | 12 | import net.minecraft.profiler.Profiler; |
8 | import net.minecraft.server.MinecraftServer; | 13 | import net.minecraft.server.MinecraftServer; |
9 | import net.minecraft.server.management.ServerConfigurationManager; | 14 | import net.minecraft.server.management.ServerConfigurationManager; |
15 | +import net.minecraft.util.BlockPos; | ||
16 | +import net.minecraft.util.EnumFacing; | ||
17 | +import net.minecraft.util.MovingObjectPosition.MovingObjectType; | ||
10 | import net.minecraft.world.World; | 18 | import net.minecraft.world.World; |
11 | import net.minecraft.world.WorldSettings; | 19 | import net.minecraft.world.WorldSettings; |
12 | 20 | ||
13 | import com.mojang.authlib.GameProfile; | 21 | import com.mojang.authlib.GameProfile; |
14 | import com.mumfrey.liteloader.LiteMod; | 22 | import com.mumfrey.liteloader.LiteMod; |
23 | +import com.mumfrey.liteloader.PlayerInteractionListener; | ||
24 | +import com.mumfrey.liteloader.PlayerInteractionListener.MouseButton; | ||
15 | import com.mumfrey.liteloader.PluginChannelListener; | 25 | import com.mumfrey.liteloader.PluginChannelListener; |
16 | import com.mumfrey.liteloader.ServerCommandProvider; | 26 | import com.mumfrey.liteloader.ServerCommandProvider; |
17 | import com.mumfrey.liteloader.ServerPlayerListener; | 27 | import com.mumfrey.liteloader.ServerPlayerListener; |
@@ -21,8 +31,11 @@ import com.mumfrey.liteloader.api.Listener; | @@ -21,8 +31,11 @@ import com.mumfrey.liteloader.api.Listener; | ||
21 | import com.mumfrey.liteloader.common.GameEngine; | 31 | import com.mumfrey.liteloader.common.GameEngine; |
22 | import com.mumfrey.liteloader.common.LoadingProgress; | 32 | import com.mumfrey.liteloader.common.LoadingProgress; |
23 | import com.mumfrey.liteloader.core.event.HandlerList; | 33 | import com.mumfrey.liteloader.core.event.HandlerList; |
34 | +import com.mumfrey.liteloader.core.event.HandlerList.ReturnLogicOp; | ||
24 | import com.mumfrey.liteloader.interfaces.FastIterable; | 35 | import com.mumfrey.liteloader.interfaces.FastIterable; |
36 | +import com.mumfrey.liteloader.interfaces.FastIterableDeque; | ||
25 | import com.mumfrey.liteloader.launch.LoaderProperties; | 37 | import com.mumfrey.liteloader.launch.LoaderProperties; |
38 | +import com.mumfrey.liteloader.util.PrivateFields; | ||
26 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; | 39 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; |
27 | 40 | ||
28 | /** | 41 | /** |
@@ -69,6 +82,20 @@ public abstract class LiteLoaderEventBroker<TClient, TServer extends MinecraftSe | @@ -69,6 +82,20 @@ public abstract class LiteLoaderEventBroker<TClient, TServer extends MinecraftSe | ||
69 | } | 82 | } |
70 | } | 83 | } |
71 | 84 | ||
85 | + public static enum InteractType | ||
86 | + { | ||
87 | + RIGHT_CLICK, | ||
88 | + LEFT_CLICK, | ||
89 | + LEFT_CLICK_BLOCK, | ||
90 | + PLACE_BLOCK_MAYBE, | ||
91 | + DIG_BLOCK_MAYBE | ||
92 | + } | ||
93 | + | ||
94 | + /** | ||
95 | + * Singleton | ||
96 | + */ | ||
97 | + static LiteLoaderEventBroker<?, ?> broker; | ||
98 | + | ||
72 | /** | 99 | /** |
73 | * Reference to the loader instance | 100 | * Reference to the loader instance |
74 | */ | 101 | */ |
@@ -86,6 +113,9 @@ public abstract class LiteLoaderEventBroker<TClient, TServer extends MinecraftSe | @@ -86,6 +113,9 @@ public abstract class LiteLoaderEventBroker<TClient, TServer extends MinecraftSe | ||
86 | 113 | ||
87 | protected LiteLoaderMods mods; | 114 | protected LiteLoaderMods mods; |
88 | 115 | ||
116 | + private Map<UUID, PlayerEventState> playerStates = new HashMap<UUID, PlayerEventState>(); | ||
117 | + private FastIterableDeque<IEventState> playerStateList = new HandlerList<IEventState>(IEventState.class); | ||
118 | + | ||
89 | /** | 119 | /** |
90 | * List of mods which provide server commands | 120 | * List of mods which provide server commands |
91 | */ | 121 | */ |
@@ -97,6 +127,11 @@ public abstract class LiteLoaderEventBroker<TClient, TServer extends MinecraftSe | @@ -97,6 +127,11 @@ public abstract class LiteLoaderEventBroker<TClient, TServer extends MinecraftSe | ||
97 | private FastIterable<ServerPlayerListener> serverPlayerListeners = new HandlerList<ServerPlayerListener>(ServerPlayerListener.class); | 127 | private FastIterable<ServerPlayerListener> serverPlayerListeners = new HandlerList<ServerPlayerListener>(ServerPlayerListener.class); |
98 | 128 | ||
99 | /** | 129 | /** |
130 | + * List of mods which handle player interaction events | ||
131 | + */ | ||
132 | + private FastIterable<PlayerInteractionListener> playerInteractionListeners = new HandlerList<PlayerInteractionListener>(PlayerInteractionListener.class, ReturnLogicOp.AND); | ||
133 | + | ||
134 | + /** | ||
100 | * ctor | 135 | * ctor |
101 | * | 136 | * |
102 | * @param loader | 137 | * @param loader |
@@ -108,6 +143,8 @@ public abstract class LiteLoaderEventBroker<TClient, TServer extends MinecraftSe | @@ -108,6 +143,8 @@ public abstract class LiteLoaderEventBroker<TClient, TServer extends MinecraftSe | ||
108 | this.loader = loader; | 143 | this.loader = loader; |
109 | this.engine = engine; | 144 | this.engine = engine; |
110 | this.profiler = engine.getProfiler(); | 145 | this.profiler = engine.getProfiler(); |
146 | + | ||
147 | + LiteLoaderEventBroker.broker = this; | ||
111 | } | 148 | } |
112 | 149 | ||
113 | /** | 150 | /** |
@@ -149,6 +186,7 @@ public abstract class LiteLoaderEventBroker<TClient, TServer extends MinecraftSe | @@ -149,6 +186,7 @@ public abstract class LiteLoaderEventBroker<TClient, TServer extends MinecraftSe | ||
149 | { | 186 | { |
150 | delegate.registerInterface(ServerCommandProvider.class); | 187 | delegate.registerInterface(ServerCommandProvider.class); |
151 | delegate.registerInterface(ServerPlayerListener.class); | 188 | delegate.registerInterface(ServerPlayerListener.class); |
189 | + delegate.registerInterface(PlayerInteractionListener.class); | ||
152 | delegate.registerInterface(CommonPluginChannelListener.class); | 190 | delegate.registerInterface(CommonPluginChannelListener.class); |
153 | } | 191 | } |
154 | 192 | ||
@@ -180,6 +218,14 @@ public abstract class LiteLoaderEventBroker<TClient, TServer extends MinecraftSe | @@ -180,6 +218,14 @@ public abstract class LiteLoaderEventBroker<TClient, TServer extends MinecraftSe | ||
180 | { | 218 | { |
181 | this.serverPlayerListeners.add(serverPlayerListener); | 219 | this.serverPlayerListeners.add(serverPlayerListener); |
182 | } | 220 | } |
221 | + | ||
222 | + /** | ||
223 | + * @param playerInteractionListener | ||
224 | + */ | ||
225 | + public void addPlayerInteractionListener(PlayerInteractionListener playerInteractionListener) | ||
226 | + { | ||
227 | + this.playerInteractionListeners.add(playerInteractionListener); | ||
228 | + } | ||
183 | 229 | ||
184 | /** | 230 | /** |
185 | * @param instance | 231 | * @param instance |
@@ -198,6 +244,8 @@ public abstract class LiteLoaderEventBroker<TClient, TServer extends MinecraftSe | @@ -198,6 +244,8 @@ public abstract class LiteLoaderEventBroker<TClient, TServer extends MinecraftSe | ||
198 | } | 244 | } |
199 | 245 | ||
200 | LiteLoader.getServerPluginChannels().onServerStartup(); | 246 | LiteLoader.getServerPluginChannels().onServerStartup(); |
247 | + | ||
248 | + this.playerStates.clear(); | ||
201 | } | 249 | } |
202 | 250 | ||
203 | /** | 251 | /** |
@@ -208,6 +256,8 @@ public abstract class LiteLoaderEventBroker<TClient, TServer extends MinecraftSe | @@ -208,6 +256,8 @@ public abstract class LiteLoaderEventBroker<TClient, TServer extends MinecraftSe | ||
208 | public void onSpawnPlayer(ServerConfigurationManager scm, EntityPlayerMP player, GameProfile profile) | 256 | public void onSpawnPlayer(ServerConfigurationManager scm, EntityPlayerMP player, GameProfile profile) |
209 | { | 257 | { |
210 | this.serverPlayerListeners.all().onPlayerConnect(player, profile); | 258 | this.serverPlayerListeners.all().onPlayerConnect(player, profile); |
259 | + PlayerEventState playerState = this.getPlayerState(player); | ||
260 | + playerState.onSpawned(); | ||
211 | } | 261 | } |
212 | 262 | ||
213 | /** | 263 | /** |
@@ -248,6 +298,7 @@ public abstract class LiteLoaderEventBroker<TClient, TServer extends MinecraftSe | @@ -248,6 +298,7 @@ public abstract class LiteLoaderEventBroker<TClient, TServer extends MinecraftSe | ||
248 | public void onPlayerLogout(ServerConfigurationManager scm, EntityPlayerMP player) | 298 | public void onPlayerLogout(ServerConfigurationManager scm, EntityPlayerMP player) |
249 | { | 299 | { |
250 | this.serverPlayerListeners.all().onPlayerLogout(player); | 300 | this.serverPlayerListeners.all().onPlayerLogout(player); |
301 | + this.removePlayer(player); | ||
251 | } | 302 | } |
252 | 303 | ||
253 | /** | 304 | /** |
@@ -274,4 +325,51 @@ public abstract class LiteLoaderEventBroker<TClient, TServer extends MinecraftSe | @@ -274,4 +325,51 @@ public abstract class LiteLoaderEventBroker<TClient, TServer extends MinecraftSe | ||
274 | { | 325 | { |
275 | this.loader.onWorldChanged(world); | 326 | this.loader.onWorldChanged(world); |
276 | } | 327 | } |
328 | + | ||
329 | + public void onServerTick(MinecraftServer minecraftServer) | ||
330 | + { | ||
331 | + this.playerStateList.all().onTick(); | ||
332 | + } | ||
333 | + | ||
334 | + public boolean onPlayerInteract(InteractType action, EntityPlayerMP player, BlockPos position, EnumFacing side) | ||
335 | + { | ||
336 | + PlayerEventState eventState = this.getPlayerState(player); | ||
337 | + return eventState.onPlayerInteract(action, player, position, side); | ||
338 | + } | ||
339 | + | ||
340 | + void onPlayerClickedAir(EntityPlayerMP player, MouseButton button, BlockPos tracePos, EnumFacing traceSideHit, MovingObjectType traceHitType) | ||
341 | + { | ||
342 | + this.playerInteractionListeners.all().onPlayerClickedAir(player, button, tracePos, traceSideHit, traceHitType); | ||
343 | + } | ||
344 | + | ||
345 | + boolean onPlayerClickedBlock(EntityPlayerMP player, MouseButton button, BlockPos hitPos, EnumFacing sideHit) | ||
346 | + { | ||
347 | + return this.playerInteractionListeners.all().onPlayerClickedBlock(player, button, hitPos, sideHit); | ||
348 | + } | ||
349 | + | ||
350 | + void onPlayerSettingsReceived(EntityPlayerMP player, C15PacketClientSettings packet) | ||
351 | + { | ||
352 | + this.getPlayerState(player).setTraceDistance(PrivateFields.viewDistance.get(packet)); | ||
353 | + } | ||
354 | + | ||
355 | + protected PlayerEventState getPlayerState(EntityPlayerMP player) | ||
356 | + { | ||
357 | + PlayerEventState playerState = this.playerStates.get(player.getUniqueID()); | ||
358 | + if (playerState == null) | ||
359 | + { | ||
360 | + playerState = new PlayerEventState(player, this); | ||
361 | + this.playerStates.put(player.getUniqueID(), playerState); | ||
362 | + this.playerStateList.add(playerState); | ||
363 | + } | ||
364 | + return playerState; | ||
365 | + } | ||
366 | + | ||
367 | + protected void removePlayer(EntityPlayerMP player) | ||
368 | + { | ||
369 | + PlayerEventState playerState = this.playerStates.remove(player.getUniqueID()); | ||
370 | + if (playerState != null) | ||
371 | + { | ||
372 | + this.playerStateList.remove(playerState); | ||
373 | + } | ||
374 | + } | ||
277 | } | 375 | } |
java/common/com/mumfrey/liteloader/core/PacketEvents.java
@@ -8,6 +8,7 @@ import net.minecraft.network.NetHandlerPlayServer; | @@ -8,6 +8,7 @@ import net.minecraft.network.NetHandlerPlayServer; | ||
8 | import net.minecraft.network.Packet; | 8 | import net.minecraft.network.Packet; |
9 | import net.minecraft.network.login.server.S02PacketLoginSuccess; | 9 | import net.minecraft.network.login.server.S02PacketLoginSuccess; |
10 | import net.minecraft.network.play.client.C01PacketChatMessage; | 10 | import net.minecraft.network.play.client.C01PacketChatMessage; |
11 | +import net.minecraft.network.play.client.C15PacketClientSettings; | ||
11 | import net.minecraft.network.play.client.C17PacketCustomPayload; | 12 | import net.minecraft.network.play.client.C17PacketCustomPayload; |
12 | import net.minecraft.network.play.server.S01PacketJoinGame; | 13 | import net.minecraft.network.play.server.S01PacketJoinGame; |
13 | import net.minecraft.network.play.server.S02PacketChat; | 14 | import net.minecraft.network.play.server.S02PacketChat; |
@@ -49,12 +50,13 @@ public abstract class PacketEvents implements InterfaceProvider | @@ -49,12 +50,13 @@ public abstract class PacketEvents implements InterfaceProvider | ||
49 | 50 | ||
50 | private FastIterable<ServerChatFilter> serverChatFilters = new HandlerList<ServerChatFilter>(ServerChatFilter.class, ReturnLogicOp.AND_BREAK_ON_FALSE); | 51 | private FastIterable<ServerChatFilter> serverChatFilters = new HandlerList<ServerChatFilter>(ServerChatFilter.class, ReturnLogicOp.AND_BREAK_ON_FALSE); |
51 | 52 | ||
52 | - private final int loginSuccessPacketId = Packets.S02PacketLoginSuccess.getIndex(); | ||
53 | - private final int serverChatPacketId = Packets.S02PacketChat.getIndex(); | ||
54 | - private final int clientChatPacketId = Packets.C01PacketChatMessage.getIndex(); | ||
55 | - private final int joinGamePacketId = Packets.S01PacketJoinGame.getIndex(); | ||
56 | - private final int serverPayloadPacketId = Packets.S3FPacketCustomPayload.getIndex(); | ||
57 | - private final int clientPayloadPacketId = Packets.C17PacketCustomPayload.getIndex(); | 53 | + private final int loginSuccessPacketId = Packets.S02PacketLoginSuccess.getIndex(); |
54 | + private final int serverChatPacketId = Packets.S02PacketChat.getIndex(); | ||
55 | + private final int clientChatPacketId = Packets.C01PacketChatMessage.getIndex(); | ||
56 | + private final int joinGamePacketId = Packets.S01PacketJoinGame.getIndex(); | ||
57 | + private final int serverPayloadPacketId = Packets.S3FPacketCustomPayload.getIndex(); | ||
58 | + private final int clientPayloadPacketId = Packets.C17PacketCustomPayload.getIndex(); | ||
59 | + private final int clientSettingsPacketId = Packets.C15PacketClientSettings.getIndex(); | ||
58 | 60 | ||
59 | public PacketEvents() | 61 | public PacketEvents() |
60 | { | 62 | { |
@@ -192,6 +194,12 @@ public abstract class PacketEvents implements InterfaceProvider | @@ -192,6 +194,12 @@ public abstract class PacketEvents implements InterfaceProvider | ||
192 | return true; | 194 | return true; |
193 | } | 195 | } |
194 | 196 | ||
197 | + if (packetId == this.clientSettingsPacketId) | ||
198 | + { | ||
199 | + this.handlePacket(e, netHandler, (C15PacketClientSettings)packet); | ||
200 | + return true; | ||
201 | + } | ||
202 | + | ||
195 | return false; | 203 | return false; |
196 | } | 204 | } |
197 | 205 | ||
@@ -258,4 +266,23 @@ public abstract class PacketEvents implements InterfaceProvider | @@ -258,4 +266,23 @@ public abstract class PacketEvents implements InterfaceProvider | ||
258 | { | 266 | { |
259 | LiteLoader.getServerPluginChannels().onPluginChannelMessage(netHandler, packet); | 267 | LiteLoader.getServerPluginChannels().onPluginChannelMessage(netHandler, packet); |
260 | } | 268 | } |
269 | + | ||
270 | + /** | ||
271 | + * C15PacketClientSettings::processPacket() | ||
272 | + * | ||
273 | + * @param e | ||
274 | + * @param netHandler | ||
275 | + * @param packet | ||
276 | + */ | ||
277 | + private void handlePacket(PacketEventInfo<Packet> e, INetHandler netHandler, C15PacketClientSettings packet) | ||
278 | + { | ||
279 | + if (netHandler instanceof NetHandlerPlayServer) | ||
280 | + { | ||
281 | + LiteLoaderEventBroker.broker.onPlayerSettingsReceived(((NetHandlerPlayServer)netHandler).playerEntity, packet); | ||
282 | + } | ||
283 | + else | ||
284 | + { | ||
285 | + System.err.println("ACTUALLY: handler is " + netHandler); | ||
286 | + } | ||
287 | + } | ||
261 | } | 288 | } |
java/common/com/mumfrey/liteloader/core/PlayerEventState.java
0 → 100644
1 | +package com.mumfrey.liteloader.core; | ||
2 | + | ||
3 | +import java.lang.ref.WeakReference; | ||
4 | + | ||
5 | +import net.minecraft.entity.player.EntityPlayerMP; | ||
6 | +import net.minecraft.util.BlockPos; | ||
7 | +import net.minecraft.util.EnumFacing; | ||
8 | +import net.minecraft.util.MovingObjectPosition; | ||
9 | +import net.minecraft.util.MovingObjectPosition.MovingObjectType; | ||
10 | + | ||
11 | +import com.mumfrey.liteloader.PlayerInteractionListener.MouseButton; | ||
12 | +import com.mumfrey.liteloader.core.LiteLoaderEventBroker.InteractType; | ||
13 | +import com.mumfrey.liteloader.util.EntityUtilities; | ||
14 | + | ||
15 | +public class PlayerEventState implements IEventState | ||
16 | +{ | ||
17 | + private static long MISS = new BlockPos(-1, -1, -1).toLong(); | ||
18 | + | ||
19 | + private WeakReference<EntityPlayerMP> playerRef; | ||
20 | + | ||
21 | + private final LiteLoaderEventBroker<?, ?> broker; | ||
22 | + | ||
23 | + private double traceDistance = 256.0; | ||
24 | + | ||
25 | + private int suppressLeftTicks; | ||
26 | + private int suppressRightTicks; | ||
27 | + private boolean leftClick; | ||
28 | + private boolean rightClick; | ||
29 | + | ||
30 | + private MovingObjectPosition hit; | ||
31 | + | ||
32 | + public PlayerEventState(EntityPlayerMP player, LiteLoaderEventBroker<?, ?> broker) | ||
33 | + { | ||
34 | + this.playerRef = new WeakReference<EntityPlayerMP>(player); | ||
35 | + this.broker = broker; | ||
36 | + } | ||
37 | + | ||
38 | + public void setTraceDistance(int renderDistance) | ||
39 | + { | ||
40 | + this.traceDistance = renderDistance * 16.0; | ||
41 | + } | ||
42 | + | ||
43 | + public EntityPlayerMP getPlayer() | ||
44 | + { | ||
45 | + return this.playerRef.get(); | ||
46 | + } | ||
47 | + | ||
48 | + public void onSpawned() | ||
49 | + { | ||
50 | + } | ||
51 | + | ||
52 | + @Override | ||
53 | + public void onTick() | ||
54 | + { | ||
55 | + if (this.leftClick && this.suppressLeftTicks == 0) | ||
56 | + { | ||
57 | + this.broker.onPlayerClickedAir(this.getPlayer(), MouseButton.LEFT, this.hit.getBlockPos(), this.hit.sideHit, this.hit.typeOfHit); | ||
58 | + } | ||
59 | + | ||
60 | + if (this.rightClick && this.suppressRightTicks == 0) | ||
61 | + { | ||
62 | + this.broker.onPlayerClickedAir(this.getPlayer(), MouseButton.RIGHT, this.hit.getBlockPos(), this.hit.sideHit, this.hit.typeOfHit); | ||
63 | + } | ||
64 | + | ||
65 | + if (this.suppressLeftTicks > 0) this.suppressLeftTicks--; | ||
66 | + if (this.suppressRightTicks > 0) this.suppressRightTicks--; | ||
67 | + | ||
68 | + this.leftClick = false; | ||
69 | + this.rightClick = false; | ||
70 | + } | ||
71 | + | ||
72 | + public boolean onPlayerInteract(InteractType action, EntityPlayerMP player, BlockPos position, EnumFacing side) | ||
73 | + { | ||
74 | + this.hit = EntityUtilities.rayTraceFromEntity(player, this.traceDistance, 0.0F); | ||
75 | + | ||
76 | + if (action == InteractType.LEFT_CLICK) | ||
77 | + { | ||
78 | + this.leftClick = true; | ||
79 | + return true; | ||
80 | + } | ||
81 | + | ||
82 | + if (action == InteractType.RIGHT_CLICK) | ||
83 | + { | ||
84 | + this.rightClick = true; | ||
85 | + return true; | ||
86 | + } | ||
87 | + | ||
88 | + if ((action == InteractType.LEFT_CLICK_BLOCK || action == InteractType.DIG_BLOCK_MAYBE) && this.suppressLeftTicks == 0) | ||
89 | + { | ||
90 | + this.suppressLeftTicks += 2; | ||
91 | + return this.broker.onPlayerClickedBlock(player, MouseButton.LEFT, position, side); | ||
92 | + } | ||
93 | + | ||
94 | + if (action == InteractType.PLACE_BLOCK_MAYBE) | ||
95 | + { | ||
96 | + if (this.suppressRightTicks > 0) | ||
97 | + { | ||
98 | + return true; | ||
99 | + } | ||
100 | + | ||
101 | + if (position.toLong() == PlayerEventState.MISS) | ||
102 | + { | ||
103 | + MovingObjectPosition actualHit = EntityUtilities.rayTraceFromEntity(player, player.capabilities.isCreativeMode ? 5.0 : 4.5, 0.0F); | ||
104 | + if (actualHit.typeOfHit == MovingObjectType.MISS) | ||
105 | + { | ||
106 | + this.rightClick = true; | ||
107 | + return true; | ||
108 | + } | ||
109 | + } | ||
110 | + | ||
111 | + this.suppressRightTicks++; | ||
112 | + this.suppressLeftTicks++; | ||
113 | + return this.broker.onPlayerClickedBlock(player, MouseButton.RIGHT, position, side); | ||
114 | + } | ||
115 | + | ||
116 | + return true; | ||
117 | + } | ||
118 | +} |
java/common/com/mumfrey/liteloader/core/runtime/Methods.java
@@ -42,6 +42,13 @@ public abstract class Methods | @@ -42,6 +42,13 @@ public abstract class Methods | ||
42 | public static final MethodInfo doRenderShadowAndFire = new MethodInfo(Obf.Render, Obf.doRenderShadowAndFire, Void.TYPE, Obf.Entity, Double.TYPE, Double.TYPE, Double.TYPE, Float.TYPE, Float.TYPE); | 42 | public static final MethodInfo doRenderShadowAndFire = new MethodInfo(Obf.Render, Obf.doRenderShadowAndFire, Void.TYPE, Obf.Entity, Double.TYPE, Double.TYPE, Double.TYPE, Float.TYPE, Float.TYPE); |
43 | public static final MethodInfo realmsPlay = new MethodInfo(Obf.RealmsMainScreen, "play", Void.TYPE, Long.TYPE); | 43 | public static final MethodInfo realmsPlay = new MethodInfo(Obf.RealmsMainScreen, "play", Void.TYPE, Long.TYPE); |
44 | public static final MethodInfo realmsStopFetcher = new MethodInfo(Obf.RealmsMainScreen, "stopRealmsFetcherAndPinger", Void.TYPE); | 44 | public static final MethodInfo realmsStopFetcher = new MethodInfo(Obf.RealmsMainScreen, "stopRealmsFetcherAndPinger", Void.TYPE); |
45 | + public static final MethodInfo onBlockClicked = new MethodInfo(Obf.ItemInWorldManager, Obf.onBlockClicked, Void.TYPE, Obf.BlockPos, Obf.EnumFacing); | ||
46 | + public static final MethodInfo activateBlockOrUseItem = new MethodInfo(Obf.ItemInWorldManager, Obf.activateBlockOrUseItem, Boolean.TYPE, Obf.EntityPlayer, Obf.World, Obf.ItemStack, Obf.BlockPos, Obf.EnumFacing, Float.TYPE, Float.TYPE, Float.TYPE); | ||
47 | + public static final MethodInfo processBlockPlacement = new MethodInfo(Obf.NetHandlerPlayServer, Obf.processPlayerBlockPlacement, Void.TYPE, Packets.C08PacketPlayerBlockPlacement); | ||
48 | + public static final MethodInfo handleAnimation = new MethodInfo(Obf.NetHandlerPlayServer, Obf.handleAnimation, Void.TYPE, Packets.C0APacketAnimation); | ||
49 | + public static final MethodInfo processPlayerDigging = new MethodInfo(Obf.NetHandlerPlayServer, Obf.processPlayerDigging, Void.TYPE, Packets.C07PacketPlayerDigging); | ||
50 | + public static final MethodInfo serverJobs = new MethodInfo(Obf.MinecraftServer, Obf.updateTimeLightAndEntities, Void.TYPE); | ||
51 | + public static final MethodInfo checkThreadAndEnqueue = new MethodInfo(Obf.PacketThreadUtil, Obf.checkThreadAndEnqueue); | ||
45 | 52 | ||
46 | // Profiler | 53 | // Profiler |
47 | public static final MethodInfo startSection = new MethodInfo(Obf.Profiler, Obf.startSection, Void.TYPE, String.class); | 54 | public static final MethodInfo startSection = new MethodInfo(Obf.Profiler, Obf.startSection, Void.TYPE, String.class); |
java/common/com/mumfrey/liteloader/util/EntityUtilities.java
0 → 100644
1 | +package com.mumfrey.liteloader.util; | ||
2 | + | ||
3 | +import net.minecraft.entity.Entity; | ||
4 | +import net.minecraft.util.MovingObjectPosition; | ||
5 | +import net.minecraft.util.Vec3; | ||
6 | + | ||
7 | +public abstract class EntityUtilities | ||
8 | +{ | ||
9 | + public static MovingObjectPosition rayTraceFromEntity(Entity entity, double traceDistance, float partialTicks) | ||
10 | + { | ||
11 | + Vec3 var4 = EntityUtilities.getPositionEyes(entity, partialTicks); | ||
12 | + Vec3 var5 = entity.getLook(partialTicks); | ||
13 | + Vec3 var6 = var4.addVector(var5.xCoord * traceDistance, var5.yCoord * traceDistance, var5.zCoord * traceDistance); | ||
14 | + return entity.worldObj.rayTraceBlocks(var4, var6, false, false, true); | ||
15 | + } | ||
16 | + | ||
17 | + public static Vec3 getPositionEyes(Entity entity, float partialTicks) | ||
18 | + { | ||
19 | + if (partialTicks == 1.0F) | ||
20 | + { | ||
21 | + return new Vec3(entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ); | ||
22 | + } | ||
23 | + | ||
24 | + double interpX = entity.prevPosX + (entity.posX - entity.prevPosX) * partialTicks; | ||
25 | + double interpY = entity.prevPosY + (entity.posY - entity.prevPosY) * partialTicks + entity.getEyeHeight(); | ||
26 | + double interpZ = entity.prevPosZ + (entity.posZ - entity.prevPosZ) * partialTicks; | ||
27 | + return new Vec3(interpX, interpY, interpZ); | ||
28 | + } | ||
29 | +} |