Only allow refreshing entity is the entity is valid

This commit is contained in:
libraryaddict 2014-04-19 23:14:58 +12:00
parent 4e09a64abb
commit c2e7aae201

View File

@ -383,29 +383,32 @@ public class DisguiseUtilities {
* the entity to all the watching players, which is where the magic begins * the entity to all the watching players, which is where the magic begins
*/ */
public static void refreshTracker(TargetedDisguise disguise, String player) { public static void refreshTracker(TargetedDisguise disguise, String player) {
try { if (disguise.getEntity() != null && disguise.getEntity().isValid()) {
Object world = ReflectionManager.getWorld(disguise.getEntity().getWorld()); try {
Object tracker = world.getClass().getField("tracker").get(world); Object world = ReflectionManager.getWorld(disguise.getEntity().getWorld());
Object trackedEntities = tracker.getClass().getField("trackedEntities").get(tracker); Object tracker = world.getClass().getField("tracker").get(world);
Object entityTrackerEntry = trackedEntities.getClass().getMethod("get", int.class) Object trackedEntities = tracker.getClass().getField("trackedEntities").get(tracker);
.invoke(trackedEntities, disguise.getEntity().getEntityId()); Object entityTrackerEntry = trackedEntities.getClass().getMethod("get", int.class)
if (entityTrackerEntry != null) { .invoke(trackedEntities, disguise.getEntity().getEntityId());
HashSet trackedPlayers = (HashSet) entityTrackerEntry.getClass().getField("trackedPlayers") if (entityTrackerEntry != null) {
.get(entityTrackerEntry); HashSet trackedPlayers = (HashSet) entityTrackerEntry.getClass().getField("trackedPlayers")
Method clear = entityTrackerEntry.getClass().getMethod("clear", ReflectionManager.getNmsClass("EntityPlayer")); .get(entityTrackerEntry);
Method updatePlayer = entityTrackerEntry.getClass().getMethod("updatePlayer", Method clear = entityTrackerEntry.getClass()
ReflectionManager.getNmsClass("EntityPlayer")); .getMethod("clear", ReflectionManager.getNmsClass("EntityPlayer"));
HashSet cloned = (HashSet) trackedPlayers.clone(); Method updatePlayer = entityTrackerEntry.getClass().getMethod("updatePlayer",
for (Object p : cloned) { ReflectionManager.getNmsClass("EntityPlayer"));
if (player.equals(((Player) ReflectionManager.getBukkitEntity(p)).getName())) { HashSet cloned = (HashSet) trackedPlayers.clone();
clear.invoke(entityTrackerEntry, p); for (Object p : cloned) {
updatePlayer.invoke(entityTrackerEntry, p); if (player.equals(((Player) ReflectionManager.getBukkitEntity(p)).getName())) {
break; clear.invoke(entityTrackerEntry, p);
updatePlayer.invoke(entityTrackerEntry, p);
break;
}
} }
} }
} catch (Exception ex) {
ex.printStackTrace();
} }
} catch (Exception ex) {
ex.printStackTrace();
} }
} }
@ -414,32 +417,35 @@ public class DisguiseUtilities {
* convidence method for me to refresh trackers in other plugins * convidence method for me to refresh trackers in other plugins
*/ */
public static void refreshTrackers(Entity entity) { public static void refreshTrackers(Entity entity) {
try { if (entity.isValid()) {
Object world = ReflectionManager.getWorld(entity.getWorld()); try {
Object tracker = world.getClass().getField("tracker").get(world); Object world = ReflectionManager.getWorld(entity.getWorld());
Object trackedEntities = tracker.getClass().getField("trackedEntities").get(tracker); Object tracker = world.getClass().getField("tracker").get(world);
Object entityTrackerEntry = trackedEntities.getClass().getMethod("get", int.class) Object trackedEntities = tracker.getClass().getField("trackedEntities").get(tracker);
.invoke(trackedEntities, entity.getEntityId()); Object entityTrackerEntry = trackedEntities.getClass().getMethod("get", int.class)
if (entityTrackerEntry != null) { .invoke(trackedEntities, entity.getEntityId());
HashSet trackedPlayers = (HashSet) entityTrackerEntry.getClass().getField("trackedPlayers") if (entityTrackerEntry != null) {
.get(entityTrackerEntry); HashSet trackedPlayers = (HashSet) entityTrackerEntry.getClass().getField("trackedPlayers")
Method clear = entityTrackerEntry.getClass().getMethod("clear", ReflectionManager.getNmsClass("EntityPlayer")); .get(entityTrackerEntry);
Method updatePlayer = entityTrackerEntry.getClass().getMethod("updatePlayer", Method clear = entityTrackerEntry.getClass()
ReflectionManager.getNmsClass("EntityPlayer")); .getMethod("clear", ReflectionManager.getNmsClass("EntityPlayer"));
HashSet cloned = (HashSet) trackedPlayers.clone(); Method updatePlayer = entityTrackerEntry.getClass().getMethod("updatePlayer",
for (Object p : cloned) { ReflectionManager.getNmsClass("EntityPlayer"));
Player player = (Player) ReflectionManager.getBukkitEntity(p); HashSet cloned = (HashSet) trackedPlayers.clone();
// if (entity instanceof Player && !((Player) ReflectionManager.getBukkitEntity(player)).canSee((Player) for (Object p : cloned) {
// entity)) Player player = (Player) ReflectionManager.getBukkitEntity(p);
// continue; // if (entity instanceof Player && !((Player) ReflectionManager.getBukkitEntity(player)).canSee((Player)
if (!(entity instanceof Player) || player.canSee((Player) entity)) { // entity))
clear.invoke(entityTrackerEntry, p); // continue;
updatePlayer.invoke(entityTrackerEntry, p); if (!(entity instanceof Player) || player.canSee((Player) entity)) {
clear.invoke(entityTrackerEntry, p);
updatePlayer.invoke(entityTrackerEntry, p);
}
} }
} }
} catch (Exception ex) {
ex.printStackTrace();
} }
} catch (Exception ex) {
ex.printStackTrace();
} }
} }