From 20b3d02f7621024308069a7c07e188989acd11b9 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Sun, 15 Jun 2014 20:12:07 +1200 Subject: [PATCH] Change self disguises to globally use the entity id -1 for performance and usage in other plugins --- .../libraryaddict/disguise/DisguiseAPI.java | 11 ++++- .../disguise/disguisetypes/Disguise.java | 6 +-- .../disguise/utilities/DisguiseUtilities.java | 47 +++++++------------ .../disguise/utilities/PacketsManager.java | 5 +- 4 files changed, 30 insertions(+), 39 deletions(-) diff --git a/src/me/libraryaddict/disguise/DisguiseAPI.java b/src/me/libraryaddict/disguise/DisguiseAPI.java index 4867f4d8..e5699d17 100644 --- a/src/me/libraryaddict/disguise/DisguiseAPI.java +++ b/src/me/libraryaddict/disguise/DisguiseAPI.java @@ -289,9 +289,12 @@ public class DisguiseAPI { /** * Get the ID of a fake disguise for a entityplayer */ + @Deprecated public static int getFakeDisguise(UUID entityId) { - if (DisguiseUtilities.getSelfDisguisesIds().containsKey(entityId)) - return DisguiseUtilities.getSelfDisguisesIds().get(entityId); + return -1; + } + + public static int getSelfDisguiseId() { return -1; } @@ -313,6 +316,10 @@ public class DisguiseAPI { 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 * the world. diff --git a/src/me/libraryaddict/disguise/disguisetypes/Disguise.java b/src/me/libraryaddict/disguise/disguisetypes/Disguise.java index 35a5eb8c..efebd15e 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/Disguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/Disguise.java @@ -240,7 +240,7 @@ public abstract class Disguise { (byte) Math.floor(loc.getPitch() * 256.0F / 360.0F))); if (isSelfDisguiseVisible() && getEntity() instanceof Player) { PacketContainer selfLookPacket = lookPacket.shallowClone(); - selfLookPacket.getModifier().write(0, DisguiseAPI.getFakeDisguise(getEntity().getUniqueId())); + selfLookPacket.getModifier().write(0, DisguiseAPI.getSelfDisguiseId()); try { ProtocolLibrary.getProtocolManager().sendServerPacket((Player) getEntity(), selfLookPacket, false); @@ -259,7 +259,7 @@ public abstract class Disguise { if (!isSelfDisguiseVisible()) { continue; } - mods.write(0, DisguiseAPI.getFakeDisguise(getEntity().getUniqueId())); + mods.write(0, DisguiseAPI.getSelfDisguiseId()); } else { mods.write(0, getEntity().getEntityId()); } @@ -286,7 +286,7 @@ public abstract class Disguise { ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet, false); } else if (isSelfDisguiseVisible()) { PacketContainer selfPacket = packet.shallowClone(); - selfPacket.getModifier().write(0, DisguiseAPI.getFakeDisguise(getEntity().getUniqueId())); + selfPacket.getModifier().write(0, DisguiseAPI.getSelfDisguiseId()); try { ProtocolLibrary.getProtocolManager().sendServerPacket((Player) getEntity(), selfPacket, false); diff --git a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index 16762de3..45e65791 100644 --- a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -62,11 +62,7 @@ public class DisguiseUtilities { private static HashMap gameProfiles = new HashMap(); private static LibsDisguises libsDisguises; private static HashMap> runnables = new HashMap>(); - /** - * 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 selfDisguisesIds = new HashMap(); + private static HashSet selfDisguised = new HashSet(); public static boolean addClonedDisguise(String key, Disguise disguise) { if (DisguiseConfig.getMaxClonedDisguises() > 0) { @@ -428,8 +424,8 @@ public class DisguiseUtilities { return getProfileFromMojang(playerName, (Object) runnableIfCantReturn); } - public static HashMap getSelfDisguisesIds() { - return selfDisguisesIds; + public static HashSet getSelfDisguised() { + return selfDisguised; } public static boolean hasGameProfile(String playerName) { @@ -568,17 +564,17 @@ public class DisguiseUtilities { } public static void removeSelfDisguise(Player player) { - if (selfDisguisesIds.containsKey(player.getUniqueId())) { + if (selfDisguised.contains(player.getUniqueId())) { // Send a packet to destroy the fake entity 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 { ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet); } catch (Exception ex) { ex.printStackTrace(); } // Remove the fake entity ID from the disguise bin - selfDisguisesIds.remove(player.getUniqueId()); + selfDisguised.remove(player.getUniqueId()); // Get the entity tracker try { Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(player); @@ -630,7 +626,6 @@ public class DisguiseUtilities { }); return; } - int fakeId = selfDisguisesIds.get(player.getUniqueId()); // Add himself to his own entity tracker ((HashSet) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(entityTrackerEntry)) .add(ReflectionManager.getNmsEntity(player)); @@ -642,7 +637,7 @@ public class DisguiseUtilities { sendSelfPacket( player, 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; try { @@ -659,18 +654,18 @@ public class DisguiseUtilities { player, manager.createPacketConstructor(PacketType.Play.Server.ENTITY_VELOCITY, 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. if (player.getVehicle() != null && player.getEntityId() > player.getVehicle().getEntityId()) { sendSelfPacket(player, 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()) { sendSelfPacket(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 @@ -686,7 +681,7 @@ public class DisguiseUtilities { sendSelfPacket( player, 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(); @@ -695,14 +690,14 @@ public class DisguiseUtilities { sendSelfPacket( player, 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 for (Object potionEffect : player.getActivePotionEffects()) { sendSelfPacket(player, manager.createPacketConstructor(PacketType.Play.Server.ENTITY_EFFECT, player.getEntityId(), potionEffect) - .createPacket(player.getEntityId(), potionEffect), fakeId); + .createPacket(player.getEntityId(), potionEffect)); } } catch (Exception ex) { 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. */ - 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); try { if (packets == null) { @@ -720,7 +715,7 @@ public class DisguiseUtilities { } for (PacketContainer p : packets) { p = p.deepClone(); - p.getIntegers().write(0, fakeId); + p.getIntegers().write(0, DisguiseAPI.getSelfDisguiseId()); ProtocolLibrary.getProtocolManager().sendServerPacket(player, p, false); } } catch (InvocationTargetException e) { @@ -749,17 +744,7 @@ public class DisguiseUtilities { if (!disguise.isSelfDisguiseVisible() || !PacketsManager.isViewDisguisesListenerEnabled() || player.getVehicle() != null) { return; } - try { - // 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(); - } + selfDisguised.add(player.getUniqueId()); sendSelfDisguise(player, disguise); if (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf()) { if (PacketsManager.isInventoryListenerEnabled()) { diff --git a/src/me/libraryaddict/disguise/utilities/PacketsManager.java b/src/me/libraryaddict/disguise/utilities/PacketsManager.java index af2fa981..76c66676 100644 --- a/src/me/libraryaddict/disguise/utilities/PacketsManager.java +++ b/src/me/libraryaddict/disguise/utilities/PacketsManager.java @@ -741,8 +741,7 @@ public class PacketsManager { public void onPacketSending(PacketEvent event) { final Player observer = event.getPlayer(); if (event.getPacket().getIntegers().read(0) == observer.getEntityId()) { - int fakeId = DisguiseAPI.getFakeDisguise(observer.getUniqueId()); - if (fakeId > 0) { + if (DisguiseAPI.isSelfDisguised(observer)) { // 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); if (packets == null) { @@ -752,7 +751,7 @@ public class PacketsManager { if (packet.equals(event.getPacket())) { packet = packet.deepClone(); } - packet.getModifier().write(0, fakeId); + packet.getModifier().write(0, DisguiseAPI.getSelfDisguiseId()); try { ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); } catch (InvocationTargetException e) {