diff --git a/src/me/libraryaddict/disguise/PacketsManager.java b/src/me/libraryaddict/disguise/PacketsManager.java index ef113b45..cb7ffe43 100644 --- a/src/me/libraryaddict/disguise/PacketsManager.java +++ b/src/me/libraryaddict/disguise/PacketsManager.java @@ -152,7 +152,7 @@ public class PacketsManager { for (int i = 0; i < packets.size(); i++) { spawnPackets[i + 2] = packets.get(i); } - Location loc = disguisedEntity.getLocation(); + Location loc = disguisedEntity.getLocation().clone().add(0, getYModifier(disguisedEntity, disguise.getType()), 0); byte yaw = getYaw(disguise.getType(), DisguiseType.getType(disguise.getEntity().getType()), (byte) (int) (loc.getYaw() * 256.0F / 360.0F)); EnumEntitySize entitySize = Values.getValues(disguise.getType()).getEntitySize(); @@ -330,9 +330,10 @@ public class PacketsManager { /** * Add the yaw for the disguises */ - private static byte getYaw(DisguiseType disguiseType, DisguiseType entityType, byte value) { + public static byte getYaw(DisguiseType disguiseType, DisguiseType entityType, byte value) { switch (disguiseType) { case ENDER_DRAGON: + case WITHER_SKULL: value -= 128; break; case ITEM_FRAME: @@ -350,6 +351,7 @@ public class PacketsManager { } switch (entityType) { case ENDER_DRAGON: + case WITHER_SKULL: value += 128; break; case ITEM_FRAME: @@ -368,6 +370,37 @@ public class PacketsManager { return value; } + private static double getYModifier(Entity entity, DisguiseType disguiseType) { + switch (disguiseType) { + case BAT: + if (entity instanceof LivingEntity) + return ((LivingEntity) entity).getEyeHeight(); + case ARROW: + case BOAT: + case EGG: + case ENDER_PEARL: + case ENDER_SIGNAL: + case EXPERIENCE_ORB: + case FIREWORK: + case MINECART: + case MINECART_CHEST: + case MINECART_FURNACE: + case MINECART_HOPPER: + case MINECART_MOB_SPAWNER: + case MINECART_TNT: + case PAINTING: + case SMALL_FIREBALL: + case SNOWBALL: + case SPLASH_POTION: + case THROWN_EXP_BOTTLE: + case WITHER_SKULL: + return 0.7; + default: + break; + } + return 0; + } + protected static void init(JavaPlugin libsDisguises) { soundsListener = new PacketAdapter(libsDisguises, ConnectionSide.SERVER_SIDE, ListenerPriority.NORMAL, Packets.Server.NAMED_SOUND_EFFECT, Packets.Server.ENTITY_STATUS) { @@ -666,7 +699,7 @@ public class PacketsManager { // This packet sends attributes switch (sentPacket.getID()) { - + case Packets.Server.UPDATE_ATTRIBUTES: { @@ -730,10 +763,21 @@ public class PacketsManager { case Packets.Server.ENTITY_TELEPORT: { - packets[0] = sentPacket.shallowClone(); - StructureModifier mods = packets[0].getModifier(); - byte value = (Byte) mods.read(4); - mods.write(4, getYaw(disguise.getType(), DisguiseType.getType(entity.getType()), value)); + if (sentPacket.getID() == Packets.Server.ENTITY_LOOK && disguise.getType() == DisguiseType.WITHER_SKULL) { + packets = new PacketContainer[0]; + } else { + packets[0] = sentPacket.shallowClone(); + StructureModifier mods = packets[0].getModifier(); + byte value = (Byte) mods.read(4); + mods.write(4, getYaw(disguise.getType(), DisguiseType.getType(entity.getType()), value)); + if (sentPacket.getID() == Packets.Server.ENTITY_TELEPORT) { + double y = getYModifier(entity, disguise.getType()); + if (y != 0) { + y *= 32; + mods.write(2, (Integer) mods.read(2) + (int) Math.floor(y)); + } + } + } break; }