diff --git a/block/AEBaseBlock.java b/block/AEBaseBlock.java index d6af90a7..3bf96d4b 100644 --- a/block/AEBaseBlock.java +++ b/block/AEBaseBlock.java @@ -38,6 +38,7 @@ import appeng.client.render.BlockRenderInfo; import appeng.client.render.WorldRender; import appeng.client.texture.FlipableIcon; import appeng.client.texture.MissingIcon; +import appeng.core.CommonHelper; import appeng.core.features.AEFeature; import appeng.core.features.AEFeatureHandler; import appeng.core.features.IAEFeature; @@ -531,7 +532,8 @@ public class AEBaseBlock extends BlockContainer implements IAEFeature { if ( Platform.isClient() ) { - LookDirection ld = Platform.getPlayerRay( Minecraft.getMinecraft().thePlayer ); + EntityPlayer player = Minecraft.getMinecraft().thePlayer; + LookDirection ld = Platform.getPlayerRay( player, Platform.getEyeOffset(player ) ); Iterable bbs = collisionHandler.getSelectedBoundingBoxsFromPool( w, x, y, z, Minecraft.getMinecraft().thePlayer, true ); AxisAlignedBB br = null; diff --git a/core/sync/packets/PacketPartPlacement.java b/core/sync/packets/PacketPartPlacement.java index fa1edb63..5ba3a97c 100644 --- a/core/sync/packets/PacketPartPlacement.java +++ b/core/sync/packets/PacketPartPlacement.java @@ -16,6 +16,7 @@ public class PacketPartPlacement extends AppEngPacket { int x, y, z, face; + float eyeHeight; // automatic. public PacketPartPlacement(ByteBuf stream) throws IOException { @@ -23,6 +24,7 @@ public class PacketPartPlacement extends AppEngPacket y = stream.readInt(); z = stream.readInt(); face = stream.readByte(); + eyeHeight = stream.readFloat(); } @Override @@ -30,12 +32,13 @@ public class PacketPartPlacement extends AppEngPacket { EntityPlayerMP sender = (EntityPlayerMP) player; CommonHelper.proxy.updateRenderMode( sender ); + PartPlacement.eyeHeight = eyeHeight; PartPlacement.place( sender.getHeldItem(), x, y, z, face, sender, sender.worldObj, PartPlacement.PlaceType.INTERACT_FIRST_PASS, 0 ); CommonHelper.proxy.updateRenderMode( null ); } // api - public PacketPartPlacement(int x, int y, int z, int face) throws IOException { + public PacketPartPlacement(int x, int y, int z, int face, float eyeHeight ) throws IOException { ByteBuf data = Unpooled.buffer(); @@ -44,7 +47,8 @@ public class PacketPartPlacement extends AppEngPacket data.writeInt( y ); data.writeInt( z ); data.writeByte( face ); - + data.writeFloat( eyeHeight ); + configureWrite( data ); } diff --git a/parts/PartPlacement.java b/parts/PartPlacement.java index 0adf75c4..1b943035 100644 --- a/parts/PartPlacement.java +++ b/parts/PartPlacement.java @@ -134,7 +134,7 @@ public class PartPlacement { if ( !world.isRemote ) { - LookDirection dir = Platform.getPlayerRay( player ); + LookDirection dir = Platform.getPlayerRay( player, getEyeOffset(player) ); MovingObjectPosition mop = block.collisionRayTrace( world, x, y, z, dir.a, dir.b ); if ( mop != null ) { @@ -169,7 +169,7 @@ public class PartPlacement player.swingItem(); try { - NetworkHandler.instance.sendToServer( new PacketPartPlacement( x, y, z, face ) ); + NetworkHandler.instance.sendToServer( new PacketPartPlacement( x, y, z, face, getEyeOffset( player ) ) ); } catch (IOException e) { @@ -223,7 +223,7 @@ public class PartPlacement player.swingItem(); try { - NetworkHandler.instance.sendToServer( new PacketPartPlacement( x, y, z, face ) ); + NetworkHandler.instance.sendToServer( new PacketPartPlacement( x, y, z, face, getEyeOffset( player ) ) ); return true; } catch (IOException e) @@ -247,7 +247,7 @@ public class PartPlacement Block block = world.getBlock( x, y, z ); if ( host != null && player.isSneaking() && block != null ) { - LookDirection dir = Platform.getPlayerRay( player ); + LookDirection dir = Platform.getPlayerRay( player, getEyeOffset(player) ); MovingObjectPosition mop = block.collisionRayTrace( world, x, y, z, dir.a, dir.b ); if ( mop != null ) { @@ -260,7 +260,7 @@ public class PartPlacement { try { - NetworkHandler.instance.sendToServer( new PacketPartPlacement( x, y, z, face ) ); + NetworkHandler.instance.sendToServer( new PacketPartPlacement( x, y, z, face, getEyeOffset( player ) ) ); } catch (IOException e) { @@ -323,7 +323,7 @@ public class PartPlacement player.swingItem(); try { - NetworkHandler.instance.sendToServer( new PacketPartPlacement( x, y, z, face ) ); + NetworkHandler.instance.sendToServer( new PacketPartPlacement( x, y, z, face, getEyeOffset( player ) ) ); } catch (IOException e) { @@ -365,7 +365,7 @@ public class PartPlacement if ( !world.isRemote ) { Block block = world.getBlock( x, y, z ); - LookDirection dir = Platform.getPlayerRay( player ); + LookDirection dir = Platform.getPlayerRay( player, getEyeOffset(player) ); MovingObjectPosition mop = block.collisionRayTrace( world, x, y, z, dir.a, dir.b ); if ( mop != null ) { @@ -402,7 +402,7 @@ public class PartPlacement player.swingItem(); try { - NetworkHandler.instance.sendToServer( new PacketPartPlacement( x, y, z, face ) ); + NetworkHandler.instance.sendToServer( new PacketPartPlacement( x, y, z, face, getEyeOffset( player ) ) ); } catch (IOException e) { @@ -412,6 +412,15 @@ public class PartPlacement return true; } + public static float eyeHeight = 0.0f; + private static float getEyeOffset( EntityPlayer p ) + { + if ( p.worldObj.isRemote ) + return Platform.getEyeOffset( p ); + + return eyeHeight; + } + private static SelectedPart selectPart(EntityPlayer player, IPartHost host, Vec3 pos) { CommonHelper.proxy.updateRenderMode( player ); diff --git a/util/Platform.java b/util/Platform.java index 2ab43870..d88e7ff7 100644 --- a/util/Platform.java +++ b/util/Platform.java @@ -1200,16 +1200,15 @@ public class Platform return a.isItemEqual( b ); } - public static LookDirection getPlayerRay(EntityPlayer player) + public static LookDirection getPlayerRay(EntityPlayer player, float eyeoffset) { float f = 1.0F; float f1 = player.prevRotationPitch + (player.rotationPitch - player.prevRotationPitch) * f; float f2 = player.prevRotationYaw + (player.rotationYaw - player.prevRotationYaw) * f; double d0 = player.prevPosX + (player.posX - player.prevPosX) * (double) f; - double d1 = player.prevPosY + (player.posY - player.prevPosY) * (double) f - + (double) (player.worldObj.isRemote ? player.getEyeHeight() - player.getDefaultEyeHeight() : player.getEyeHeight()); // isRemote - + double d1 = eyeoffset; double d2 = player.prevPosZ + (player.posZ - player.prevPosZ) * (double) f; + Vec3 vec3 = Vec3.createVectorHelper( d0, d1, d2 ); float f3 = MathHelper.cos( -f2 * 0.017453292F - (float) Math.PI ); float f4 = MathHelper.sin( -f2 * 0.017453292F - (float) Math.PI ); @@ -1792,4 +1791,10 @@ public class Platform } return AxisAlignedBB.getBoundingBox( 0, 0, 0, 1, 1, 1 ); } + + public static float getEyeOffset(EntityPlayer player) + { + assert player.worldObj.isRemote : "Valid only on client"; + return (float) (player.posY +player.getEyeHeight() - player.getDefaultEyeHeight()); + } }