Change self disguises to globally use the entity id -1 for performance and usage in other plugins
This commit is contained in:
		| @@ -289,9 +289,12 @@ public class DisguiseAPI { | |||||||
|     /** |     /** | ||||||
|      * Get the ID of a fake disguise for a entityplayer |      * Get the ID of a fake disguise for a entityplayer | ||||||
|      */ |      */ | ||||||
|  |     @Deprecated | ||||||
|     public static int getFakeDisguise(UUID entityId) { |     public static int getFakeDisguise(UUID entityId) { | ||||||
|         if (DisguiseUtilities.getSelfDisguisesIds().containsKey(entityId)) |         return -1; | ||||||
|             return DisguiseUtilities.getSelfDisguisesIds().get(entityId); |     } | ||||||
|  |  | ||||||
|  |     public static int getSelfDisguiseId() { | ||||||
|         return -1; |         return -1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -313,6 +316,10 @@ public class DisguiseAPI { | |||||||
|         return disguise.isDisguiseInUse(); |         return disguise.isDisguiseInUse(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     public static boolean isSelfDisguised(Player player) { | ||||||
|  |         return DisguiseUtilities.getSelfDisguised().contains(player.getUniqueId()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Undisguise the entity. This doesn't let you cancel the UndisguiseEvent if the entity is no longer valid. Aka removed from |      * Undisguise the entity. This doesn't let you cancel the UndisguiseEvent if the entity is no longer valid. Aka removed from | ||||||
|      * the world. |      * the world. | ||||||
|   | |||||||
| @@ -240,7 +240,7 @@ public abstract class Disguise { | |||||||
|                                         (byte) Math.floor(loc.getPitch() * 256.0F / 360.0F))); |                                         (byte) Math.floor(loc.getPitch() * 256.0F / 360.0F))); | ||||||
|                                 if (isSelfDisguiseVisible() && getEntity() instanceof Player) { |                                 if (isSelfDisguiseVisible() && getEntity() instanceof Player) { | ||||||
|                                     PacketContainer selfLookPacket = lookPacket.shallowClone(); |                                     PacketContainer selfLookPacket = lookPacket.shallowClone(); | ||||||
|                                     selfLookPacket.getModifier().write(0, DisguiseAPI.getFakeDisguise(getEntity().getUniqueId())); |                                     selfLookPacket.getModifier().write(0, DisguiseAPI.getSelfDisguiseId()); | ||||||
|                                     try { |                                     try { | ||||||
|                                         ProtocolLibrary.getProtocolManager().sendServerPacket((Player) getEntity(), |                                         ProtocolLibrary.getProtocolManager().sendServerPacket((Player) getEntity(), | ||||||
|                                                 selfLookPacket, false); |                                                 selfLookPacket, false); | ||||||
| @@ -259,7 +259,7 @@ public abstract class Disguise { | |||||||
|                                         if (!isSelfDisguiseVisible()) { |                                         if (!isSelfDisguiseVisible()) { | ||||||
|                                             continue; |                                             continue; | ||||||
|                                         } |                                         } | ||||||
|                                         mods.write(0, DisguiseAPI.getFakeDisguise(getEntity().getUniqueId())); |                                         mods.write(0, DisguiseAPI.getSelfDisguiseId()); | ||||||
|                                     } else { |                                     } else { | ||||||
|                                         mods.write(0, getEntity().getEntityId()); |                                         mods.write(0, getEntity().getEntityId()); | ||||||
|                                     } |                                     } | ||||||
| @@ -286,7 +286,7 @@ public abstract class Disguise { | |||||||
|                                     ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet, false); |                                     ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet, false); | ||||||
|                                 } else if (isSelfDisguiseVisible()) { |                                 } else if (isSelfDisguiseVisible()) { | ||||||
|                                     PacketContainer selfPacket = packet.shallowClone(); |                                     PacketContainer selfPacket = packet.shallowClone(); | ||||||
|                                     selfPacket.getModifier().write(0, DisguiseAPI.getFakeDisguise(getEntity().getUniqueId())); |                                     selfPacket.getModifier().write(0, DisguiseAPI.getSelfDisguiseId()); | ||||||
|                                     try { |                                     try { | ||||||
|                                         ProtocolLibrary.getProtocolManager().sendServerPacket((Player) getEntity(), selfPacket, |                                         ProtocolLibrary.getProtocolManager().sendServerPacket((Player) getEntity(), selfPacket, | ||||||
|                                                 false); |                                                 false); | ||||||
|   | |||||||
| @@ -62,11 +62,7 @@ public class DisguiseUtilities { | |||||||
|     private static HashMap<String, WrappedGameProfile> gameProfiles = new HashMap<String, WrappedGameProfile>(); |     private static HashMap<String, WrappedGameProfile> gameProfiles = new HashMap<String, WrappedGameProfile>(); | ||||||
|     private static LibsDisguises libsDisguises; |     private static LibsDisguises libsDisguises; | ||||||
|     private static HashMap<String, ArrayList<Object>> runnables = new HashMap<String, ArrayList<Object>>(); |     private static HashMap<String, ArrayList<Object>> runnables = new HashMap<String, ArrayList<Object>>(); | ||||||
|     /** |     private static HashSet<UUID> selfDisguised = new HashSet<UUID>(); | ||||||
|      * A internal storage of fake entity ID's each entity has. Realistically I could probably use a ID like "4" for everyone, |  | ||||||
|      * seeing as no one sees each others entity ID |  | ||||||
|      **/ |  | ||||||
|     private static HashMap<UUID, Integer> selfDisguisesIds = new HashMap<UUID, Integer>(); |  | ||||||
|  |  | ||||||
|     public static boolean addClonedDisguise(String key, Disguise disguise) { |     public static boolean addClonedDisguise(String key, Disguise disguise) { | ||||||
|         if (DisguiseConfig.getMaxClonedDisguises() > 0) { |         if (DisguiseConfig.getMaxClonedDisguises() > 0) { | ||||||
| @@ -428,8 +424,8 @@ public class DisguiseUtilities { | |||||||
|         return getProfileFromMojang(playerName, (Object) runnableIfCantReturn); |         return getProfileFromMojang(playerName, (Object) runnableIfCantReturn); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public static HashMap<UUID, Integer> getSelfDisguisesIds() { |     public static HashSet<UUID> getSelfDisguised() { | ||||||
|         return selfDisguisesIds; |         return selfDisguised; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public static boolean hasGameProfile(String playerName) { |     public static boolean hasGameProfile(String playerName) { | ||||||
| @@ -568,17 +564,17 @@ public class DisguiseUtilities { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     public static void removeSelfDisguise(Player player) { |     public static void removeSelfDisguise(Player player) { | ||||||
|         if (selfDisguisesIds.containsKey(player.getUniqueId())) { |         if (selfDisguised.contains(player.getUniqueId())) { | ||||||
|             // Send a packet to destroy the fake entity |             // Send a packet to destroy the fake entity | ||||||
|             PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_DESTROY); |             PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_DESTROY); | ||||||
|             packet.getModifier().write(0, new int[] { selfDisguisesIds.get(player.getUniqueId()) }); |             packet.getModifier().write(0, new int[] { DisguiseAPI.getSelfDisguiseId() }); | ||||||
|             try { |             try { | ||||||
|                 ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet); |                 ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet); | ||||||
|             } catch (Exception ex) { |             } catch (Exception ex) { | ||||||
|                 ex.printStackTrace(); |                 ex.printStackTrace(); | ||||||
|             } |             } | ||||||
|             // Remove the fake entity ID from the disguise bin |             // Remove the fake entity ID from the disguise bin | ||||||
|             selfDisguisesIds.remove(player.getUniqueId()); |             selfDisguised.remove(player.getUniqueId()); | ||||||
|             // Get the entity tracker |             // Get the entity tracker | ||||||
|             try { |             try { | ||||||
|                 Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(player); |                 Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(player); | ||||||
| @@ -630,7 +626,6 @@ public class DisguiseUtilities { | |||||||
|                 }); |                 }); | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|             int fakeId = selfDisguisesIds.get(player.getUniqueId()); |  | ||||||
|             // Add himself to his own entity tracker |             // Add himself to his own entity tracker | ||||||
|             ((HashSet<Object>) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(entityTrackerEntry)) |             ((HashSet<Object>) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(entityTrackerEntry)) | ||||||
|                     .add(ReflectionManager.getNmsEntity(player)); |                     .add(ReflectionManager.getNmsEntity(player)); | ||||||
| @@ -642,7 +637,7 @@ public class DisguiseUtilities { | |||||||
|             sendSelfPacket( |             sendSelfPacket( | ||||||
|                     player, |                     player, | ||||||
|                     manager.createPacketConstructor(PacketType.Play.Server.ENTITY_METADATA, player.getEntityId(), dataWatcher, |                     manager.createPacketConstructor(PacketType.Play.Server.ENTITY_METADATA, player.getEntityId(), dataWatcher, | ||||||
|                             true).createPacket(player.getEntityId(), dataWatcher, true), fakeId); |                             true).createPacket(player.getEntityId(), dataWatcher, true)); | ||||||
|  |  | ||||||
|             boolean isMoving = false; |             boolean isMoving = false; | ||||||
|             try { |             try { | ||||||
| @@ -659,18 +654,18 @@ public class DisguiseUtilities { | |||||||
|                         player, |                         player, | ||||||
|                         manager.createPacketConstructor(PacketType.Play.Server.ENTITY_VELOCITY, player.getEntityId(), |                         manager.createPacketConstructor(PacketType.Play.Server.ENTITY_VELOCITY, player.getEntityId(), | ||||||
|                                 velocity.getX(), velocity.getY(), velocity.getZ()).createPacket(player.getEntityId(), |                                 velocity.getX(), velocity.getY(), velocity.getZ()).createPacket(player.getEntityId(), | ||||||
|                                 velocity.getX(), velocity.getY(), velocity.getZ()), fakeId); |                                 velocity.getX(), velocity.getY(), velocity.getZ())); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             // Why the hell would he even need this. Meh. |             // Why the hell would he even need this. Meh. | ||||||
|             if (player.getVehicle() != null && player.getEntityId() > player.getVehicle().getEntityId()) { |             if (player.getVehicle() != null && player.getEntityId() > player.getVehicle().getEntityId()) { | ||||||
|                 sendSelfPacket(player, |                 sendSelfPacket(player, | ||||||
|                         manager.createPacketConstructor(PacketType.Play.Server.ATTACH_ENTITY, 0, player, player.getVehicle()) |                         manager.createPacketConstructor(PacketType.Play.Server.ATTACH_ENTITY, 0, player, player.getVehicle()) | ||||||
|                                 .createPacket(0, player, player.getVehicle()), fakeId); |                                 .createPacket(0, player, player.getVehicle())); | ||||||
|             } else if (player.getPassenger() != null && player.getEntityId() > player.getPassenger().getEntityId()) { |             } else if (player.getPassenger() != null && player.getEntityId() > player.getPassenger().getEntityId()) { | ||||||
|                 sendSelfPacket(player, |                 sendSelfPacket(player, | ||||||
|                         manager.createPacketConstructor(PacketType.Play.Server.ATTACH_ENTITY, 0, player.getPassenger(), player) |                         manager.createPacketConstructor(PacketType.Play.Server.ATTACH_ENTITY, 0, player.getPassenger(), player) | ||||||
|                                 .createPacket(0, player.getPassenger(), player), fakeId); |                                 .createPacket(0, player.getPassenger(), player)); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             // Resend the armor |             // Resend the armor | ||||||
| @@ -686,7 +681,7 @@ public class DisguiseUtilities { | |||||||
|                     sendSelfPacket( |                     sendSelfPacket( | ||||||
|                             player, |                             player, | ||||||
|                             manager.createPacketConstructor(PacketType.Play.Server.ENTITY_EQUIPMENT, player.getEntityId(), i, |                             manager.createPacketConstructor(PacketType.Play.Server.ENTITY_EQUIPMENT, player.getEntityId(), i, | ||||||
|                                     item).createPacket(player.getEntityId(), i, item), fakeId); |                                     item).createPacket(player.getEntityId(), i, item)); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             Location loc = player.getLocation(); |             Location loc = player.getLocation(); | ||||||
| @@ -695,14 +690,14 @@ public class DisguiseUtilities { | |||||||
|                 sendSelfPacket( |                 sendSelfPacket( | ||||||
|                         player, |                         player, | ||||||
|                         manager.createPacketConstructor(PacketType.Play.Server.BED, player, loc.getBlockX(), loc.getBlockY(), |                         manager.createPacketConstructor(PacketType.Play.Server.BED, player, loc.getBlockX(), loc.getBlockY(), | ||||||
|                                 loc.getBlockZ()).createPacket(player, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()), fakeId); |                                 loc.getBlockZ()).createPacket(player, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ())); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             // Resend any active potion effects |             // Resend any active potion effects | ||||||
|             for (Object potionEffect : player.getActivePotionEffects()) { |             for (Object potionEffect : player.getActivePotionEffects()) { | ||||||
|                 sendSelfPacket(player, |                 sendSelfPacket(player, | ||||||
|                         manager.createPacketConstructor(PacketType.Play.Server.ENTITY_EFFECT, player.getEntityId(), potionEffect) |                         manager.createPacketConstructor(PacketType.Play.Server.ENTITY_EFFECT, player.getEntityId(), potionEffect) | ||||||
|                                 .createPacket(player.getEntityId(), potionEffect), fakeId); |                                 .createPacket(player.getEntityId(), potionEffect)); | ||||||
|             } |             } | ||||||
|         } catch (Exception ex) { |         } catch (Exception ex) { | ||||||
|             ex.printStackTrace(); |             ex.printStackTrace(); | ||||||
| @@ -712,7 +707,7 @@ public class DisguiseUtilities { | |||||||
|     /** |     /** | ||||||
|      * Method to send a packet to the self disguise, translate his entity ID to the fake id. |      * Method to send a packet to the self disguise, translate his entity ID to the fake id. | ||||||
|      */ |      */ | ||||||
|     private static void sendSelfPacket(Player player, PacketContainer packet, int fakeId) { |     private static void sendSelfPacket(Player player, PacketContainer packet) { | ||||||
|         PacketContainer[] packets = PacketsManager.transformPacket(packet, player, player); |         PacketContainer[] packets = PacketsManager.transformPacket(packet, player, player); | ||||||
|         try { |         try { | ||||||
|             if (packets == null) { |             if (packets == null) { | ||||||
| @@ -720,7 +715,7 @@ public class DisguiseUtilities { | |||||||
|             } |             } | ||||||
|             for (PacketContainer p : packets) { |             for (PacketContainer p : packets) { | ||||||
|                 p = p.deepClone(); |                 p = p.deepClone(); | ||||||
|                 p.getIntegers().write(0, fakeId); |                 p.getIntegers().write(0, DisguiseAPI.getSelfDisguiseId()); | ||||||
|                 ProtocolLibrary.getProtocolManager().sendServerPacket(player, p, false); |                 ProtocolLibrary.getProtocolManager().sendServerPacket(player, p, false); | ||||||
|             } |             } | ||||||
|         } catch (InvocationTargetException e) { |         } catch (InvocationTargetException e) { | ||||||
| @@ -749,17 +744,7 @@ public class DisguiseUtilities { | |||||||
|         if (!disguise.isSelfDisguiseVisible() || !PacketsManager.isViewDisguisesListenerEnabled() || player.getVehicle() != null) { |         if (!disguise.isSelfDisguiseVisible() || !PacketsManager.isViewDisguisesListenerEnabled() || player.getVehicle() != null) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         try { |         selfDisguised.add(player.getUniqueId()); | ||||||
|             // Grab the entity ID the fake disguise will use |  | ||||||
|             Field field = ReflectionManager.getNmsClass("Entity").getDeclaredField("entityCount"); |  | ||||||
|             field.setAccessible(true); |  | ||||||
|             int id = field.getInt(null); |  | ||||||
|             // Set the entitycount plus one so we don't have the id being reused |  | ||||||
|             field.set(null, id + 1); |  | ||||||
|             selfDisguisesIds.put(player.getUniqueId(), id); |  | ||||||
|         } catch (Exception ex) { |  | ||||||
|             ex.printStackTrace(); |  | ||||||
|         } |  | ||||||
|         sendSelfDisguise(player, disguise); |         sendSelfDisguise(player, disguise); | ||||||
|         if (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf()) { |         if (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf()) { | ||||||
|             if (PacketsManager.isInventoryListenerEnabled()) { |             if (PacketsManager.isInventoryListenerEnabled()) { | ||||||
|   | |||||||
| @@ -741,8 +741,7 @@ public class PacketsManager { | |||||||
|             public void onPacketSending(PacketEvent event) { |             public void onPacketSending(PacketEvent event) { | ||||||
|                 final Player observer = event.getPlayer(); |                 final Player observer = event.getPlayer(); | ||||||
|                 if (event.getPacket().getIntegers().read(0) == observer.getEntityId()) { |                 if (event.getPacket().getIntegers().read(0) == observer.getEntityId()) { | ||||||
|                     int fakeId = DisguiseAPI.getFakeDisguise(observer.getUniqueId()); |                     if (DisguiseAPI.isSelfDisguised(observer)) { | ||||||
|                     if (fakeId > 0) { |  | ||||||
|                         // Here I grab the packets to convert them to, So I can display them as if the disguise sent them. |                         // Here I grab the packets to convert them to, So I can display them as if the disguise sent them. | ||||||
|                         PacketContainer[] packets = transformPacket(event.getPacket(), observer, observer); |                         PacketContainer[] packets = transformPacket(event.getPacket(), observer, observer); | ||||||
|                         if (packets == null) { |                         if (packets == null) { | ||||||
| @@ -752,7 +751,7 @@ public class PacketsManager { | |||||||
|                             if (packet.equals(event.getPacket())) { |                             if (packet.equals(event.getPacket())) { | ||||||
|                                 packet = packet.deepClone(); |                                 packet = packet.deepClone(); | ||||||
|                             } |                             } | ||||||
|                             packet.getModifier().write(0, fakeId); |                             packet.getModifier().write(0, DisguiseAPI.getSelfDisguiseId()); | ||||||
|                             try { |                             try { | ||||||
|                                 ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); |                                 ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); | ||||||
|                             } catch (InvocationTargetException e) { |                             } catch (InvocationTargetException e) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user