From 99daf8246d1ce342b1c8396c82cf0b89a324f27d Mon Sep 17 00:00:00 2001 From: NavidK0 Date: Sun, 6 Mar 2016 01:57:11 -0500 Subject: [PATCH] Progress! Some mob disguises are working now Added in dual hand animations Removed libraryaddict --- .../disguisetypes/watchers/PigWatcher.java | 6 +- .../disguise/utilities/DisguiseUtilities.java | 68 ++++++--- .../disguise/utilities/PacketsManager.java | 130 +++++++----------- src/main/resources/config.yml | 2 +- 4 files changed, 103 insertions(+), 103 deletions(-) diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PigWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PigWatcher.java index 4b9c1fc0..64e101d3 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PigWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PigWatcher.java @@ -9,11 +9,11 @@ public class PigWatcher extends AgeableWatcher { } public boolean isSaddled() { - return (byte) getValue(16, (byte) 0) == 1; + return (boolean) getValue(12, false); } public void setSaddled(boolean isSaddled) { - setValue(16, (byte) (isSaddled ? 1 : 0)); - sendData(16); + setValue(12, isSaddled); + sendData(12); } } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index 04b834c3..c28fb5a7 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -6,9 +6,6 @@ import com.comphenix.protocol.ProtocolManager; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.reflect.StructureModifier; import com.comphenix.protocol.wrappers.WrappedDataWatcher; -import com.comphenix.protocol.wrappers.WrappedDataWatcher.Registry; -import com.comphenix.protocol.wrappers.WrappedDataWatcher.Serializer; -import com.comphenix.protocol.wrappers.WrappedDataWatcher.WrappedDataWatcherObject; import com.comphenix.protocol.wrappers.WrappedGameProfile; import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.DisguiseConfig; @@ -28,7 +25,6 @@ import org.bukkit.World; import org.bukkit.block.BlockFace; import org.bukkit.entity.Ageable; import org.bukkit.entity.Entity; -import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.entity.Zombie; import org.bukkit.inventory.EquipmentSlot; @@ -42,7 +38,6 @@ import org.bukkit.scoreboard.Team.OptionStatus; import org.bukkit.util.Vector; import java.lang.reflect.Array; -import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -898,22 +893,55 @@ public class DisguiseUtilities { .createPacket(0, player.getPassenger(), player)); } - // Resend the armor - for (int i = 0; i < 5; i++) { - ItemStack item; - if (i == 0) { - item = player.getItemInHand(); - } else { - item = player.getInventory().getArmorContents()[i - 1]; - } + sendSelfPacket(player, + manager.createPacketConstructor( + Server.ENTITY_EQUIPMENT, + 0, + ReflectionManager.createEnumItemSlot(EquipmentSlot.HEAD), + ReflectionManager.getNmsItem(new ItemStack(Material.STONE))) + .createPacket(player.getEntityId(), ReflectionManager.createEnumItemSlot(EquipmentSlot.HEAD), + ReflectionManager.getNmsItem(player.getInventory().getHelmet()))); + sendSelfPacket(player, + manager.createPacketConstructor( + Server.ENTITY_EQUIPMENT, + 0, + ReflectionManager.createEnumItemSlot(EquipmentSlot.HEAD), + ReflectionManager.getNmsItem(new ItemStack(Material.STONE))) + .createPacket(player.getEntityId(), ReflectionManager.createEnumItemSlot(EquipmentSlot.CHEST), + ReflectionManager.getNmsItem(player.getInventory().getChestplate()))); + sendSelfPacket(player, + manager.createPacketConstructor( + Server.ENTITY_EQUIPMENT, + 0, + ReflectionManager.createEnumItemSlot(EquipmentSlot.HEAD), + ReflectionManager.getNmsItem(new ItemStack(Material.STONE))) + .createPacket(player.getEntityId(), ReflectionManager.createEnumItemSlot(EquipmentSlot.LEGS), + ReflectionManager.getNmsItem(player.getInventory().getLeggings()))); + sendSelfPacket(player, + manager.createPacketConstructor( + Server.ENTITY_EQUIPMENT, + 0, + ReflectionManager.createEnumItemSlot(EquipmentSlot.HEAD), + ReflectionManager.getNmsItem(new ItemStack(Material.STONE))) + .createPacket(player.getEntityId(), ReflectionManager.createEnumItemSlot(EquipmentSlot.FEET), + ReflectionManager.getNmsItem(player.getInventory().getBoots()))); + sendSelfPacket(player, + manager.createPacketConstructor( + Server.ENTITY_EQUIPMENT, + 0, + ReflectionManager.createEnumItemSlot(EquipmentSlot.HEAD), + ReflectionManager.getNmsItem(new ItemStack(Material.STONE))) + .createPacket(player.getEntityId(), ReflectionManager.createEnumItemSlot(EquipmentSlot.HAND), + ReflectionManager.getNmsItem(player.getInventory().getItemInMainHand()))); + sendSelfPacket(player, + manager.createPacketConstructor( + Server.ENTITY_EQUIPMENT, + 0, + ReflectionManager.createEnumItemSlot(EquipmentSlot.HEAD), + ReflectionManager.getNmsItem(new ItemStack(Material.STONE))) + .createPacket(player.getEntityId(), ReflectionManager.createEnumItemSlot(EquipmentSlot.OFF_HAND), + ReflectionManager.getNmsItem(player.getInventory().getItemInOffHand()))); - if (item != null && item.getType() != Material.AIR) { - sendSelfPacket( - player, - manager.createPacketConstructor(Server.ENTITY_EQUIPMENT, player.getEntityId(), i, - item).createPacket(player.getEntityId(), i, item)); - } - } Location loc = player.getLocation(); // If the disguised is sleeping for w/e reason if (player.isSleeping()) { diff --git a/src/main/java/me/libraryaddict/disguise/utilities/PacketsManager.java b/src/main/java/me/libraryaddict/disguise/utilities/PacketsManager.java index 87ec43fc..b5b73157 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/PacketsManager.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/PacketsManager.java @@ -46,7 +46,6 @@ import org.bukkit.entity.Zombie; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.metadata.FixedMetadataValue; -import org.bukkit.util.Vector; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; @@ -176,15 +175,13 @@ public class PacketsManager { } if (disguise.getType() == DisguiseType.EXPERIENCE_ORB) { - spawnPackets[0] = new PacketContainer(Server.SPAWN_ENTITY_EXPERIENCE_ORB); StructureModifier mods = spawnPackets[0].getModifier(); mods.write(0, disguisedEntity.getEntityId()); - mods.write(1, (int) Math.floor(loc.getX() * 32)); - mods.write(2, (int) Math.floor(loc.getY() * 32) + 2); - mods.write(3, (int) Math.floor(loc.getZ() * 32)); + mods.write(1, Math.floor(loc.getX() * 32)); + mods.write(2, Math.floor(loc.getY() * 32) + 2); + mods.write(3, Math.floor(loc.getZ() * 32)); mods.write(4, 1); - } else if (disguise.getType() == DisguiseType.PAINTING) { spawnPackets[0] = new PacketContainer(Server.SPAWN_ENTITY_PAINTING); StructureModifier mods = spawnPackets[0].getModifier(); @@ -198,52 +195,44 @@ public class PacketsManager { spawnPackets[1] = new PacketContainer(Server.ENTITY_TELEPORT); mods = spawnPackets[1].getModifier(); mods.write(0, disguisedEntity.getEntityId()); - mods.write(1, (int) Math.floor(loc.getX() * 32D)); - mods.write(2, (int) Math.floor(loc.getY() * 32D)); - mods.write(3, (int) Math.floor(loc.getZ() * 32D)); + mods.write(1, Math.floor(loc.getX() * 32D)); + mods.write(2, Math.floor(loc.getY() * 32D)); + mods.write(3, Math.floor(loc.getZ() * 32D)); mods.write(4, yaw); mods.write(5, pitch); - } else if (disguise.getType().isPlayer()) { - + //TODO: Make player disguises visible again spawnPackets[0] = new PacketContainer(Server.NAMED_ENTITY_SPAWN); - StructureModifier stringMods = spawnPackets[0].getStrings(); - WrappedGameProfile gameProfile; - if (stringMods.size() > 0) { - for (int i = 0; i < stringMods.size(); i++) { - stringMods.write(i, ((PlayerDisguise) disguise).getName()); - } - } else { - PlayerDisguise playerDisguise = (PlayerDisguise) disguise; - String name = playerDisguise.getSkin() != null ? playerDisguise.getSkin() : playerDisguise.getName(); - boolean removeName = false; - if (!DisguiseUtilities.hasGameProfile(name)) { - removeName = !DisguiseUtilities.getAddedByPlugins().contains(name); - } - gameProfile = playerDisguise.getGameProfile(); - if (removeName) { - DisguiseUtilities.getAddedByPlugins().remove(name); - } - spawnPackets[0].getSpecificModifier(UUID.class).write(0, gameProfile.getUUID()); + PlayerDisguise playerDisguise = (PlayerDisguise) disguise; + String name = playerDisguise.getSkin() != null ? playerDisguise.getSkin() : playerDisguise.getName(); + boolean removeName = false; + if (!DisguiseUtilities.hasGameProfile(name)) { + removeName = !DisguiseUtilities.getAddedByPlugins().contains(name); } - StructureModifier intMods = spawnPackets[0].getIntegers(); - intMods.write(0, disguisedEntity.getEntityId()); + WrappedGameProfile gameProfile = playerDisguise.getGameProfile(); + if (removeName) { + DisguiseUtilities.getAddedByPlugins().remove(name); + } + + //Write spawn packet in order + //Id + //UUID + //x + //y + //z + //pitch + //yaw + spawnPackets[0].getIntegers().write(0, disguisedEntity.getEntityId()); + spawnPackets[0].getSpecificModifier(UUID.class).write(0, gameProfile.getUUID()); StructureModifier doubleMods = spawnPackets[0].getDoubles(); doubleMods.write(0, Math.floor(loc.getX() * 32)); doubleMods.write(1, Math.floor(loc.getY() * 32)); doubleMods.write(2, Math.floor(loc.getZ() * 32)); - ItemStack item = null; - if (disguisedEntity instanceof Player && ((Player) disguisedEntity).getInventory().getItemInMainHand() != null) { - item = ((Player) disguisedEntity).getInventory().getItemInMainHand(); - } else if (disguisedEntity instanceof LivingEntity) { - item = ((LivingEntity) disguisedEntity).getEquipment().getItemInMainHand(); - } - intMods.write(4, (item == null || item.getType() == Material.AIR ? 0 : item.getTypeId())); StructureModifier byteMods = spawnPackets[0].getBytes(); - byteMods.write(1, yaw); byteMods.write(0, pitch); - spawnPackets[0].getDataWatcherModifier().write(0, - createDataWatcher(player, WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher())); + byteMods.write(1, yaw); + + spawnPackets[0].getDataWatcherModifier().write(0, createDataWatcher(WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher())); if (DisguiseConfig.isBedPacketsEnabled() && ((PlayerWatcher) disguise.getWatcher()).isSleeping()) { PacketContainer[] newPackets = new PacketContainer[spawnPackets.length + 1]; @@ -263,53 +252,36 @@ public class PacketsManager { newPackets.add(spawnPacket); } } + + //Send player info along with the disguise spawnPackets = newPackets.toArray(new PacketContainer[newPackets.size()]); spawnPackets[0] = new PacketContainer(Server.PLAYER_INFO); + + //Add player to the list, necessary to spawn them spawnPackets[0].getModifier().write(0, ReflectionManager.getEnumPlayerInfoAction(0)); List playerList = new ArrayList(); - PlayerDisguise playerDisguise = (PlayerDisguise) disguise; playerList.add(ReflectionManager.getPlayerInfoData(spawnPackets[0].getHandle(), playerDisguise.getGameProfile())); spawnPackets[0].getModifier().write(1, playerList); + + //Remove player from the list PacketContainer delayedPacket = spawnPackets[0].shallowClone(); delayedPacket.getModifier().write(0, ReflectionManager.getEnumPlayerInfoAction(4)); delayedPackets = new PacketContainer[]{delayedPacket}; } else if (disguise.getType().isMob() || disguise.getType() == DisguiseType.ARMOR_STAND) { - DisguiseValues values = DisguiseValues.getDisguiseValues(disguise.getType()); - Vector vec = disguisedEntity.getVelocity(); - spawnPackets[0] = new PacketContainer(Server.SPAWN_ENTITY_LIVING); - StructureModifier mods = spawnPackets[0].getModifier(); - mods.write(0, disguisedEntity.getEntityId()); - mods.write(1, disguise.getType().getTypeId()); - double d1 = 3.9D; - double d2 = vec.getX(); - double d3 = vec.getY(); - double d4 = vec.getZ(); - if (d2 < -d1) - d2 = -d1; - if (d3 < -d1) - d3 = -d1; - if (d4 < -d1) - d4 = -d1; - if (d2 > d1) - d2 = d1; - if (d3 > d1) - d3 = d1; - if (d4 > d1) - d4 = d1; - mods.write(2, values.getEntitySize(loc.getX())); - mods.write(3, (int) Math.floor(loc.getY() * 32D)); - mods.write(4, values.getEntitySize(loc.getZ())); - mods.write(5, (int) (d2 * 8000.0D)); - mods.write(6, (int) (d3 * 8000.0D)); - mods.write(7, (int) (d4 * 8000.0D)); - mods.write(8, yaw); - mods.write(9, pitch); + Class entityClass = disguise.getType().getEntityClass(); + Entity entity = Bukkit.getWorlds().get(0).spawn(disguise.getEntity().getLocation(), entityClass); + entity.setVelocity(disguisedEntity.getVelocity()); + Object nms = ReflectionManager.getNmsEntity(entity); + PacketContainer packet = ProtocolLibrary.getProtocolManager().createPacketConstructor(Server.SPAWN_ENTITY_LIVING, nms) + .createPacket(nms); + spawnPackets[0] = packet; spawnPackets[0].getDataWatcherModifier().write(0, - createDataWatcher(player, WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher())); - + createDataWatcher(WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher())); + entity.remove(); + //You know, as cheap as this may seem, this is pretty damn effective } else if (disguise.getType().isMisc()) { - + //TODO: Fix miscs int id = disguise.getType().getEntityId(); int data = ((MiscDisguise) disguise).getData(); if (disguise.getType() == DisguiseType.FALLING_BLOCK) { @@ -352,13 +324,13 @@ public class PacketsManager { /** * Create a new datawatcher but with the 'correct' values */ - private static WrappedDataWatcher createDataWatcher(Player player, WrappedDataWatcher watcher, FlagWatcher flagWatcher) { + private static WrappedDataWatcher createDataWatcher(WrappedDataWatcher watcher, FlagWatcher flagWatcher) { WrappedDataWatcher newWatcher = new WrappedDataWatcher(); try { - List list = DisguiseConfig.isMetadataPacketsEnabled() ? flagWatcher.convert(watcher - .getWatchableObjects()) : flagWatcher.getWatchableObjects(); + List list = DisguiseConfig.isMetadataPacketsEnabled() ? + flagWatcher.convert(watcher.getWatchableObjects()) : flagWatcher.getWatchableObjects(); for (WrappedWatchableObject watchableObject : list) { - newWatcher.setObject(watchableObject.getIndex(), watchableObject.getValue()); + newWatcher.setObject(watchableObject.getWatcherObject(), watchableObject.getValue()); } } catch (Exception ex) { ex.printStackTrace(); diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index db79e105..dc12aade 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -38,7 +38,7 @@ DyeableWolf: false # Such as prophunt. Its also false because its kind of a retarded feature. # This is pretty simple. It shows the players displayname (Name as it appears in chat) above their head. # This also overrides any custom name they have set in their disguise options. -ShowNamesAboveDisguises: false +ShowNamesAboveDisguises: false # This supports the above option. # If this is true, then the name shown above the head appears regardless of if you are looking at the disguise directly or not. NameAboveHeadAlwaysVisible: true