diff --git a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index 3980f9a3..cf164405 100644 --- a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -294,6 +294,39 @@ public class DisguiseUtilities { } } + /** + * @param A convidence method for me to refresh trackers in other plugins + */ + public static void refreshTrackers(Entity entity) { + 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()); + if (entityTrackerEntry != null) { + HashSet trackedPlayers = (HashSet) entityTrackerEntry.getClass().getField("trackedPlayers") + .get(entityTrackerEntry); + Method clear = entityTrackerEntry.getClass().getMethod("clear", ReflectionManager.getNmsClass("EntityPlayer")); + Method updatePlayer = entityTrackerEntry.getClass().getMethod("updatePlayer", + ReflectionManager.getNmsClass("EntityPlayer")); + HashSet cloned = (HashSet) trackedPlayers.clone(); + for (Object p : cloned) { + Player player = (Player) ReflectionManager.getBukkitEntity(p); + // if (entity instanceof Player && !((Player) ReflectionManager.getBukkitEntity(player)).canSee((Player) + // entity)) + // continue; + if (!(entity instanceof Player) || player.canSee((Player) entity)) { + clear.invoke(entityTrackerEntry, p); + updatePlayer.invoke(entityTrackerEntry, p); + } + } + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + /** * @param Resends * the entity to all the watching players, which is where the magic begins @@ -386,22 +419,6 @@ 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) { - PacketContainer[] packets = PacketsManager.transformPacket(packet, player, player); - try { - for (PacketContainer p : packets) { - p = p.deepClone(); - p.getIntegers().write(0, fakeId); - ProtocolLibrary.getProtocolManager().sendServerPacket(player, p, false); - } - } catch (InvocationTargetException e) { - e.printStackTrace(); - } - } - /** * Sends the self disguise to the player */ @@ -507,6 +524,22 @@ 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) { + PacketContainer[] packets = PacketsManager.transformPacket(packet, player, player); + try { + for (PacketContainer p : packets) { + p = p.deepClone(); + p.getIntegers().write(0, fakeId); + ProtocolLibrary.getProtocolManager().sendServerPacket(player, p, false); + } + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + /** * Setup it so he can see himself when disguised */