Fixed metadata not being sent issue for player disguises
This commit is contained in:
		| @@ -2,6 +2,7 @@ package me.libraryaddict.disguise.disguisetypes; | |||||||
|  |  | ||||||
| import java.lang.reflect.InvocationTargetException; | import java.lang.reflect.InvocationTargetException; | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
|  | import java.util.Arrays; | ||||||
| import java.util.HashMap; | import java.util.HashMap; | ||||||
| import java.util.HashSet; | import java.util.HashSet; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| @@ -23,7 +24,6 @@ import com.comphenix.protocol.wrappers.WrappedWatchableObject; | |||||||
| import me.libraryaddict.disguise.DisguiseAPI; | import me.libraryaddict.disguise.DisguiseAPI; | ||||||
| import me.libraryaddict.disguise.DisguiseConfig; | import me.libraryaddict.disguise.DisguiseConfig; | ||||||
| import me.libraryaddict.disguise.utilities.DisguiseUtilities; | import me.libraryaddict.disguise.utilities.DisguiseUtilities; | ||||||
| import me.libraryaddict.disguise.utilities.PacketsManager; |  | ||||||
| import me.libraryaddict.disguise.utilities.ReflectionManager; | import me.libraryaddict.disguise.utilities.ReflectionManager; | ||||||
|  |  | ||||||
| public class FlagWatcher { | public class FlagWatcher { | ||||||
| @@ -36,7 +36,7 @@ public class FlagWatcher { | |||||||
|     private HashMap<Integer, Object> entityValues = new HashMap<>(); |     private HashMap<Integer, Object> entityValues = new HashMap<>(); | ||||||
|     private LibsEquipment equipment; |     private LibsEquipment equipment; | ||||||
|     private boolean hasDied; |     private boolean hasDied; | ||||||
|     private HashSet<Integer> modifiedEntityAnimations = new HashSet<>(); |     private boolean[] modifiedEntityAnimations = new boolean[6]; | ||||||
|     private List<WrappedWatchableObject> watchableObjects; |     private List<WrappedWatchableObject> watchableObjects; | ||||||
|  |  | ||||||
|     public FlagWatcher(Disguise disguise) { |     public FlagWatcher(Disguise disguise) { | ||||||
| @@ -46,16 +46,12 @@ public class FlagWatcher { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     private byte addEntityAnimations(byte originalValue, byte entityValue) { |     private byte addEntityAnimations(byte originalValue, byte entityValue) { | ||||||
|         byte valueByte = originalValue; |  | ||||||
|  |  | ||||||
|         for (int i = 0; i < 6; i++) { |         for (int i = 0; i < 6; i++) { | ||||||
|             if ((entityValue & 1 << i) != 0 && !modifiedEntityAnimations.contains(i)) { |             if ((entityValue & 1 << i) != 0 && !modifiedEntityAnimations[i]) { | ||||||
|                 valueByte = (byte) (valueByte | 1 << i); |                 originalValue = (byte) (originalValue | 1 << i); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         originalValue = valueByte; |  | ||||||
|  |  | ||||||
|         return originalValue; |         return originalValue; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -72,7 +68,7 @@ public class FlagWatcher { | |||||||
|  |  | ||||||
|         cloned.entityValues = (HashMap<Integer, Object>) entityValues.clone(); |         cloned.entityValues = (HashMap<Integer, Object>) entityValues.clone(); | ||||||
|         cloned.equipment = equipment.clone(cloned); |         cloned.equipment = equipment.clone(cloned); | ||||||
|         cloned.modifiedEntityAnimations = (HashSet<Integer>) modifiedEntityAnimations.clone(); |         cloned.modifiedEntityAnimations = Arrays.copyOf(modifiedEntityAnimations, modifiedEntityAnimations.length); | ||||||
|         cloned.addEntityAnimations = addEntityAnimations; |         cloned.addEntityAnimations = addEntityAnimations; | ||||||
|  |  | ||||||
|         return cloned; |         return cloned; | ||||||
| @@ -89,7 +85,7 @@ public class FlagWatcher { | |||||||
|  |  | ||||||
|             // Its sending the air metadata. This is the least commonly sent metadata which all entitys still share. |             // Its sending the air metadata. This is the least commonly sent metadata which all entitys still share. | ||||||
|             // I send my custom values if I see this! |             // I send my custom values if I see this! | ||||||
|             if (id == 1) { |             if (id == FlagType.ENTITY_AIR_TICKS.getIndex()) { | ||||||
|                 sendAllCustom = true; |                 sendAllCustom = true; | ||||||
|             } |             } | ||||||
|  |  | ||||||
| @@ -334,10 +330,7 @@ public class FlagWatcher { | |||||||
|             Object value = entityValues.get(data.getIndex()); |             Object value = entityValues.get(data.getIndex()); | ||||||
|  |  | ||||||
|             if (isEntityAnimationsAdded() && DisguiseConfig.isMetadataPacketsEnabled() && data == FlagType.ENTITY_META) { |             if (isEntityAnimationsAdded() && DisguiseConfig.isMetadataPacketsEnabled() && data == FlagType.ENTITY_META) { | ||||||
|                 if (!PacketsManager.isStaticMetadataDisguiseType(disguise)) { |                 value = addEntityAnimations((byte) value, WrappedDataWatcher.getEntityWatcher(disguise.getEntity()).getByte(0)); | ||||||
|                     value = addEntityAnimations((byte) value, |  | ||||||
|                             WrappedDataWatcher.getEntityWatcher(disguise.getEntity()).getByte(0)); |  | ||||||
|                 } |  | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             WrappedWatchableObject watch = ReflectionManager.createWatchable(data.getIndex(), value); |             WrappedWatchableObject watch = ReflectionManager.createWatchable(data.getIndex(), value); | ||||||
| @@ -408,7 +401,7 @@ public class FlagWatcher { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     private void setEntityFlag(int byteValue, boolean flag) { |     private void setEntityFlag(int byteValue, boolean flag) { | ||||||
|         modifiedEntityAnimations.add(byteValue); |         modifiedEntityAnimations[byteValue] = true; | ||||||
|  |  | ||||||
|         byte b0 = (byte) getData(FlagType.ENTITY_META); |         byte b0 = (byte) getData(FlagType.ENTITY_META); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -80,7 +80,7 @@ public class PacketsManager { | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         public void setPacketType(PacketType type) { |         public void setPacketType(PacketType type) { | ||||||
|             isSpawnPacket = type.name().contains("SPAWN_"); |             isSpawnPacket = type.name().contains("SPAWN") && type.name().contains("ENTITY"); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public void addPacket(PacketContainer packet) { |         public void addPacket(PacketContainer packet) { | ||||||
| @@ -142,7 +142,7 @@ public class PacketsManager { | |||||||
|     private static PacketListener viewDisguisesListener; |     private static PacketListener viewDisguisesListener; | ||||||
|     private static PacketListener tabListListener; |     private static PacketListener tabListListener; | ||||||
|     private static boolean viewDisguisesListenerEnabled; |     private static boolean viewDisguisesListenerEnabled; | ||||||
|     private static HashMap<Disguise, ArrayList<UUID>> _cancelMeta = new HashMap<Disguise, ArrayList<UUID>>(); |     private static HashMap<Disguise, ArrayList<UUID>> cancelMeta = new HashMap<Disguise, ArrayList<UUID>>(); | ||||||
|  |  | ||||||
|     public static void addPacketListeners() { |     public static void addPacketListeners() { | ||||||
|         // Add a client listener to cancel them interacting with uninteractable disguised entitys. |         // Add a client listener to cancel them interacting with uninteractable disguised entitys. | ||||||
| @@ -162,7 +162,7 @@ public class PacketsManager { | |||||||
|     public static void removeCancel(Disguise disguise, Player observer) { |     public static void removeCancel(Disguise disguise, Player observer) { | ||||||
|         ArrayList<UUID> cancel; |         ArrayList<UUID> cancel; | ||||||
|  |  | ||||||
|         if ((cancel = _cancelMeta.get(disguise)) == null) |         if ((cancel = cancelMeta.get(disguise)) == null) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         cancel.remove(observer.getUniqueId()); |         cancel.remove(observer.getUniqueId()); | ||||||
| @@ -170,7 +170,7 @@ public class PacketsManager { | |||||||
|         if (!cancel.isEmpty()) |         if (!cancel.isEmpty()) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         _cancelMeta.remove(disguise); |         cancelMeta.remove(disguise); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
| @@ -402,10 +402,11 @@ public class PacketsManager { | |||||||
|                 metaPacket.getIntegers().write(0, entityId); // Id |                 metaPacket.getIntegers().write(0, entityId); // Id | ||||||
|                 metaPacket.getWatchableCollectionModifier().write(0, newWatcher.getWatchableObjects()); |                 metaPacket.getWatchableCollectionModifier().write(0, newWatcher.getWatchableObjects()); | ||||||
|  |  | ||||||
|                 if (!_cancelMeta.containsKey(disguise)) |                 if (!cancelMeta.containsKey(disguise)) | ||||||
|                     _cancelMeta.put(disguise, new ArrayList<UUID>()); |                     cancelMeta.put(disguise, new ArrayList<UUID>()); | ||||||
|  |  | ||||||
|  |                 cancelMeta.get(disguise).add(observer.getUniqueId()); | ||||||
|  |  | ||||||
|                 _cancelMeta.get(disguise).add(observer.getUniqueId()); |  | ||||||
|                 packets.addDelayedPacket(metaPacket, 4); |                 packets.addDelayedPacket(metaPacket, 4); | ||||||
|             } |             } | ||||||
|  |  | ||||||
| @@ -929,8 +930,8 @@ public class PacketsManager { | |||||||
|             else if (sentPacket.getType() == Server.ENTITY_METADATA) { |             else if (sentPacket.getType() == Server.ENTITY_METADATA) { | ||||||
|                 packets.clear(); |                 packets.clear(); | ||||||
|  |  | ||||||
|                 if (DisguiseConfig.isMetadataPacketsEnabled() && !isStaticMetadataDisguiseType(disguise) |                 if (DisguiseConfig.isMetadataPacketsEnabled() | ||||||
|                         && (!_cancelMeta.containsKey(disguise) || !_cancelMeta.get(disguise).contains(observer.getUniqueId()))) { |                         && (!cancelMeta.containsKey(disguise) || !cancelMeta.get(disguise).contains(observer.getUniqueId()))) { | ||||||
|                     List<WrappedWatchableObject> watchableObjects = disguise.getWatcher() |                     List<WrappedWatchableObject> watchableObjects = disguise.getWatcher() | ||||||
|                             .convert(sentPacket.getWatchableCollectionModifier().read(0)); |                             .convert(sentPacket.getWatchableCollectionModifier().read(0)); | ||||||
|  |  | ||||||
| @@ -1066,7 +1067,7 @@ public class PacketsManager { | |||||||
|                     packets.addPacket(equipPacket); |                     packets.addPacket(equipPacket); | ||||||
|  |  | ||||||
|                     equipPacket.getModifier().write(2, |                     equipPacket.getModifier().write(2, | ||||||
|                             (itemStack.getTypeId() == 0 ? null : ReflectionManager.getNmsItem(itemStack))); |                             ReflectionManager.getNmsItem(itemStack.getType() == Material.AIR ? null : itemStack)); | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 if (disguise.getWatcher().isRightClicking() && slot == EquipmentSlot.HAND) { |                 if (disguise.getWatcher().isRightClicking() && slot == EquipmentSlot.HAND) { | ||||||
| @@ -1076,7 +1077,7 @@ public class PacketsManager { | |||||||
|                         // Convert the datawatcher |                         // Convert the datawatcher | ||||||
|                         List<WrappedWatchableObject> list = new ArrayList<>(); |                         List<WrappedWatchableObject> list = new ArrayList<>(); | ||||||
|  |  | ||||||
|                         if (DisguiseConfig.isMetadataPacketsEnabled() && !isStaticMetadataDisguiseType(disguise)) { |                         if (DisguiseConfig.isMetadataPacketsEnabled()) { | ||||||
|                             WrappedWatchableObject watch = ReflectionManager.createWatchable(0, |                             WrappedWatchableObject watch = ReflectionManager.createWatchable(0, | ||||||
|                                     WrappedDataWatcher.getEntityWatcher(entity).getByte(0)); |                                     WrappedDataWatcher.getEntityWatcher(entity).getByte(0)); | ||||||
|  |  | ||||||
| @@ -1173,18 +1174,4 @@ public class PacketsManager { | |||||||
|  |  | ||||||
|         return packets; |         return packets; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Returns true if this disguise type doesn't have changing metadata. |  | ||||||
|      *  |  | ||||||
|      * @param disguise |  | ||||||
|      * @return |  | ||||||
|      */ |  | ||||||
|     public static boolean isStaticMetadataDisguiseType(Disguise disguise) { |  | ||||||
|         return false; |  | ||||||
|         /*        return (disguise.getType() == DisguiseType.WOLF || disguise.getType() == DisguiseType.OCELOT |  | ||||||
|                 || disguise.getType() == DisguiseType.ENDERMAN || disguise.getType() == DisguiseType.SHULKER |  | ||||||
|                 || disguise.getType() == DisguiseType.SPLASH_POTION || disguise.getType() == DisguiseType.FIREWORK |  | ||||||
|                 || disguise.getType() == DisguiseType.DROPPED_ITEM || disguise.getType() == DisguiseType.ENDER_CRYSTAL);*/ |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -21,16 +21,13 @@ import me.libraryaddict.disguise.disguisetypes.Disguise; | |||||||
| import me.libraryaddict.disguise.utilities.PacketsManager; | import me.libraryaddict.disguise.utilities.PacketsManager; | ||||||
| import me.libraryaddict.disguise.utilities.PacketsManager.LibsPackets; | import me.libraryaddict.disguise.utilities.PacketsManager.LibsPackets; | ||||||
|  |  | ||||||
| public class PacketListenerMain extends PacketAdapter | public class PacketListenerMain extends PacketAdapter { | ||||||
| { |     public PacketListenerMain(LibsDisguises plugin, ArrayList<PacketType> packetsToListen) { | ||||||
|     public PacketListenerMain(LibsDisguises plugin, ArrayList<PacketType> packetsToListen) |  | ||||||
|     { |  | ||||||
|         super(plugin, ListenerPriority.HIGH, packetsToListen); |         super(plugin, ListenerPriority.HIGH, packetsToListen); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public void onPacketSending(final PacketEvent event) |     public void onPacketSending(final PacketEvent event) { | ||||||
|     { |  | ||||||
|         if (event.isCancelled()) |         if (event.isCancelled()) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
| @@ -56,19 +53,16 @@ public class PacketListenerMain extends PacketAdapter | |||||||
|  |  | ||||||
|         LibsPackets packets; |         LibsPackets packets; | ||||||
|  |  | ||||||
|         try |         try { | ||||||
|         { |  | ||||||
|             packets = PacketsManager.transformPacket(event.getPacket(), disguise, observer, entity); |             packets = PacketsManager.transformPacket(event.getPacket(), disguise, observer, entity); | ||||||
|         } |         } | ||||||
|         catch (Exception ex) |         catch (Exception ex) { | ||||||
|         { |  | ||||||
|             ex.printStackTrace(); |             ex.printStackTrace(); | ||||||
|             event.setCancelled(true); |             event.setCancelled(true); | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (packets.isUnhandled()) |         if (packets.isUnhandled()) { | ||||||
|         { |  | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -76,17 +70,14 @@ public class PacketListenerMain extends PacketAdapter | |||||||
|  |  | ||||||
|         event.setCancelled(true); |         event.setCancelled(true); | ||||||
|  |  | ||||||
|         try |         try { | ||||||
|         { |             for (PacketContainer packet : packets.getPackets()) { | ||||||
|             for (PacketContainer packet : packets.getPackets()) |  | ||||||
|             { |  | ||||||
|                 ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); |                 ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             packets.sendDelayed(observer); |             packets.sendDelayed(observer); | ||||||
|         } |         } | ||||||
|         catch (InvocationTargetException ex) |         catch (InvocationTargetException ex) { | ||||||
|         { |  | ||||||
|             ex.printStackTrace(); |             ex.printStackTrace(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user