diff --git a/src/me/libraryaddict/disguise/disguisetypes/watchers/LivingWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/LivingWatcher.java index 12e6b5f8..b7a3a244 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/watchers/LivingWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/LivingWatcher.java @@ -27,8 +27,7 @@ public class LivingWatcher extends FlagWatcher { static Method potionNo; static { try { - Class mobEffectList = ReflectionManager.getNmsClass("MobEffectList"); - list = (Object[]) mobEffectList.getField("byId").get(null); + list = (Object[]) ReflectionManager.getNmsField("MobEffectList", "byId").get(null); for (Object obj : list) { if (obj != null) { for (Method field : obj.getClass().getMethods()) { diff --git a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index 83c26058..d6b3d750 100644 --- a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -197,16 +197,22 @@ public class DisguiseUtilities { } } + private static final Field trackerField = ReflectionManager.getNmsField("World", "tracker"); + private static final Field entitiesField = ReflectionManager.getNmsField("EntityTracker", "trackedEntities"); + private static final Method ihmGet = ReflectionManager.getNmsMethod("IntHashMap", "get", int.class); + private static Object getEntityTrackerEntry(Entity target) throws Exception { + Object world = ReflectionManager.getWorld(target.getWorld()); + Object tracker = trackerField.get(world); + Object trackedEntities = entitiesField.get(tracker); + return ihmGet.invoke(trackedEntities, target.getEntityId()); + } + /** * Sends entity removal packets, as this disguise was removed */ public static void destroyEntity(TargetedDisguise disguise) { try { - Object world = ReflectionManager.getWorld(disguise.getEntity().getWorld()); - Object tracker = world.getClass().getField("tracker").get(world); - Object trackedEntities = tracker.getClass().getField("trackedEntities").get(tracker); - Object entityTrackerEntry = trackedEntities.getClass().getMethod("get", int.class) - .invoke(trackedEntities, disguise.getEntity().getEntityId()); + Object entityTrackerEntry = getEntityTrackerEntry(disguise.getEntity()); if (entityTrackerEntry != null) { HashSet trackedPlayers = (HashSet) entityTrackerEntry.getClass().getField("trackedPlayers") .get(entityTrackerEntry); @@ -325,13 +331,9 @@ public class DisguiseUtilities { public static ArrayList getPerverts(Disguise disguise) { ArrayList players = new ArrayList(); try { - Object world = ReflectionManager.getWorld(disguise.getEntity().getWorld()); - Object tracker = world.getClass().getField("tracker").get(world); - Object trackedEntities = tracker.getClass().getField("trackedEntities").get(tracker); - Object entityTrackerEntry = trackedEntities.getClass().getMethod("get", int.class) - .invoke(trackedEntities, disguise.getEntity().getEntityId()); + Object entityTrackerEntry = getEntityTrackerEntry(disguise.getEntity()); if (entityTrackerEntry != null) { - HashSet trackedPlayers = (HashSet) entityTrackerEntry.getClass().getField("trackedPlayers") + HashSet trackedPlayers = (HashSet) ReflectionManager.getNmsField(entityTrackerEntry.getClass(), "trackedPlayers") .get(entityTrackerEntry); for (Object p : trackedPlayers) { Player player = (Player) ReflectionManager.getBukkitEntity(p); @@ -466,11 +468,7 @@ public class DisguiseUtilities { public static void refreshTracker(TargetedDisguise disguise, String player) { if (disguise.getEntity() != null && disguise.getEntity().isValid()) { try { - Object world = ReflectionManager.getWorld(disguise.getEntity().getWorld()); - Object tracker = world.getClass().getField("tracker").get(world); - Object trackedEntities = tracker.getClass().getField("trackedEntities").get(tracker); - Object entityTrackerEntry = trackedEntities.getClass().getMethod("get", int.class) - .invoke(trackedEntities, disguise.getEntity().getEntityId()); + Object entityTrackerEntry = getEntityTrackerEntry(disguise.getEntity()); if (entityTrackerEntry != null) { HashSet trackedPlayers = (HashSet) entityTrackerEntry.getClass().getField("trackedPlayers") .get(entityTrackerEntry); @@ -499,11 +497,7 @@ public class DisguiseUtilities { public static void refreshTrackers(Entity entity) { if (entity.isValid()) { try { - Object world = ReflectionManager.getWorld(entity.getWorld()); - Object tracker = world.getClass().getField("tracker").get(world); - Object trackedEntities = tracker.getClass().getField("trackedEntities").get(tracker); - Object entityTrackerEntry = trackedEntities.getClass().getMethod("get", int.class) - .invoke(trackedEntities, entity.getEntityId()); + Object entityTrackerEntry = getEntityTrackerEntry(entity); if (entityTrackerEntry != null) { HashSet trackedPlayers = (HashSet) entityTrackerEntry.getClass().getField("trackedPlayers") .get(entityTrackerEntry); @@ -534,11 +528,7 @@ public class DisguiseUtilities { */ public static void refreshTrackers(TargetedDisguise disguise) { try { - Object world = ReflectionManager.getWorld(disguise.getEntity().getWorld()); - Object tracker = world.getClass().getField("tracker").get(world); - Object trackedEntities = tracker.getClass().getField("trackedEntities").get(tracker); - Object entityTrackerEntry = trackedEntities.getClass().getMethod("get", int.class) - .invoke(trackedEntities, disguise.getEntity().getEntityId()); + Object entityTrackerEntry = getEntityTrackerEntry(disguise.getEntity()); if (entityTrackerEntry != null) { HashSet trackedPlayers = (HashSet) entityTrackerEntry.getClass().getField("trackedPlayers") .get(entityTrackerEntry); @@ -599,11 +589,7 @@ public class DisguiseUtilities { selfDisguisesIds.remove(player.getUniqueId()); // Get the entity tracker try { - Object world = ReflectionManager.getWorld(player.getWorld()); - Object tracker = world.getClass().getField("tracker").get(world); - Object trackedEntities = tracker.getClass().getField("trackedEntities").get(tracker); - Object entityTrackerEntry = trackedEntities.getClass().getMethod("get", int.class) - .invoke(trackedEntities, player.getEntityId()); + Object entityTrackerEntry = getEntityTrackerEntry(player); if (entityTrackerEntry != null) { HashSet trackedPlayers = (HashSet) entityTrackerEntry.getClass().getField("trackedPlayers") .get(entityTrackerEntry); @@ -637,11 +623,7 @@ public class DisguiseUtilities { if (!player.isValid() || !player.isOnline() || !disguise.isSelfDisguiseVisible()) { return; } - Object world = ReflectionManager.getWorld(player.getWorld()); - Object tracker = world.getClass().getField("tracker").get(world); - Object trackedEntities = tracker.getClass().getField("trackedEntities").get(tracker); - Object entityTrackerEntry = trackedEntities.getClass().getMethod("get", int.class) - .invoke(trackedEntities, player.getEntityId()); + Object entityTrackerEntry = getEntityTrackerEntry(player); if (entityTrackerEntry == null) { // A check incase the tracker is null. // If it is, then this method will be run again in one tick. Which is when it should be constructed.