From d8548400a63ab5745852919ee605f4051aea2a8e Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Mon, 2 Dec 2013 01:32:38 +1300 Subject: [PATCH 01/33] Start of a targetted disguise --- .../libraryaddict/disguise/DisguiseAPI.java | 9 ++- .../disguise/disguisetypes/Disguise.java | 13 ++-- .../disguise/disguisetypes/MiscDisguise.java | 2 +- .../disguise/disguisetypes/MobDisguise.java | 2 +- .../disguisetypes/PlayerDisguise.java | 2 +- .../disguisetypes/TargettedDisguise.java | 34 +++++++++++ .../disguise/utilities/DisguiseUtilities.java | 60 +++++++++++++++++-- 7 files changed, 101 insertions(+), 21 deletions(-) create mode 100644 src/me/libraryaddict/disguise/disguisetypes/TargettedDisguise.java diff --git a/src/me/libraryaddict/disguise/DisguiseAPI.java b/src/me/libraryaddict/disguise/DisguiseAPI.java index d230d7af..de109dc1 100644 --- a/src/me/libraryaddict/disguise/DisguiseAPI.java +++ b/src/me/libraryaddict/disguise/DisguiseAPI.java @@ -2,6 +2,7 @@ package me.libraryaddict.disguise; import java.lang.reflect.Field; import me.libraryaddict.disguise.disguisetypes.Disguise; +import me.libraryaddict.disguise.disguisetypes.TargettedDisguise; import me.libraryaddict.disguise.events.DisguiseEvent; import me.libraryaddict.disguise.events.UndisguiseEvent; import me.libraryaddict.disguise.utilities.DisguiseUtilities; @@ -36,7 +37,7 @@ public class DisguiseAPI { Field field = ReflectionManager.getNmsClass("Entity").getDeclaredField("entityCount"); field.setAccessible(true); int id = field.getInt(null); - DisguiseUtilities.getDisguises().put(id, disguise); + DisguiseUtilities.addDisguise(id, (TargettedDisguise) disguise); } catch (Exception ex) { ex.printStackTrace(); } @@ -70,7 +71,7 @@ public class DisguiseAPI { } // If there was a old disguise Disguise oldDisguise = getDisguise(entity); // Stick the disguise in the disguises bin - DisguiseUtilities.getDisguises().put(entity.getEntityId(), disguise); + DisguiseUtilities.addDisguise(entity.getEntityId(), (TargettedDisguise) disguise); // Resend the disguised entity's packet DisguiseUtilities.refreshTrackers(entity); // If he is a player, then self disguise himself @@ -86,9 +87,7 @@ public class DisguiseAPI { public static Disguise getDisguise(Entity disguised) { if (disguised == null) return null; - if (DisguiseUtilities.getDisguises().containsKey(disguised.getEntityId())) - return DisguiseUtilities.getDisguises().get(disguised.getEntityId()); - return null; + return DisguiseUtilities.getDisguise(disguised.getEntityId()); } /** diff --git a/src/me/libraryaddict/disguise/disguisetypes/Disguise.java b/src/me/libraryaddict/disguise/disguisetypes/Disguise.java index edbba176..7742514b 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/Disguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/Disguise.java @@ -61,7 +61,7 @@ public abstract class Disguise { setReplaceSounds(doSounds); // Get if they are a adult now.. boolean isAdult = true; - if (this instanceof MobDisguise) { + if (isMobDisguise()) { isAdult = ((MobDisguise) this).isAdult(); } try { @@ -368,17 +368,14 @@ public abstract class Disguise { velocityRunnable.cancel(); } catch (Exception ex) { } - HashMap disguises = DisguiseUtilities.getDisguises(); + HashMap> disguises = DisguiseUtilities.getDisguises(); // If this disguise has a entity set if (getEntity() != null) { // If the entity is valid if (getEntity().isValid()) { // If this disguise is active - if (disguises.containsKey(getEntity().getEntityId()) && disguises.get(getEntity().getEntityId()) == this) { - // Now remove the disguise from the current disguises. - disguises.remove(getEntity().getEntityId()); - // Gotta do reflection, copy code or open up calls. - // Reflection is the cleanest? + // Remove the disguise from the current disguises. + if (DisguiseUtilities.removeDisguise((TargettedDisguise) this)) { if (getEntity() instanceof Player) { DisguiseUtilities.removeSelfDisguise((Player) getEntity()); } @@ -391,7 +388,7 @@ public abstract class Disguise { Iterator itel = disguises.keySet().iterator(); while (itel.hasNext()) { int id = itel.next(); - if (disguises.get(id) == this) { + if (disguises.get(id).remove(this) && disguises.get(id).isEmpty()) { itel.remove(); } } diff --git a/src/me/libraryaddict/disguise/disguisetypes/MiscDisguise.java b/src/me/libraryaddict/disguise/disguisetypes/MiscDisguise.java index 0ea7942f..e11652d1 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/MiscDisguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/MiscDisguise.java @@ -11,7 +11,7 @@ import org.bukkit.Art; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; -public class MiscDisguise extends Disguise { +public class MiscDisguise extends TargettedDisguise { private int data = -1; private int id = -1; diff --git a/src/me/libraryaddict/disguise/disguisetypes/MobDisguise.java b/src/me/libraryaddict/disguise/disguisetypes/MobDisguise.java index b4bca238..09f442b9 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/MobDisguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/MobDisguise.java @@ -5,7 +5,7 @@ import me.libraryaddict.disguise.disguisetypes.watchers.ZombieWatcher; import org.bukkit.entity.EntityType; -public class MobDisguise extends Disguise { +public class MobDisguise extends TargettedDisguise { private boolean isAdult; diff --git a/src/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java b/src/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java index 00c7036b..d0621efd 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java @@ -1,6 +1,6 @@ package me.libraryaddict.disguise.disguisetypes; -public class PlayerDisguise extends Disguise { +public class PlayerDisguise extends TargettedDisguise { private String playerName; public PlayerDisguise(String name) { diff --git a/src/me/libraryaddict/disguise/disguisetypes/TargettedDisguise.java b/src/me/libraryaddict/disguise/disguisetypes/TargettedDisguise.java new file mode 100644 index 00000000..950f2b15 --- /dev/null +++ b/src/me/libraryaddict/disguise/disguisetypes/TargettedDisguise.java @@ -0,0 +1,34 @@ +package me.libraryaddict.disguise.disguisetypes; + +import java.util.HashSet; + +import org.bukkit.entity.Player; + +public abstract class TargettedDisguise extends Disguise { + public enum TargetType { + SHOW_TO_THESE, HIDE_FROM_THESE; + } + + private HashSet disguiseViewers = new HashSet(); + private TargetType targetType = TargetType.HIDE_FROM_THESE; + + public boolean canSee(Player player) { + return canSee(player.getName()); + } + + public boolean canSee(String playername) { + return disguiseViewers.contains(playername); + } + + public void setViewDisguise(Player player) { + setViewDisguise(player.getName()); + } + + public void setViewDisguise(String playername) { + disguiseViewers.add(playername); + } + + public TargetType getTargetType() { + return targetType; + } +} diff --git a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index 15aa569c..301893ca 100644 --- a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -8,6 +8,8 @@ import java.util.Iterator; import me.libraryaddict.disguise.LibsDisguises; import me.libraryaddict.disguise.disguisetypes.Disguise; +import me.libraryaddict.disguise.disguisetypes.TargettedDisguise; +import me.libraryaddict.disguise.disguisetypes.TargettedDisguise.TargetType; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -26,14 +28,14 @@ import com.comphenix.protocol.wrappers.WrappedDataWatcher; public class DisguiseUtilities { // Store the entity IDs instead of entitys because then I can disguise entitys even before they exist - private static HashMap disguises = new HashMap(); + private static HashMap> targetedDisguises = new HashMap>(); private static LibsDisguises libsDisguises; // A internal storage of fake entity ID's I can use. // Realistically I could probably use a ID like "4" for everyone, seeing as no one shares the ID private static HashMap selfDisguisesIds = new HashMap(); - public static HashMap getDisguises() { - return disguises; + public static HashMap> getDisguises() { + return targetedDisguises; } public static HashMap getSelfDisguisesIds() { @@ -222,14 +224,62 @@ public class DisguiseUtilities { } } + public static void addDisguise(int entityId, TargettedDisguise disguise) { + if (!getDisguises().containsKey(entityId)) { + getDisguises().put(entityId, new HashSet()); + } + getDisguises().get(entityId).add(disguise); + } + + public static boolean removeDisguise(TargettedDisguise disguise) { + int entityId = disguise.getEntity().getEntityId(); + if (getDisguises().containsKey(entityId) && getDisguises().get(entityId).remove(disguise)) { + if (getDisguises().get(entityId).isEmpty()) { + getDisguises().remove(entityId); + } + return true; + } + return false; + } + + public static TargettedDisguise getDisguise(int entityId) { + TargettedDisguise toReturn = null; + if (getDisguises().containsKey(entityId)) { + for (TargettedDisguise disguise : getDisguises().get(entityId)) { + if (disguise.getTargetType() == TargetType.HIDE_FROM_THESE) { + return disguise; + } + if (toReturn == null) { + toReturn = disguise; + } + } + } + return toReturn; + } + + public static TargettedDisguise getDisguise(Player observer, int entityId) { + if (getDisguises().containsKey(entityId)) { + for (TargettedDisguise disguise : getDisguises().get(entityId)) { + if (disguise.getTargetType() == TargetType.HIDE_FROM_THESE && !disguise.canSee(observer)) { + return disguise; + } else if (disguise.getTargetType() == TargetType.SHOW_TO_THESE && disguise.canSee(observer)) { + return disguise; + } + } + } + return null; + } + /** * Setup it so he can see himself when disguised */ public static void setupFakeDisguise(final Disguise disguise) { + Entity e = disguise.getEntity(); // If the disguises entity is null, or the disguised entity isn't a player return - if (disguise.getEntity() == null || !(disguise.getEntity() instanceof Player) || !disguises.containsValue(disguise)) + if (e == null || !(e instanceof Player) || !getDisguises().containsKey(e.getEntityId()) + || !getDisguises().get(e).contains(disguise)) return; - Player player = (Player) disguise.getEntity(); + Player player = (Player) e; // Remove the old disguise, else we have weird disguises around the place DisguiseUtilities.removeSelfDisguise(player); // If the disguised player can't see himself. Return From 7505b0aca80b2b4bdd81cb9075903471b952d240 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Mon, 2 Dec 2013 01:34:27 +1300 Subject: [PATCH 02/33] Make getPerverts return only the people who can see the disguise --- src/me/libraryaddict/disguise/disguisetypes/Disguise.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/me/libraryaddict/disguise/disguisetypes/Disguise.java b/src/me/libraryaddict/disguise/disguisetypes/Disguise.java index 7742514b..4e68c532 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/Disguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/Disguise.java @@ -283,7 +283,7 @@ public abstract class Disguise { } /** - * Get all EntityPlayers who have this entity in their Entity Tracker + * Get all EntityPlayers who have this entity in their Entity Tracker And they are in the targetted disguise. */ protected ArrayList getPerverts() { ArrayList players = new ArrayList(); @@ -297,7 +297,10 @@ public abstract class Disguise { HashSet trackedPlayers = (HashSet) entityTrackerEntry.getClass().getField("trackedPlayers") .get(entityTrackerEntry); for (Object p : trackedPlayers) { - players.add((Player) ReflectionManager.getBukkitEntity(p)); + Player player = (Player) ReflectionManager.getBukkitEntity(p); + if (((TargettedDisguise) this).canSee(player)) { + players.add(player); + } } } } catch (Exception ex) { From 58485e9b1c6afd55a20e6618fc10a28002372f14 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Mon, 2 Dec 2013 01:35:20 +1300 Subject: [PATCH 03/33] Make canSee do stuff --- .../disguise/disguisetypes/TargettedDisguise.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/me/libraryaddict/disguise/disguisetypes/TargettedDisguise.java b/src/me/libraryaddict/disguise/disguisetypes/TargettedDisguise.java index 950f2b15..364aed37 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/TargettedDisguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/TargettedDisguise.java @@ -17,7 +17,11 @@ public abstract class TargettedDisguise extends Disguise { } public boolean canSee(String playername) { - return disguiseViewers.contains(playername); + boolean contains = disguiseViewers.contains(playername); + if (targetType == TargetType.HIDE_FROM_THESE) { + return !contains; + } + return contains; } public void setViewDisguise(Player player) { From 4aa148d1eb3d7464452a3a04b341009c2f4842ba Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Mon, 2 Dec 2013 01:35:43 +1300 Subject: [PATCH 04/33] Update other code to reflect this --- .../libraryaddict/disguise/utilities/DisguiseUtilities.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index 301893ca..0509608c 100644 --- a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -260,9 +260,7 @@ public class DisguiseUtilities { public static TargettedDisguise getDisguise(Player observer, int entityId) { if (getDisguises().containsKey(entityId)) { for (TargettedDisguise disguise : getDisguises().get(entityId)) { - if (disguise.getTargetType() == TargetType.HIDE_FROM_THESE && !disguise.canSee(observer)) { - return disguise; - } else if (disguise.getTargetType() == TargetType.SHOW_TO_THESE && disguise.canSee(observer)) { + if (disguise.canSee(observer)) { return disguise; } } From 25a6e713afb5fdca21c0ce0eab4bc0751dc79d5c Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Mon, 2 Dec 2013 01:36:55 +1300 Subject: [PATCH 05/33] Don't bother checking if the entity is disguised before cancelling packet as it should be cancelled anyways --- src/me/libraryaddict/disguise/utilities/PacketsManager.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/me/libraryaddict/disguise/utilities/PacketsManager.java b/src/me/libraryaddict/disguise/utilities/PacketsManager.java index ae8e4ebb..1966f4fc 100644 --- a/src/me/libraryaddict/disguise/utilities/PacketsManager.java +++ b/src/me/libraryaddict/disguise/utilities/PacketsManager.java @@ -111,8 +111,7 @@ public class PacketsManager { Player observer = event.getPlayer(); StructureModifier entityModifer = event.getPacket().getEntityModifier(observer.getWorld()); org.bukkit.entity.Entity entity = entityModifer.read(1); - if (DisguiseAPI.isDisguised(entity) - && (entity instanceof ExperienceOrb || entity instanceof Item || entity instanceof Arrow)) { + if (entity instanceof ExperienceOrb || entity instanceof Item || entity instanceof Arrow) { event.setCancelled(true); } } catch (Exception e) { From a969811c64d4f638ab7f1ef6d718596fac8f56ae Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Mon, 2 Dec 2013 02:36:42 +1300 Subject: [PATCH 06/33] More stuff including a small amount of cleanup --- .../libraryaddict/disguise/DisguiseAPI.java | 25 +++++++++++++++++++ .../disguise/DisguiseListener.java | 21 ++++++++-------- .../disguise/disguisetypes/Disguise.java | 8 +++--- .../disguise/disguisetypes/MiscDisguise.java | 4 +++ .../disguise/disguisetypes/MobDisguise.java | 6 +++++ .../disguisetypes/PlayerDisguise.java | 5 ++++ .../disguisetypes/TargettedDisguise.java | 13 ++++++++++ .../disguise/utilities/DisguiseUtilities.java | 11 +++++++- .../disguise/utilities/PacketsManager.java | 21 +++++++++------- 9 files changed, 90 insertions(+), 24 deletions(-) diff --git a/src/me/libraryaddict/disguise/DisguiseAPI.java b/src/me/libraryaddict/disguise/DisguiseAPI.java index de109dc1..2454df74 100644 --- a/src/me/libraryaddict/disguise/DisguiseAPI.java +++ b/src/me/libraryaddict/disguise/DisguiseAPI.java @@ -11,6 +11,7 @@ import me.libraryaddict.disguise.utilities.ReflectionManager; import org.bukkit.Bukkit; import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; public class DisguiseAPI { private static boolean hearSelfDisguise; @@ -47,6 +48,7 @@ public class DisguiseAPI { * Disguise this entity with this disguise */ public static void disguiseToAll(Entity entity, Disguise disguise) { + // TODO Make everyone see this disguise. Remove any old disguises. // If they are trying to disguise a null entity or use a null disguise // Just return. if (entity == null || disguise == null) @@ -84,12 +86,22 @@ public class DisguiseAPI { /** * Get the disguise of a entity */ + @Deprecated public static Disguise getDisguise(Entity disguised) { if (disguised == null) return null; return DisguiseUtilities.getDisguise(disguised.getEntityId()); } + /** + * Get the disguise of a entity + */ + public static Disguise getDisguise(Player observer, Entity disguised) { + if (disguised == null) + return null; + return DisguiseUtilities.getDisguise(observer, disguised.getEntityId()); + } + /** * Get the ID of a fake disguise for a entityplayer */ @@ -102,10 +114,22 @@ public class DisguiseAPI { /** * Is this entity disguised */ + @Deprecated public static boolean isDisguised(Entity disguised) { return getDisguise(disguised) != null; } + public static boolean isDisguiseInUse(Disguise disguise) { + return DisguiseUtilities.isDisguiseInUse(disguise); + } + + /** + * Is this entity disguised + */ + public static boolean isDisguised(Player observer, Entity disguised) { + return getDisguise(observer, disguised) != null; + } + public static boolean isEntityAnimationsAdded() { return isEntityAnimationsAdded; } @@ -213,6 +237,7 @@ public class DisguiseAPI { * the world. */ public static void undisguiseToAll(Entity entity) { + // TODO Make all of these disguises be removed Disguise disguise = getDisguise(entity); if (disguise == null) return; diff --git a/src/me/libraryaddict/disguise/DisguiseListener.java b/src/me/libraryaddict/disguise/DisguiseListener.java index b3f60fe7..13d4d2bf 100644 --- a/src/me/libraryaddict/disguise/DisguiseListener.java +++ b/src/me/libraryaddict/disguise/DisguiseListener.java @@ -92,8 +92,7 @@ public class DisguiseListener implements Listener { public void onVechileEnter(VehicleEnterEvent event) { if (event.isCancelled()) return; - Disguise disguise = DisguiseAPI.getDisguise(event.getEntered()); - if (disguise != null && event.getEntered() instanceof Player) { + if (event.getEntered() instanceof Player && DisguiseAPI.isDisguised((Player) event.getEntered(), event.getEntered())) { DisguiseUtilities.removeSelfDisguise((Player) event.getEntered()); ((Player) event.getEntered()).updateInventory(); } @@ -103,14 +102,16 @@ public class DisguiseListener implements Listener { public void onVechileLeave(VehicleExitEvent event) { if (event.isCancelled()) return; - final Disguise disguise = DisguiseAPI.getDisguise(event.getExited()); - if (disguise != null && event.getExited() instanceof Player) { - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { - public void run() { - DisguiseUtilities.setupFakeDisguise(disguise); - ((Player) disguise.getEntity()).updateInventory(); - } - }); + if (event.getExited() instanceof Player) { + final Disguise disguise = DisguiseAPI.getDisguise((Player) event.getExited(), event.getExited()); + if (disguise != null) { + Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { + public void run() { + DisguiseUtilities.setupFakeDisguise(disguise); + ((Player) disguise.getEntity()).updateInventory(); + } + }); + } } } diff --git a/src/me/libraryaddict/disguise/disguisetypes/Disguise.java b/src/me/libraryaddict/disguise/disguisetypes/Disguise.java index 4e68c532..3cec8cec 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/Disguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/Disguise.java @@ -332,15 +332,15 @@ public abstract class Disguise { } public boolean isMiscDisguise() { - return this instanceof MiscDisguise; + return false; } public boolean isMobDisguise() { - return this instanceof MobDisguise; + return false; } public boolean isPlayerDisguise() { - return this instanceof PlayerDisguise; + return false; } public boolean isSelfDisguiseSoundsReplaced() { @@ -550,7 +550,7 @@ public abstract class Disguise { if (this.viewSelfDisguise != viewSelfDisguise) { this.viewSelfDisguise = viewSelfDisguise; if (getEntity() != null && getEntity() instanceof Player) { - if (DisguiseAPI.getDisguise(getEntity()) == this) { + if (DisguiseAPI.getDisguise((Player) getEntity(), getEntity()) == this) { if (viewSelfDisguise) { DisguiseUtilities.setupFakeDisguise(this); } else diff --git a/src/me/libraryaddict/disguise/disguisetypes/MiscDisguise.java b/src/me/libraryaddict/disguise/disguisetypes/MiscDisguise.java index e11652d1..97d6db0a 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/MiscDisguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/MiscDisguise.java @@ -29,6 +29,10 @@ public class MiscDisguise extends TargettedDisguise { || disguiseType == DisguiseType.DROPPED_ITEM ? -1 : addictionalData)); } + public boolean isMiscDisguise() { + return true; + } + public MiscDisguise(DisguiseType disguiseType, boolean replaceSounds, int id, int data) { createDisguise(disguiseType, replaceSounds); switch (disguiseType) { diff --git a/src/me/libraryaddict/disguise/disguisetypes/MobDisguise.java b/src/me/libraryaddict/disguise/disguisetypes/MobDisguise.java index 09f442b9..4b05daaf 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/MobDisguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/MobDisguise.java @@ -21,6 +21,12 @@ public class MobDisguise extends TargettedDisguise { this.isAdult = isAdult; createDisguise(disguiseType, replaceSounds); } + + + public boolean isMobDisguise() { + return true; + } + @Deprecated public MobDisguise(EntityType entityType) { diff --git a/src/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java b/src/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java index d0621efd..c2b82b9e 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java @@ -14,6 +14,11 @@ public class PlayerDisguise extends TargettedDisguise { createDisguise(DisguiseType.PLAYER, replaceSounds); } + @Override + public boolean isPlayerDisguise() { + return true; + } + @Override public PlayerDisguise clone() { PlayerDisguise disguise = new PlayerDisguise(getName(), isSoundsReplaced()); diff --git a/src/me/libraryaddict/disguise/disguisetypes/TargettedDisguise.java b/src/me/libraryaddict/disguise/disguisetypes/TargettedDisguise.java index 364aed37..f0ae3986 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/TargettedDisguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/TargettedDisguise.java @@ -2,6 +2,8 @@ package me.libraryaddict.disguise.disguisetypes; import java.util.HashSet; +import me.libraryaddict.disguise.utilities.DisguiseUtilities; + import org.bukkit.entity.Player; public abstract class TargettedDisguise extends Disguise { @@ -9,6 +11,13 @@ public abstract class TargettedDisguise extends Disguise { SHOW_TO_THESE, HIDE_FROM_THESE; } + public void setTargetType(TargetType newTargetType) { + if (DisguiseUtilities.isDisguiseInUse(this)) { + throw new RuntimeException("Cannot set the disguise target after the entity has been disguised"); + } + targetType = newTargetType; + } + private HashSet disguiseViewers = new HashSet(); private TargetType targetType = TargetType.HIDE_FROM_THESE; @@ -16,6 +25,10 @@ public abstract class TargettedDisguise extends Disguise { return canSee(player.getName()); } + public HashSet getObservers() { + return disguiseViewers; + } + public boolean canSee(String playername) { boolean contains = disguiseViewers.contains(playername); if (targetType == TargetType.HIDE_FROM_THESE) { diff --git a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index 0509608c..8ada30c9 100644 --- a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -46,6 +46,14 @@ public class DisguiseUtilities { libsDisguises = disguises; } + public static boolean isDisguiseInUse(Disguise disguise) { + if (getDisguises().containsKey(disguise.getEntity().getEntityId()) + && getDisguises().get(disguise.getEntity().getEntityId()).contains(disguise)) { + return true; + } + return false; + } + /** * @param Resends * the entity to all the watching players, which is where the magic begins @@ -242,11 +250,12 @@ public class DisguiseUtilities { return false; } + @Deprecated public static TargettedDisguise getDisguise(int entityId) { TargettedDisguise toReturn = null; if (getDisguises().containsKey(entityId)) { for (TargettedDisguise disguise : getDisguises().get(entityId)) { - if (disguise.getTargetType() == TargetType.HIDE_FROM_THESE) { + if (disguise.getTargetType() == TargetType.HIDE_FROM_THESE && disguise.getObservers().isEmpty()) { return disguise; } if (toReturn == null) { diff --git a/src/me/libraryaddict/disguise/utilities/PacketsManager.java b/src/me/libraryaddict/disguise/utilities/PacketsManager.java index 1966f4fc..2cebad98 100644 --- a/src/me/libraryaddict/disguise/utilities/PacketsManager.java +++ b/src/me/libraryaddict/disguise/utilities/PacketsManager.java @@ -467,8 +467,10 @@ public class PacketsManager { ((Integer) mods.read(2)) / 8D, ((Integer) mods.read(3)) / 8D); Entity disguisedEntity = null; DisguiseSound entitySound = null; + Disguise disguise = null; for (Entity entity : soundLoc.getChunk().getEntities()) { - if (DisguiseAPI.isDisguised(entity)) { + Disguise entityDisguise = DisguiseAPI.getDisguise(observer, entity); + if (entityDisguise != null) { Location loc = entity.getLocation(); loc = new Location(observer.getWorld(), ((int) (loc.getX() * 8)) / 8D, ((int) (loc.getY() * 8)) / 8D, ((int) (loc.getZ() * 8)) / 8D); @@ -506,6 +508,7 @@ public class PacketsManager { soundType = entitySound.getType(soundName, !hasInvun); } if (soundType != null) { + disguise = entityDisguise; disguisedEntity = entity; break; } @@ -513,7 +516,6 @@ public class PacketsManager { } } } - Disguise disguise = DisguiseAPI.getDisguise(disguisedEntity); if (disguise != null) { if (disguise.isSelfDisguiseSoundsReplaced() || disguisedEntity != event.getPlayer()) { if (disguise.isSoundsReplaced()) { @@ -599,7 +601,7 @@ public class PacketsManager { if ((Byte) mods.read(1) == 1) { // It made a damage animation Entity entity = event.getPacket().getEntityModifier(observer.getWorld()).read(0); - Disguise disguise = DisguiseAPI.getDisguise(entity); + Disguise disguise = DisguiseAPI.getDisguise(observer, entity); if (disguise != null && (disguise.isSelfDisguiseSoundsReplaced() || entity != event.getPlayer())) { DisguiseSound disSound = DisguiseSound.getType(entity.getType().name()); if (disSound == null) @@ -769,7 +771,7 @@ public class PacketsManager { public void onPacketSending(PacketEvent event) { // If the inventory is the players inventory if (event.getPlayer().getVehicle() == null && event.getPacket().getIntegers().read(0) == 0) { - Disguise disguise = DisguiseAPI.getDisguise(event.getPlayer()); + Disguise disguise = DisguiseAPI.getDisguise(event.getPlayer(), event.getPlayer()); // If the player is disguised, views self disguises and is hiding a item. if (disguise != null && disguise.isSelfDisguiseVisible() && (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf())) { @@ -860,7 +862,7 @@ public class PacketsManager { @Override public void onPacketReceiving(final PacketEvent event) { if (event.getPlayer().getVehicle() == null) { - Disguise disguise = DisguiseAPI.getDisguise(event.getPlayer()); + Disguise disguise = DisguiseAPI.getDisguise(event.getPlayer(), event.getPlayer()); // If player is disguised, views self disguises and has a inventory modifier if (disguise != null && disguise.isSelfDisguiseVisible() && (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf())) { @@ -1056,7 +1058,7 @@ public class PacketsManager { ProtocolLibrary.getProtocolManager().removePacketListener(inventoryListenerServer); } for (Player player : Bukkit.getOnlinePlayers()) { - Disguise disguise = DisguiseAPI.getDisguise(player); + Disguise disguise = DisguiseAPI.getDisguise(player, player); if (disguise != null) { if (viewDisguisesListenerEnabled && disguise.isSelfDisguiseVisible() && (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf())) { @@ -1076,7 +1078,7 @@ public class PacketsManager { ProtocolLibrary.getProtocolManager().removePacketListener(viewDisguisesListener); } for (Player player : Bukkit.getOnlinePlayers()) { - Disguise disguise = DisguiseAPI.getDisguise(player); + Disguise disguise = DisguiseAPI.getDisguise(player, player); if (disguise != null) { if (disguise.isSelfDisguiseVisible()) { if (enabled) { @@ -1102,7 +1104,7 @@ public class PacketsManager { // First get the entity, the one sending this packet StructureModifier entityModifer = sentPacket.getEntityModifier(observer.getWorld()); org.bukkit.entity.Entity entity = entityModifer.read((Packets.Server.COLLECT == sentPacket.getID() ? 1 : 0)); - Disguise disguise = DisguiseAPI.getDisguise(entity); + Disguise disguise = DisguiseAPI.getDisguise(observer, entity); // If disguised. if (disguise != null) { // If packet is Packets.Server.UPDATE_ATTRIBUTES @@ -1157,8 +1159,9 @@ public class PacketsManager { case Packets.Server.COLLECT: { - if (disguise.getType().isMisc()) + if (disguise.getType().isMisc()) { packets = new PacketContainer[0]; + } break; } From 4dc68539450c03c6534c372f39616ef8feb2b05f Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Mon, 2 Dec 2013 03:31:54 +1300 Subject: [PATCH 07/33] Clean up code. Add in code. Forgot what I did. --- .../libraryaddict/disguise/DisguiseAPI.java | 38 +++++++++++++------ .../disguise/disguisetypes/FlagWatcher.java | 9 +++-- .../disguise/utilities/DisguiseUtilities.java | 7 ++++ 3 files changed, 38 insertions(+), 16 deletions(-) diff --git a/src/me/libraryaddict/disguise/DisguiseAPI.java b/src/me/libraryaddict/disguise/DisguiseAPI.java index 2454df74..a800910b 100644 --- a/src/me/libraryaddict/disguise/DisguiseAPI.java +++ b/src/me/libraryaddict/disguise/DisguiseAPI.java @@ -3,6 +3,7 @@ package me.libraryaddict.disguise; import java.lang.reflect.Field; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.TargettedDisguise; +import me.libraryaddict.disguise.disguisetypes.TargettedDisguise.TargetType; import me.libraryaddict.disguise.events.DisguiseEvent; import me.libraryaddict.disguise.events.UndisguiseEvent; import me.libraryaddict.disguise.utilities.DisguiseUtilities; @@ -48,11 +49,13 @@ public class DisguiseAPI { * Disguise this entity with this disguise */ public static void disguiseToAll(Entity entity, Disguise disguise) { - // TODO Make everyone see this disguise. Remove any old disguises. // If they are trying to disguise a null entity or use a null disguise // Just return. if (entity == null || disguise == null) return; + // You called the disguiseToAll method foolish mortal! Prepare to have your custom settings wiped!!! + ((TargettedDisguise) disguise).setTargetType(TargetType.HIDE_FROM_THESE); + ((TargettedDisguise) disguise).getObservers().clear(); // Fire a disguise event DisguiseEvent event = new DisguiseEvent(entity, disguise); Bukkit.getPluginManager().callEvent(event); @@ -71,7 +74,7 @@ public class DisguiseAPI { // Set the disguise's entity disguise.setEntity(entity); } // If there was a old disguise - Disguise oldDisguise = getDisguise(entity); + Disguise[] oldDisguises = getDisguises(entity); // Stick the disguise in the disguises bin DisguiseUtilities.addDisguise(entity.getEntityId(), (TargettedDisguise) disguise); // Resend the disguised entity's packet @@ -79,8 +82,11 @@ public class DisguiseAPI { // If he is a player, then self disguise himself DisguiseUtilities.setupFakeDisguise(disguise); // Discard the disguise - if (oldDisguise != null) + for (Disguise oldDisguise : oldDisguises) { oldDisguise.removeDisguise(); + // Make everyone see this disguise. Remove any old disguises. + DisguiseUtilities.getDisguises().remove(entity.getEntityId()); + } } /** @@ -93,6 +99,15 @@ public class DisguiseAPI { return DisguiseUtilities.getDisguise(disguised.getEntityId()); } + /** + * Get the disguises of a entity + */ + public static Disguise[] getDisguises(Entity disguised) { + if (disguised == null) + return null; + return DisguiseUtilities.getDisguises(disguised.getEntityId()); + } + /** * Get the disguise of a entity */ @@ -237,15 +252,14 @@ public class DisguiseAPI { * the world. */ public static void undisguiseToAll(Entity entity) { - // TODO Make all of these disguises be removed - Disguise disguise = getDisguise(entity); - if (disguise == null) - return; - UndisguiseEvent event = new UndisguiseEvent(entity, disguise); - Bukkit.getPluginManager().callEvent(event); - if (event.isCancelled()) - return; - disguise.removeDisguise(); + Disguise[] disguises = getDisguises(entity); + for (Disguise disguise : disguises) { + UndisguiseEvent event = new UndisguiseEvent(entity, disguise); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) + continue; + disguise.removeDisguise(); + } } private DisguiseAPI() { diff --git a/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java index 4a3de874..aabc30cc 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java @@ -129,7 +129,8 @@ public class FlagWatcher { } } // Here we check for if there is a health packet that says they died. - if (disguise.isSelfDisguiseVisible() && getDisguise().getEntity() != null && getDisguise().getEntity() instanceof Player) { + if (getDisguise().isSelfDisguiseVisible() && getDisguise().getEntity() != null + && getDisguise().getEntity() instanceof Player) { for (WrappedWatchableObject watch : newList) { // Its a health packet if (watch.getIndex() == 6) { @@ -217,7 +218,7 @@ public class FlagWatcher { } protected void sendData(int data) { - if (disguise.getWatcher() == null || DisguiseAPI.getDisguise(disguise.getEntity()) != disguise) + if (getDisguise().getWatcher() == null || !DisguiseAPI.isDisguiseInUse(getDisguise())) return; if (!entityValues.containsKey(data) || entityValues.get(data) == null) return; @@ -283,7 +284,7 @@ public class FlagWatcher { // Itemstack which is null means that its not replacing the disguises itemstack. if (itemStack == null) { // Find the item to replace it with - if (disguise.getEntity() instanceof LivingEntity) { + if (getDisguise().getEntity() instanceof LivingEntity) { EntityEquipment enquipment = ((LivingEntity) getDisguise().getEntity()).getEquipment(); if (slot == 0) { itemStack = enquipment.getItemInHand(); @@ -299,7 +300,7 @@ public class FlagWatcher { if (itemStack != null && itemStack.getTypeId() != 0) itemToSend = ReflectionManager.getNmsItem(itemStack); items[slot] = itemStack; - if (DisguiseAPI.getDisguise(disguise.getEntity()) != disguise) + if (!DisguiseAPI.isDisguiseInUse(getDisguise())) return; slot++; if (slot > 4) diff --git a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index 8ada30c9..01555947 100644 --- a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -266,6 +266,13 @@ public class DisguiseUtilities { return toReturn; } + public static TargettedDisguise[] getDisguises(int entityId) { + if (getDisguises().containsKey(entityId)) { + return getDisguises().get(entityId).toArray(new TargettedDisguise[getDisguises().get(entityId).size()]); + } + return new TargettedDisguise[0]; + } + public static TargettedDisguise getDisguise(Player observer, int entityId) { if (getDisguises().containsKey(entityId)) { for (TargettedDisguise disguise : getDisguises().get(entityId)) { From efa75e677f2e8f445243159371e0b252fd1b67d4 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Mon, 2 Dec 2013 04:37:07 +1300 Subject: [PATCH 08/33] More stuff. Self disguises no work :( --- .../libraryaddict/disguise/DisguiseAPI.java | 52 ++++--- .../disguise/disguisetypes/Disguise.java | 11 +- .../disguise/disguisetypes/FlagWatcher.java | 6 +- .../disguise/disguisetypes/MiscDisguise.java | 2 +- .../disguise/disguisetypes/MobDisguise.java | 2 +- .../disguisetypes/PlayerDisguise.java | 2 +- .../disguisetypes/TargetedDisguise.java | 60 ++++++++ .../disguisetypes/TargettedDisguise.java | 51 ------- .../watchers/FallingBlockWatcher.java | 2 +- .../watchers/PaintingWatcher.java | 2 +- .../watchers/SplashPotionWatcher.java | 2 +- .../disguise/utilities/DisguiseUtilities.java | 133 ++++++++++++++---- 12 files changed, 214 insertions(+), 111 deletions(-) create mode 100644 src/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java delete mode 100644 src/me/libraryaddict/disguise/disguisetypes/TargettedDisguise.java diff --git a/src/me/libraryaddict/disguise/DisguiseAPI.java b/src/me/libraryaddict/disguise/DisguiseAPI.java index a800910b..90358359 100644 --- a/src/me/libraryaddict/disguise/DisguiseAPI.java +++ b/src/me/libraryaddict/disguise/DisguiseAPI.java @@ -1,9 +1,11 @@ package me.libraryaddict.disguise; import java.lang.reflect.Field; +import java.util.List; + import me.libraryaddict.disguise.disguisetypes.Disguise; -import me.libraryaddict.disguise.disguisetypes.TargettedDisguise; -import me.libraryaddict.disguise.disguisetypes.TargettedDisguise.TargetType; +import me.libraryaddict.disguise.disguisetypes.TargetedDisguise; +import me.libraryaddict.disguise.disguisetypes.TargetedDisguise.TargetType; import me.libraryaddict.disguise.events.DisguiseEvent; import me.libraryaddict.disguise.events.UndisguiseEvent; import me.libraryaddict.disguise.utilities.DisguiseUtilities; @@ -26,6 +28,18 @@ public class DisguiseAPI { return hearSelfDisguise; } + public static void disguiseToPlayers(Entity entity, Disguise disguise, List players) { + ((TargetedDisguise) disguise).setTargetType(TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS); + ((TargetedDisguise) disguise).getObservers().addAll(players); + disguiseEntity(entity, disguise); + } + + public static void disguiseToEveryoneButThese(Entity entity, Disguise disguise, List players) { + ((TargetedDisguise) disguise).setTargetType(TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS); + ((TargetedDisguise) disguise).getObservers().addAll(players); + disguiseEntity(entity, disguise); + } + /** * Disguise the next entity to spawn with this disguise. This may not work however if the entity doesn't actually spawn. */ @@ -39,23 +53,17 @@ public class DisguiseAPI { Field field = ReflectionManager.getNmsClass("Entity").getDeclaredField("entityCount"); field.setAccessible(true); int id = field.getInt(null); - DisguiseUtilities.addDisguise(id, (TargettedDisguise) disguise); + DisguiseUtilities.addDisguise(id, (TargetedDisguise) disguise); } catch (Exception ex) { ex.printStackTrace(); } } - /** - * Disguise this entity with this disguise - */ - public static void disguiseToAll(Entity entity, Disguise disguise) { + private static void disguiseEntity(Entity entity, Disguise disguise) { // If they are trying to disguise a null entity or use a null disguise // Just return. if (entity == null || disguise == null) return; - // You called the disguiseToAll method foolish mortal! Prepare to have your custom settings wiped!!! - ((TargettedDisguise) disguise).setTargetType(TargetType.HIDE_FROM_THESE); - ((TargettedDisguise) disguise).getObservers().clear(); // Fire a disguise event DisguiseEvent event = new DisguiseEvent(entity, disguise); Bukkit.getPluginManager().callEvent(event); @@ -73,20 +81,24 @@ public class DisguiseAPI { } // Set the disguise's entity disguise.setEntity(entity); - } // If there was a old disguise - Disguise[] oldDisguises = getDisguises(entity); + } // Stick the disguise in the disguises bin - DisguiseUtilities.addDisguise(entity.getEntityId(), (TargettedDisguise) disguise); + DisguiseUtilities.addDisguise(entity.getEntityId(), (TargetedDisguise) disguise); // Resend the disguised entity's packet - DisguiseUtilities.refreshTrackers(entity); + DisguiseUtilities.refreshTrackers((TargetedDisguise) disguise); // If he is a player, then self disguise himself DisguiseUtilities.setupFakeDisguise(disguise); - // Discard the disguise - for (Disguise oldDisguise : oldDisguises) { - oldDisguise.removeDisguise(); - // Make everyone see this disguise. Remove any old disguises. - DisguiseUtilities.getDisguises().remove(entity.getEntityId()); - } + } + + /** + * Disguise this entity with this disguise + */ + public static void disguiseToAll(Entity entity, Disguise disguise) { + // You called the disguiseToAll method foolish mortal! Prepare to have your custom settings wiped!!! + ((TargetedDisguise) disguise).setTargetType(TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS); + for (String observer : ((TargetedDisguise) disguise).getObservers()) + ((TargetedDisguise) disguise).unsetViewDisguise(observer); + disguiseEntity(entity, disguise); } /** diff --git a/src/me/libraryaddict/disguise/disguisetypes/Disguise.java b/src/me/libraryaddict/disguise/disguisetypes/Disguise.java index 3cec8cec..fc40d476 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/Disguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/Disguise.java @@ -175,6 +175,7 @@ public abstract class Disguise { final boolean sendMovementPacket = movement; final double vectorY = fallSpeed; final boolean alwaysSendVelocity = alwaysSend; + final TargetedDisguise disguise=(TargetedDisguise) this; // A scheduler to clean up any unused disguises. velocityRunnable = new BukkitRunnable() { private int i = 0; @@ -189,7 +190,7 @@ public abstract class Disguise { i++; if (i % 40 == 0) { i = 0; - DisguiseUtilities.refreshTrackers(getEntity()); + DisguiseUtilities.refreshTrackers(disguise); if (getEntity() instanceof Player && isSelfDisguiseVisible()) { DisguiseUtilities.sendSelfDisguise((Player) getEntity()); } @@ -298,7 +299,7 @@ public abstract class Disguise { .get(entityTrackerEntry); for (Object p : trackedPlayers) { Player player = (Player) ReflectionManager.getBukkitEntity(p); - if (((TargettedDisguise) this).canSee(player)) { + if (((TargetedDisguise) this).canSee(player)) { players.add(player); } } @@ -371,19 +372,19 @@ public abstract class Disguise { velocityRunnable.cancel(); } catch (Exception ex) { } - HashMap> disguises = DisguiseUtilities.getDisguises(); + HashMap> disguises = DisguiseUtilities.getDisguises(); // If this disguise has a entity set if (getEntity() != null) { // If the entity is valid if (getEntity().isValid()) { // If this disguise is active // Remove the disguise from the current disguises. - if (DisguiseUtilities.removeDisguise((TargettedDisguise) this)) { + if (DisguiseUtilities.removeDisguise((TargetedDisguise) this)) { if (getEntity() instanceof Player) { DisguiseUtilities.removeSelfDisguise((Player) getEntity()); } // Better refresh the entity to undisguise it - DisguiseUtilities.refreshTrackers(getEntity()); + DisguiseUtilities.refreshTrackers((TargetedDisguise) this); } } } else { diff --git a/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java index aabc30cc..18bc51aa 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java @@ -42,14 +42,14 @@ public class FlagWatcher { * This is the entity values I need to add else it could crash them.. */ private HashMap backupEntityValues = new HashMap(); - private Disguise disguise; + private TargetedDisguise disguise; private HashMap entityValues = new HashMap(); private boolean hasDied; private org.bukkit.inventory.ItemStack[] items = new org.bukkit.inventory.ItemStack[5]; private HashSet modifiedEntityAnimations = new HashSet(); public FlagWatcher(Disguise disguise) { - this.disguise = disguise; + this.disguise = (TargetedDisguise) disguise; } @Override @@ -158,7 +158,7 @@ public class FlagWatcher { return armor; } - protected Disguise getDisguise() { + protected TargetedDisguise getDisguise() { return disguise; } diff --git a/src/me/libraryaddict/disguise/disguisetypes/MiscDisguise.java b/src/me/libraryaddict/disguise/disguisetypes/MiscDisguise.java index 97d6db0a..fa5a647d 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/MiscDisguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/MiscDisguise.java @@ -11,7 +11,7 @@ import org.bukkit.Art; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; -public class MiscDisguise extends TargettedDisguise { +public class MiscDisguise extends TargetedDisguise { private int data = -1; private int id = -1; diff --git a/src/me/libraryaddict/disguise/disguisetypes/MobDisguise.java b/src/me/libraryaddict/disguise/disguisetypes/MobDisguise.java index 4b05daaf..1afa9991 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/MobDisguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/MobDisguise.java @@ -5,7 +5,7 @@ import me.libraryaddict.disguise.disguisetypes.watchers.ZombieWatcher; import org.bukkit.entity.EntityType; -public class MobDisguise extends TargettedDisguise { +public class MobDisguise extends TargetedDisguise { private boolean isAdult; diff --git a/src/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java b/src/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java index c2b82b9e..0647d3e5 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java @@ -1,6 +1,6 @@ package me.libraryaddict.disguise.disguisetypes; -public class PlayerDisguise extends TargettedDisguise { +public class PlayerDisguise extends TargetedDisguise { private String playerName; public PlayerDisguise(String name) { diff --git a/src/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java b/src/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java new file mode 100644 index 00000000..a38a9269 --- /dev/null +++ b/src/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java @@ -0,0 +1,60 @@ +package me.libraryaddict.disguise.disguisetypes; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; + +import me.libraryaddict.disguise.utilities.DisguiseUtilities; + +import org.bukkit.entity.Player; + +public abstract class TargetedDisguise extends Disguise { + public enum TargetType { + HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS, SHOW_TO_EVERYONE_BUT_THESE_PLAYERS; + } + + public void setTargetType(TargetType newTargetType) { + if (DisguiseUtilities.isDisguiseInUse(this)) { + throw new RuntimeException("Cannot set the disguise target after the entity has been disguised"); + } + targetType = newTargetType; + } + + private List disguiseViewers = new ArrayList(); + private TargetType targetType = TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS; + + public boolean canSee(Player player) { + return canSee(player.getName()); + } + + public List getObservers() { + return Collections.unmodifiableList(disguiseViewers); + } + + public boolean canSee(String playername) { + boolean contains = disguiseViewers.contains(playername); + if (targetType == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) { + return !contains; + } + return contains; + } + + public void setViewDisguise(String playername) { + if (!disguiseViewers.contains(playername)) { + disguiseViewers.add(playername); + DisguiseUtilities.checkConflicts(this, playername); + } + } + + public void unsetViewDisguise(String playername) { + if (disguiseViewers.contains(playername)) { + disguiseViewers.remove(playername); + DisguiseUtilities.checkConflicts(this, playername); + } + } + + public TargetType getTargetType() { + return targetType; + } +} diff --git a/src/me/libraryaddict/disguise/disguisetypes/TargettedDisguise.java b/src/me/libraryaddict/disguise/disguisetypes/TargettedDisguise.java deleted file mode 100644 index f0ae3986..00000000 --- a/src/me/libraryaddict/disguise/disguisetypes/TargettedDisguise.java +++ /dev/null @@ -1,51 +0,0 @@ -package me.libraryaddict.disguise.disguisetypes; - -import java.util.HashSet; - -import me.libraryaddict.disguise.utilities.DisguiseUtilities; - -import org.bukkit.entity.Player; - -public abstract class TargettedDisguise extends Disguise { - public enum TargetType { - SHOW_TO_THESE, HIDE_FROM_THESE; - } - - public void setTargetType(TargetType newTargetType) { - if (DisguiseUtilities.isDisguiseInUse(this)) { - throw new RuntimeException("Cannot set the disguise target after the entity has been disguised"); - } - targetType = newTargetType; - } - - private HashSet disguiseViewers = new HashSet(); - private TargetType targetType = TargetType.HIDE_FROM_THESE; - - public boolean canSee(Player player) { - return canSee(player.getName()); - } - - public HashSet getObservers() { - return disguiseViewers; - } - - public boolean canSee(String playername) { - boolean contains = disguiseViewers.contains(playername); - if (targetType == TargetType.HIDE_FROM_THESE) { - return !contains; - } - return contains; - } - - public void setViewDisguise(Player player) { - setViewDisguise(player.getName()); - } - - public void setViewDisguise(String playername) { - disguiseViewers.add(playername); - } - - public TargetType getTargetType() { - return targetType; - } -} diff --git a/src/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.java index 11d6797f..5a823c61 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.java @@ -27,7 +27,7 @@ public class FallingBlockWatcher extends FlagWatcher { public void setBlock(ItemStack block) { this.block = block; if (getDisguise().getEntity() != null && getDisguise().getWatcher() == this) { - DisguiseUtilities.refreshTrackers(getDisguise().getEntity()); + DisguiseUtilities.refreshTrackers(getDisguise()); } } } diff --git a/src/me/libraryaddict/disguise/disguisetypes/watchers/PaintingWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/PaintingWatcher.java index 3ae3ee1b..1c27ede2 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/watchers/PaintingWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/PaintingWatcher.java @@ -26,7 +26,7 @@ public class PaintingWatcher extends FlagWatcher { public void setArt(Art newPainting) { this.painting = newPainting; if (getDisguise().getEntity() != null && getDisguise().getWatcher() == this) { - DisguiseUtilities.refreshTrackers(getDisguise().getEntity()); + DisguiseUtilities.refreshTrackers(getDisguise()); } } diff --git a/src/me/libraryaddict/disguise/disguisetypes/watchers/SplashPotionWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/SplashPotionWatcher.java index 44d1c45c..21ff5919 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/watchers/SplashPotionWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/SplashPotionWatcher.java @@ -25,7 +25,7 @@ public class SplashPotionWatcher extends FlagWatcher { public void setPotionId(int newPotionId) { this.potionId = newPotionId; if (getDisguise().getEntity() != null && getDisguise().getWatcher() == this) { - DisguiseUtilities.refreshTrackers(getDisguise().getEntity()); + DisguiseUtilities.refreshTrackers(getDisguise()); } } diff --git a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index 01555947..ab842dc9 100644 --- a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -6,10 +6,11 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.LibsDisguises; import me.libraryaddict.disguise.disguisetypes.Disguise; -import me.libraryaddict.disguise.disguisetypes.TargettedDisguise; -import me.libraryaddict.disguise.disguisetypes.TargettedDisguise.TargetType; +import me.libraryaddict.disguise.disguisetypes.TargetedDisguise; +import me.libraryaddict.disguise.disguisetypes.TargetedDisguise.TargetType; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -28,13 +29,13 @@ import com.comphenix.protocol.wrappers.WrappedDataWatcher; public class DisguiseUtilities { // Store the entity IDs instead of entitys because then I can disguise entitys even before they exist - private static HashMap> targetedDisguises = new HashMap>(); + private static HashMap> targetedDisguises = new HashMap>(); private static LibsDisguises libsDisguises; // A internal storage of fake entity ID's I can use. // Realistically I could probably use a ID like "4" for everyone, seeing as no one shares the ID private static HashMap selfDisguisesIds = new HashMap(); - public static HashMap> getDisguises() { + public static HashMap> getDisguises() { return targetedDisguises; } @@ -47,7 +48,7 @@ public class DisguiseUtilities { } public static boolean isDisguiseInUse(Disguise disguise) { - if (getDisguises().containsKey(disguise.getEntity().getEntityId()) + if (disguise.getEntity() != null && getDisguises().containsKey(disguise.getEntity().getEntityId()) && getDisguises().get(disguise.getEntity().getEntityId()).contains(disguise)) { return true; } @@ -58,13 +59,13 @@ public class DisguiseUtilities { * @param Resends * the entity to all the watching players, which is where the magic begins */ - public static void refreshTrackers(Entity entity) { + public static void refreshTrackers(TargetedDisguise disguise) { try { - Object world = ReflectionManager.getWorld(entity.getWorld()); + 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, entity.getEntityId()); + .invoke(trackedEntities, disguise.getEntity().getEntityId()); if (entityTrackerEntry != null) { HashSet trackedPlayers = (HashSet) entityTrackerEntry.getClass().getField("trackedPlayers") .get(entityTrackerEntry); @@ -72,11 +73,15 @@ public class DisguiseUtilities { Method updatePlayer = entityTrackerEntry.getClass().getMethod("updatePlayer", ReflectionManager.getNmsClass("EntityPlayer")); HashSet cloned = (HashSet) trackedPlayers.clone(); - for (Object player : cloned) { - if (entity instanceof Player && !((Player) ReflectionManager.getBukkitEntity(player)).canSee((Player) entity)) - continue; - clear.invoke(entityTrackerEntry, player); - updatePlayer.invoke(entityTrackerEntry, player); + for (Object p : cloned) { + Player player = (Player) ReflectionManager.getBukkitEntity(p); + // if (entity instanceof Player && !((Player) ReflectionManager.getBukkitEntity(player)).canSee((Player) + // entity)) + // continue; + if (disguise.canSee(player.getName())) { + clear.invoke(entityTrackerEntry, p); + updatePlayer.invoke(entityTrackerEntry, p); + } } } } catch (Exception ex) { @@ -232,14 +237,89 @@ public class DisguiseUtilities { } } - public static void addDisguise(int entityId, TargettedDisguise disguise) { + public static void addDisguise(int entityId, TargetedDisguise disguise) { + // TODO Make sure that the disguised entity doesn't have the player looking at other girls + // ^ Done? if (!getDisguises().containsKey(entityId)) { - getDisguises().put(entityId, new HashSet()); + getDisguises().put(entityId, new HashSet()); } getDisguises().get(entityId).add(disguise); + checkConflicts(disguise, null); } - public static boolean removeDisguise(TargettedDisguise disguise) { + /** + * If name isn't null. Make sure that the name doesn't see any other disguise. Else if name is null. Make sure that the + * observers in the disguise don't see any other disguise. + */ + public static void checkConflicts(TargetedDisguise disguise, String name) { + if (DisguiseAPI.isDisguiseInUse(disguise)) { + Iterator disguiseItel = getDisguises().get(disguise.getEntity().getEntityId()).iterator(); + while (disguiseItel.hasNext()) { + TargetedDisguise d = disguiseItel.next(); + if (d != disguise) { + if (d.getTargetType() == TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS) { + // If player is a observer in the loop + if (disguise.getTargetType() == TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS) { + // If player is a observer in the disguise + // Remove them from the loop + if (name != null) { + d.unsetViewDisguise(name); + } else { + for (String playername : disguise.getObservers()) { + d.unsetViewDisguise(playername); + } + } + } else if (disguise.getTargetType() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) { + // If player is not a observer in the loop + if (name != null) { + if (!disguise.getObservers().contains(name)) { + d.unsetViewDisguise(name); + } + } else { + for (String playername : d.getObservers()) { + if (!disguise.getObservers().contains(playername)) { + d.unsetViewDisguise(playername); + } + } + } + } + } else if (d.getTargetType() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) { + // Here you add it to the loop if they see the disguise + if (disguise.getTargetType() == TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS) { + // Everyone who is in the disguise needs to be added to the loop + if (name != null) { + d.setViewDisguise(name); + } else { + for (String playername : disguise.getObservers()) { + d.setViewDisguise(playername); + } + } + } else if (disguise.getTargetType() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) { + // This here is a paradox. + // If fed a name. I can do this. + // But the rest of the time.. Its going to conflict. + System.out.print("Cannot set more than one " + TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS + + " on a entity. Removed the old disguise."); + disguiseItel.remove(); + /* if (name != null) { + if (!disguise.getObservers().contains(name)) { + d.setViewDisguise(name); + } + } else { + for (String playername : d.getObservers()) { + if (!disguise.getObservers().contains(playername)) { + d.setViewDisguise(playername); + } + } + }*/ + } + } + } + } + } + } + + public static boolean removeDisguise(TargetedDisguise disguise) { int entityId = disguise.getEntity().getEntityId(); if (getDisguises().containsKey(entityId) && getDisguises().get(entityId).remove(disguise)) { if (getDisguises().get(entityId).isEmpty()) { @@ -251,11 +331,12 @@ public class DisguiseUtilities { } @Deprecated - public static TargettedDisguise getDisguise(int entityId) { - TargettedDisguise toReturn = null; + public static TargetedDisguise getDisguise(int entityId) { + TargetedDisguise toReturn = null; if (getDisguises().containsKey(entityId)) { - for (TargettedDisguise disguise : getDisguises().get(entityId)) { - if (disguise.getTargetType() == TargetType.HIDE_FROM_THESE && disguise.getObservers().isEmpty()) { + for (TargetedDisguise disguise : getDisguises().get(entityId)) { + if (disguise.getTargetType() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS + && disguise.getObservers().isEmpty()) { return disguise; } if (toReturn == null) { @@ -266,16 +347,16 @@ public class DisguiseUtilities { return toReturn; } - public static TargettedDisguise[] getDisguises(int entityId) { + public static TargetedDisguise[] getDisguises(int entityId) { if (getDisguises().containsKey(entityId)) { - return getDisguises().get(entityId).toArray(new TargettedDisguise[getDisguises().get(entityId).size()]); + return getDisguises().get(entityId).toArray(new TargetedDisguise[getDisguises().get(entityId).size()]); } - return new TargettedDisguise[0]; + return new TargetedDisguise[0]; } - public static TargettedDisguise getDisguise(Player observer, int entityId) { + public static TargetedDisguise getDisguise(Player observer, int entityId) { if (getDisguises().containsKey(entityId)) { - for (TargettedDisguise disguise : getDisguises().get(entityId)) { + for (TargetedDisguise disguise : getDisguises().get(entityId)) { if (disguise.canSee(observer)) { return disguise; } @@ -291,7 +372,7 @@ public class DisguiseUtilities { Entity e = disguise.getEntity(); // If the disguises entity is null, or the disguised entity isn't a player return if (e == null || !(e instanceof Player) || !getDisguises().containsKey(e.getEntityId()) - || !getDisguises().get(e).contains(disguise)) + || !getDisguises().get(e.getEntityId()).contains(disguise)) return; Player player = (Player) e; // Remove the old disguise, else we have weird disguises around the place From 4f1613dca10a6b2a89f6887ee0285f3467076727 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Mon, 2 Dec 2013 05:10:38 +1300 Subject: [PATCH 09/33] Cleanups. Fix ups. Renames. --- .../libraryaddict/disguise/DisguiseAPI.java | 92 +++--- .../disguise/disguisetypes/MiscDisguise.java | 8 +- .../disguise/disguisetypes/MobDisguise.java | 10 +- .../disguisetypes/PlayerDisguise.java | 10 +- .../disguisetypes/TargetedDisguise.java | 60 ++-- .../disguise/utilities/DisguiseUtilities.java | 301 ++++++++++-------- 6 files changed, 265 insertions(+), 216 deletions(-) diff --git a/src/me/libraryaddict/disguise/DisguiseAPI.java b/src/me/libraryaddict/disguise/DisguiseAPI.java index 90358359..e9295c1a 100644 --- a/src/me/libraryaddict/disguise/DisguiseAPI.java +++ b/src/me/libraryaddict/disguise/DisguiseAPI.java @@ -28,37 +28,6 @@ public class DisguiseAPI { return hearSelfDisguise; } - public static void disguiseToPlayers(Entity entity, Disguise disguise, List players) { - ((TargetedDisguise) disguise).setTargetType(TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS); - ((TargetedDisguise) disguise).getObservers().addAll(players); - disguiseEntity(entity, disguise); - } - - public static void disguiseToEveryoneButThese(Entity entity, Disguise disguise, List players) { - ((TargetedDisguise) disguise).setTargetType(TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS); - ((TargetedDisguise) disguise).getObservers().addAll(players); - disguiseEntity(entity, disguise); - } - - /** - * Disguise the next entity to spawn with this disguise. This may not work however if the entity doesn't actually spawn. - */ - public static void disguiseNextEntity(Disguise disguise) { - if (disguise == null) - return; - if (disguise.getEntity() != null || DisguiseUtilities.getDisguises().containsValue(disguise)) { - disguise = disguise.clone(); - } - try { - Field field = ReflectionManager.getNmsClass("Entity").getDeclaredField("entityCount"); - field.setAccessible(true); - int id = field.getInt(null); - DisguiseUtilities.addDisguise(id, (TargetedDisguise) disguise); - } catch (Exception ex) { - ex.printStackTrace(); - } - } - private static void disguiseEntity(Entity entity, Disguise disguise) { // If they are trying to disguise a null entity or use a null disguise // Just return. @@ -90,6 +59,33 @@ public class DisguiseAPI { DisguiseUtilities.setupFakeDisguise(disguise); } + public static void disguiseIgnorePlayers(Entity entity, Disguise disguise, List players) { + ((TargetedDisguise) disguise).setTargetType(TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS); + for (String name : players) { + ((TargetedDisguise) disguise).setViewDisguise(name); + } + disguiseEntity(entity, disguise); + } + + /** + * Disguise the next entity to spawn with this disguise. This may not work however if the entity doesn't actually spawn. + */ + public static void disguiseNextEntity(Disguise disguise) { + if (disguise == null) + return; + if (disguise.getEntity() != null || DisguiseUtilities.getDisguises().containsValue(disguise)) { + disguise = disguise.clone(); + } + try { + Field field = ReflectionManager.getNmsClass("Entity").getDeclaredField("entityCount"); + field.setAccessible(true); + int id = field.getInt(null); + DisguiseUtilities.addDisguise(id, (TargetedDisguise) disguise); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + /** * Disguise this entity with this disguise */ @@ -101,6 +97,14 @@ public class DisguiseAPI { disguiseEntity(entity, disguise); } + public static void disguiseToPlayers(Entity entity, Disguise disguise, List players) { + ((TargetedDisguise) disguise).setTargetType(TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS); + for (String name : players) { + ((TargetedDisguise) disguise).setViewDisguise(name); + } + disguiseEntity(entity, disguise); + } + /** * Get the disguise of a entity */ @@ -111,15 +115,6 @@ public class DisguiseAPI { return DisguiseUtilities.getDisguise(disguised.getEntityId()); } - /** - * Get the disguises of a entity - */ - public static Disguise[] getDisguises(Entity disguised) { - if (disguised == null) - return null; - return DisguiseUtilities.getDisguises(disguised.getEntityId()); - } - /** * Get the disguise of a entity */ @@ -129,6 +124,15 @@ public class DisguiseAPI { return DisguiseUtilities.getDisguise(observer, disguised.getEntityId()); } + /** + * Get the disguises of a entity + */ + public static Disguise[] getDisguises(Entity disguised) { + if (disguised == null) + return null; + return DisguiseUtilities.getDisguises(disguised.getEntityId()); + } + /** * Get the ID of a fake disguise for a entityplayer */ @@ -146,10 +150,6 @@ public class DisguiseAPI { return getDisguise(disguised) != null; } - public static boolean isDisguiseInUse(Disguise disguise) { - return DisguiseUtilities.isDisguiseInUse(disguise); - } - /** * Is this entity disguised */ @@ -157,6 +157,10 @@ public class DisguiseAPI { return getDisguise(observer, disguised) != null; } + public static boolean isDisguiseInUse(Disguise disguise) { + return DisguiseUtilities.isDisguiseInUse(disguise); + } + public static boolean isEntityAnimationsAdded() { return isEntityAnimationsAdded; } diff --git a/src/me/libraryaddict/disguise/disguisetypes/MiscDisguise.java b/src/me/libraryaddict/disguise/disguisetypes/MiscDisguise.java index fa5a647d..d8df35fd 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/MiscDisguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/MiscDisguise.java @@ -29,10 +29,6 @@ public class MiscDisguise extends TargetedDisguise { || disguiseType == DisguiseType.DROPPED_ITEM ? -1 : addictionalData)); } - public boolean isMiscDisguise() { - return true; - } - public MiscDisguise(DisguiseType disguiseType, boolean replaceSounds, int id, int data) { createDisguise(disguiseType, replaceSounds); switch (disguiseType) { @@ -145,4 +141,8 @@ public class MiscDisguise extends TargetedDisguise { return id; } + public boolean isMiscDisguise() { + return true; + } + } \ No newline at end of file diff --git a/src/me/libraryaddict/disguise/disguisetypes/MobDisguise.java b/src/me/libraryaddict/disguise/disguisetypes/MobDisguise.java index 1afa9991..c8519478 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/MobDisguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/MobDisguise.java @@ -23,16 +23,12 @@ public class MobDisguise extends TargetedDisguise { } - public boolean isMobDisguise() { - return true; - } - - @Deprecated public MobDisguise(EntityType entityType) { this(entityType, true); } + @Deprecated public MobDisguise(EntityType entityType, boolean isAdult) { this(entityType, isAdult, true); @@ -74,4 +70,8 @@ public class MobDisguise extends TargetedDisguise { } return isAdult; } + + public boolean isMobDisguise() { + return true; + } } \ No newline at end of file diff --git a/src/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java b/src/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java index 0647d3e5..f3dd8db8 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java @@ -14,11 +14,6 @@ public class PlayerDisguise extends TargetedDisguise { createDisguise(DisguiseType.PLAYER, replaceSounds); } - @Override - public boolean isPlayerDisguise() { - return true; - } - @Override public PlayerDisguise clone() { PlayerDisguise disguise = new PlayerDisguise(getName(), isSoundsReplaced()); @@ -35,4 +30,9 @@ public class PlayerDisguise extends TargetedDisguise { return playerName; } + @Override + public boolean isPlayerDisguise() { + return true; + } + } \ No newline at end of file diff --git a/src/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java b/src/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java index a38a9269..b4c8c573 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java @@ -2,9 +2,9 @@ package me.libraryaddict.disguise.disguisetypes; import java.util.ArrayList; import java.util.Collections; -import java.util.HashSet; import java.util.List; +import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.utilities.DisguiseUtilities; import org.bukkit.entity.Player; @@ -14,6 +14,31 @@ public abstract class TargetedDisguise extends Disguise { HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS, SHOW_TO_EVERYONE_BUT_THESE_PLAYERS; } + private List disguiseViewers = new ArrayList(); + + private TargetType targetType = TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS; + public boolean canSee(Player player) { + return canSee(player.getName()); + } + + public boolean canSee(String playername) { + boolean hasPlayer = disguiseViewers.contains(playername); + if (targetType == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) { + System.out.print(playername + " can see 1: " + !hasPlayer); + return !hasPlayer; + } + System.out.print(playername + " can see 2: " + hasPlayer); + return hasPlayer; + } + + public List getObservers() { + return Collections.unmodifiableList(disguiseViewers); + } + + public TargetType getTargetType() { + return targetType; + } + public void setTargetType(TargetType newTargetType) { if (DisguiseUtilities.isDisguiseInUse(this)) { throw new RuntimeException("Cannot set the disguise target after the entity has been disguised"); @@ -21,40 +46,23 @@ public abstract class TargetedDisguise extends Disguise { targetType = newTargetType; } - private List disguiseViewers = new ArrayList(); - private TargetType targetType = TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS; - - public boolean canSee(Player player) { - return canSee(player.getName()); - } - - public List getObservers() { - return Collections.unmodifiableList(disguiseViewers); - } - - public boolean canSee(String playername) { - boolean contains = disguiseViewers.contains(playername); - if (targetType == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) { - return !contains; - } - return contains; - } - public void setViewDisguise(String playername) { if (!disguiseViewers.contains(playername)) { disguiseViewers.add(playername); - DisguiseUtilities.checkConflicts(this, playername); + if (DisguiseAPI.isDisguiseInUse(this)) { + DisguiseUtilities.checkConflicts(this, playername); + DisguiseUtilities.refreshTracker(this, playername); + } } } public void unsetViewDisguise(String playername) { if (disguiseViewers.contains(playername)) { disguiseViewers.remove(playername); - DisguiseUtilities.checkConflicts(this, playername); + if (DisguiseAPI.isDisguiseInUse(this)) { + DisguiseUtilities.checkConflicts(this, playername); + DisguiseUtilities.refreshTracker(this, playername); + } } } - - public TargetType getTargetType() { - return targetType; - } } diff --git a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index ab842dc9..2ee10ec6 100644 --- a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -2,6 +2,7 @@ package me.libraryaddict.disguise.utilities; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -28,17 +29,134 @@ import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.wrappers.WrappedDataWatcher; public class DisguiseUtilities { - // Store the entity IDs instead of entitys because then I can disguise entitys even before they exist - private static HashMap> targetedDisguises = new HashMap>(); private static LibsDisguises libsDisguises; // A internal storage of fake entity ID's I can use. // Realistically I could probably use a ID like "4" for everyone, seeing as no one shares the ID private static HashMap selfDisguisesIds = new HashMap(); + // Store the entity IDs instead of entitys because then I can disguise entitys even before they exist + private static HashMap> targetedDisguises = new HashMap>(); + + public static void addDisguise(int entityId, TargetedDisguise disguise) { + // TODO Make sure that the disguised entity doesn't have the player looking at other girls + // ^ Done? + if (!getDisguises().containsKey(entityId)) { + getDisguises().put(entityId, new HashSet()); + } + getDisguises().get(entityId).add(disguise); + checkConflicts(disguise, null); + } + + /** + * If name isn't null. Make sure that the name doesn't see any other disguise. Else if name is null. Make sure that the + * observers in the disguise don't see any other disguise. + */ + public static void checkConflicts(TargetedDisguise disguise, String name) { + if (DisguiseAPI.isDisguiseInUse(disguise)) { + Iterator disguiseItel = getDisguises().get(disguise.getEntity().getEntityId()).iterator(); + while (disguiseItel.hasNext()) { + TargetedDisguise d = disguiseItel.next(); + if (d != disguise) { + if (d.getTargetType() == TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS) { + // If player is a observer in the loop + if (disguise.getTargetType() == TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS) { + // If player is a observer in the disguise + // Remove them from the loop + if (name != null) { + d.unsetViewDisguise(name); + } else { + for (String playername : disguise.getObservers()) { + d.unsetViewDisguise(playername); + } + } + } else if (disguise.getTargetType() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) { + // If player is not a observer in the loop + if (name != null) { + if (!disguise.getObservers().contains(name)) { + d.unsetViewDisguise(name); + } + } else { + for (String playername : new ArrayList(d.getObservers())) { + if (!disguise.getObservers().contains(playername)) { + d.unsetViewDisguise(playername); + } + } + } + } + } else if (d.getTargetType() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) { + // Here you add it to the loop if they see the disguise + if (disguise.getTargetType() == TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS) { + // Everyone who is in the disguise needs to be added to the loop + if (name != null) { + d.setViewDisguise(name); + } else { + for (String playername : disguise.getObservers()) { + d.setViewDisguise(playername); + } + } + } else if (disguise.getTargetType() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) { + // This here is a paradox. + // If fed a name. I can do this. + // But the rest of the time.. Its going to conflict. + System.out.print("Cannot set more than one " + TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS + + " on a entity. Removed the old disguise."); + disguiseItel.remove(); + /* if (name != null) { + if (!disguise.getObservers().contains(name)) { + d.setViewDisguise(name); + } + } else { + for (String playername : d.getObservers()) { + if (!disguise.getObservers().contains(playername)) { + d.setViewDisguise(playername); + } + } + }*/ + } + } + } + } + } + } + + @Deprecated + public static TargetedDisguise getDisguise(int entityId) { + TargetedDisguise toReturn = null; + if (getDisguises().containsKey(entityId)) { + for (TargetedDisguise disguise : getDisguises().get(entityId)) { + if (disguise.getTargetType() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS + && disguise.getObservers().isEmpty()) { + return disguise; + } + if (toReturn == null) { + toReturn = disguise; + } + } + } + return toReturn; + } + + public static TargetedDisguise getDisguise(Player observer, int entityId) { + if (getDisguises().containsKey(entityId)) { + for (TargetedDisguise disguise : getDisguises().get(entityId)) { + if (disguise.canSee(observer)) { + return disguise; + } + } + } + return null; + } public static HashMap> getDisguises() { return targetedDisguises; } + public static TargetedDisguise[] getDisguises(int entityId) { + if (getDisguises().containsKey(entityId)) { + return getDisguises().get(entityId).toArray(new TargetedDisguise[getDisguises().get(entityId).size()]); + } + return new TargetedDisguise[0]; + } + public static HashMap getSelfDisguisesIds() { return selfDisguisesIds; } @@ -55,6 +173,36 @@ public class DisguiseUtilities { return false; } + /** + * @param Resends + * the entity to all the watching players, which is where the magic begins + */ + public static void refreshTracker(TargetedDisguise disguise, String player) { + 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()); + 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) { + if (player.equals(((Player) ReflectionManager.getBukkitEntity(p)).getName())) { + 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 @@ -89,6 +237,17 @@ public class DisguiseUtilities { } } + public static boolean removeDisguise(TargetedDisguise disguise) { + int entityId = disguise.getEntity().getEntityId(); + if (getDisguises().containsKey(entityId) && getDisguises().get(entityId).remove(disguise)) { + if (getDisguises().get(entityId).isEmpty()) { + getDisguises().remove(entityId); + } + return true; + } + return false; + } + public static void removeSelfDisguise(Player player) { if (selfDisguisesIds.containsKey(player.getEntityId())) { // Send a packet to destroy the fake entity @@ -237,134 +396,6 @@ public class DisguiseUtilities { } } - public static void addDisguise(int entityId, TargetedDisguise disguise) { - // TODO Make sure that the disguised entity doesn't have the player looking at other girls - // ^ Done? - if (!getDisguises().containsKey(entityId)) { - getDisguises().put(entityId, new HashSet()); - } - getDisguises().get(entityId).add(disguise); - checkConflicts(disguise, null); - } - - /** - * If name isn't null. Make sure that the name doesn't see any other disguise. Else if name is null. Make sure that the - * observers in the disguise don't see any other disguise. - */ - public static void checkConflicts(TargetedDisguise disguise, String name) { - if (DisguiseAPI.isDisguiseInUse(disguise)) { - Iterator disguiseItel = getDisguises().get(disguise.getEntity().getEntityId()).iterator(); - while (disguiseItel.hasNext()) { - TargetedDisguise d = disguiseItel.next(); - if (d != disguise) { - if (d.getTargetType() == TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS) { - // If player is a observer in the loop - if (disguise.getTargetType() == TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS) { - // If player is a observer in the disguise - // Remove them from the loop - if (name != null) { - d.unsetViewDisguise(name); - } else { - for (String playername : disguise.getObservers()) { - d.unsetViewDisguise(playername); - } - } - } else if (disguise.getTargetType() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) { - // If player is not a observer in the loop - if (name != null) { - if (!disguise.getObservers().contains(name)) { - d.unsetViewDisguise(name); - } - } else { - for (String playername : d.getObservers()) { - if (!disguise.getObservers().contains(playername)) { - d.unsetViewDisguise(playername); - } - } - } - } - } else if (d.getTargetType() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) { - // Here you add it to the loop if they see the disguise - if (disguise.getTargetType() == TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS) { - // Everyone who is in the disguise needs to be added to the loop - if (name != null) { - d.setViewDisguise(name); - } else { - for (String playername : disguise.getObservers()) { - d.setViewDisguise(playername); - } - } - } else if (disguise.getTargetType() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) { - // This here is a paradox. - // If fed a name. I can do this. - // But the rest of the time.. Its going to conflict. - System.out.print("Cannot set more than one " + TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS - + " on a entity. Removed the old disguise."); - disguiseItel.remove(); - /* if (name != null) { - if (!disguise.getObservers().contains(name)) { - d.setViewDisguise(name); - } - } else { - for (String playername : d.getObservers()) { - if (!disguise.getObservers().contains(playername)) { - d.setViewDisguise(playername); - } - } - }*/ - } - } - } - } - } - } - - public static boolean removeDisguise(TargetedDisguise disguise) { - int entityId = disguise.getEntity().getEntityId(); - if (getDisguises().containsKey(entityId) && getDisguises().get(entityId).remove(disguise)) { - if (getDisguises().get(entityId).isEmpty()) { - getDisguises().remove(entityId); - } - return true; - } - return false; - } - - @Deprecated - public static TargetedDisguise getDisguise(int entityId) { - TargetedDisguise toReturn = null; - if (getDisguises().containsKey(entityId)) { - for (TargetedDisguise disguise : getDisguises().get(entityId)) { - if (disguise.getTargetType() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS - && disguise.getObservers().isEmpty()) { - return disguise; - } - if (toReturn == null) { - toReturn = disguise; - } - } - } - return toReturn; - } - - public static TargetedDisguise[] getDisguises(int entityId) { - if (getDisguises().containsKey(entityId)) { - return getDisguises().get(entityId).toArray(new TargetedDisguise[getDisguises().get(entityId).size()]); - } - return new TargetedDisguise[0]; - } - - public static TargetedDisguise getDisguise(Player observer, int entityId) { - if (getDisguises().containsKey(entityId)) { - for (TargetedDisguise disguise : getDisguises().get(entityId)) { - if (disguise.canSee(observer)) { - return disguise; - } - } - } - return null; - } - /** * Setup it so he can see himself when disguised */ @@ -372,14 +403,20 @@ public class DisguiseUtilities { Entity e = disguise.getEntity(); // If the disguises entity is null, or the disguised entity isn't a player return if (e == null || !(e instanceof Player) || !getDisguises().containsKey(e.getEntityId()) - || !getDisguises().get(e.getEntityId()).contains(disguise)) + || !getDisguises().get(e.getEntityId()).contains(disguise)) { return; + } Player player = (Player) e; + // Check if he can even see this.. + if (!((TargetedDisguise) disguise).canSee(player)) { + return; + } // Remove the old disguise, else we have weird disguises around the place DisguiseUtilities.removeSelfDisguise(player); // If the disguised player can't see himself. Return - if (!disguise.isSelfDisguiseVisible() || !PacketsManager.isViewDisguisesListenerEnabled() || player.getVehicle() != null) + 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"); From 9fd631d3970d49f93c0db702511296a3a7b21b66 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Mon, 2 Dec 2013 18:43:41 +1300 Subject: [PATCH 10/33] Remove debug --- .../libraryaddict/disguise/disguisetypes/TargetedDisguise.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java b/src/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java index b4c8c573..b3585254 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java @@ -17,6 +17,7 @@ public abstract class TargetedDisguise extends Disguise { private List disguiseViewers = new ArrayList(); private TargetType targetType = TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS; + public boolean canSee(Player player) { return canSee(player.getName()); } @@ -24,10 +25,8 @@ public abstract class TargetedDisguise extends Disguise { public boolean canSee(String playername) { boolean hasPlayer = disguiseViewers.contains(playername); if (targetType == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) { - System.out.print(playername + " can see 1: " + !hasPlayer); return !hasPlayer; } - System.out.print(playername + " can see 2: " + hasPlayer); return hasPlayer; } From 55427dc1fef56fc4dfca62c5ac328d4306a8169e Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Mon, 2 Dec 2013 23:21:10 +1300 Subject: [PATCH 11/33] Make private method public. Remove the error being thrown for temperary player --- src/me/libraryaddict/disguise/DisguiseAPI.java | 2 +- src/me/libraryaddict/disguise/utilities/PacketsManager.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/me/libraryaddict/disguise/DisguiseAPI.java b/src/me/libraryaddict/disguise/DisguiseAPI.java index e9295c1a..c5d1c38c 100644 --- a/src/me/libraryaddict/disguise/DisguiseAPI.java +++ b/src/me/libraryaddict/disguise/DisguiseAPI.java @@ -28,7 +28,7 @@ public class DisguiseAPI { return hearSelfDisguise; } - private static void disguiseEntity(Entity entity, Disguise disguise) { + public static void disguiseEntity(Entity entity, Disguise disguise) { // If they are trying to disguise a null entity or use a null disguise // Just return. if (entity == null || disguise == null) diff --git a/src/me/libraryaddict/disguise/utilities/PacketsManager.java b/src/me/libraryaddict/disguise/utilities/PacketsManager.java index 2cebad98..373b1d50 100644 --- a/src/me/libraryaddict/disguise/utilities/PacketsManager.java +++ b/src/me/libraryaddict/disguise/utilities/PacketsManager.java @@ -770,7 +770,8 @@ public class PacketsManager { @Override public void onPacketSending(PacketEvent event) { // If the inventory is the players inventory - if (event.getPlayer().getVehicle() == null && event.getPacket().getIntegers().read(0) == 0) { + if (event.getPlayer().isOnline() && event.getPlayer().getVehicle() == null + && event.getPacket().getIntegers().read(0) == 0) { Disguise disguise = DisguiseAPI.getDisguise(event.getPlayer(), event.getPlayer()); // If the player is disguised, views self disguises and is hiding a item. if (disguise != null && disguise.isSelfDisguiseVisible() From 82e86f666911ac573134106f93f059847cdef9b5 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Mon, 2 Dec 2013 23:31:43 +1300 Subject: [PATCH 12/33] Fix some errors --- .../disguise/disguisetypes/TargetedDisguise.java | 12 ++++++++++++ .../disguise/utilities/DisguiseUtilities.java | 4 ++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java b/src/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java index b3585254..f43a9ad1 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java @@ -45,6 +45,18 @@ public abstract class TargetedDisguise extends Disguise { targetType = newTargetType; } + public void silentlySetViewDisguise(String playername) { + if (!disguiseViewers.contains(playername)) { + disguiseViewers.add(playername); + } + } + + public void silentlyUnsetViewDisguise(String playername) { + if (disguiseViewers.contains(playername)) { + disguiseViewers.remove(playername); + } + } + public void setViewDisguise(String playername) { if (!disguiseViewers.contains(playername)) { disguiseViewers.add(playername); diff --git a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index 2ee10ec6..597830d0 100644 --- a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -65,7 +65,7 @@ public class DisguiseUtilities { d.unsetViewDisguise(name); } else { for (String playername : disguise.getObservers()) { - d.unsetViewDisguise(playername); + d.silentlyUnsetViewDisguise(playername); } } } else if (disguise.getTargetType() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) { @@ -90,7 +90,7 @@ public class DisguiseUtilities { d.setViewDisguise(name); } else { for (String playername : disguise.getObservers()) { - d.setViewDisguise(playername); + d.silentlySetViewDisguise(playername); } } } else if (disguise.getTargetType() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) { From 6420a989a90dde7f35dfd1d33069c2eef890b8fd Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Tue, 3 Dec 2013 03:00:44 +1300 Subject: [PATCH 13/33] May as well make firework be refreshed to try combat mojangs brilliant lag idea --- src/me/libraryaddict/disguise/disguisetypes/Disguise.java | 2 +- .../libraryaddict/disguise/utilities/DisguiseUtilities.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/me/libraryaddict/disguise/disguisetypes/Disguise.java b/src/me/libraryaddict/disguise/disguisetypes/Disguise.java index fc40d476..0647bf0b 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/Disguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/Disguise.java @@ -186,7 +186,7 @@ public abstract class Disguise { DisguiseAPI.undisguiseToAll(getEntity()); } else { // If the disguise type is tnt, we need to resend the entity packet else it will turn invisible - if (getType() == DisguiseType.PRIMED_TNT) { + if (getType() == DisguiseType.PRIMED_TNT || getType() == DisguiseType.FIREWORK) { i++; if (i % 40 == 0) { i = 0; diff --git a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index 597830d0..d210a31f 100644 --- a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -75,9 +75,9 @@ public class DisguiseUtilities { d.unsetViewDisguise(name); } } else { - for (String playername : new ArrayList(d.getObservers())) { + for (String playername : d.getObservers()) { if (!disguise.getObservers().contains(playername)) { - d.unsetViewDisguise(playername); + d.silentlyUnsetViewDisguise(playername); } } } From 063b916c25ac0ef534a370a4f00b383285d3d1b1 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Wed, 4 Dec 2013 07:38:10 +1300 Subject: [PATCH 14/33] Rename stuff. Remove debug output. --- .../libraryaddict/disguise/DisguiseAPI.java | 29 ++++++---- .../disguisetypes/TargetedDisguise.java | 58 +++++++++++-------- .../disguise/utilities/DisguiseUtilities.java | 38 +++++++----- 3 files changed, 74 insertions(+), 51 deletions(-) diff --git a/src/me/libraryaddict/disguise/DisguiseAPI.java b/src/me/libraryaddict/disguise/DisguiseAPI.java index c5d1c38c..1bd1aa5b 100644 --- a/src/me/libraryaddict/disguise/DisguiseAPI.java +++ b/src/me/libraryaddict/disguise/DisguiseAPI.java @@ -1,6 +1,7 @@ package me.libraryaddict.disguise; import java.lang.reflect.Field; +import java.util.Arrays; import java.util.List; import me.libraryaddict.disguise.disguisetypes.Disguise; @@ -59,14 +60,18 @@ public class DisguiseAPI { DisguiseUtilities.setupFakeDisguise(disguise); } - public static void disguiseIgnorePlayers(Entity entity, Disguise disguise, List players) { - ((TargetedDisguise) disguise).setTargetType(TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS); - for (String name : players) { - ((TargetedDisguise) disguise).setViewDisguise(name); + public static void disguiseIgnorePlayers(Entity entity, Disguise disguise, List playersToNotSeeDisguise) { + ((TargetedDisguise) disguise).setDisguiseTarget(TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS); + for (String name : playersToNotSeeDisguise) { + ((TargetedDisguise) disguise).addPlayer(name); } disguiseEntity(entity, disguise); } + public static void disguiseIgnorePlayers(Entity entity, Disguise disguise, String... playersToNotSeeDisguise) { + disguiseIgnorePlayers(entity, disguise, Arrays.asList(playersToNotSeeDisguise)); + } + /** * Disguise the next entity to spawn with this disguise. This may not work however if the entity doesn't actually spawn. */ @@ -91,20 +96,24 @@ public class DisguiseAPI { */ public static void disguiseToAll(Entity entity, Disguise disguise) { // You called the disguiseToAll method foolish mortal! Prepare to have your custom settings wiped!!! - ((TargetedDisguise) disguise).setTargetType(TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS); + ((TargetedDisguise) disguise).setDisguiseTarget(TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS); for (String observer : ((TargetedDisguise) disguise).getObservers()) - ((TargetedDisguise) disguise).unsetViewDisguise(observer); + ((TargetedDisguise) disguise).removePlayer(observer); disguiseEntity(entity, disguise); } - public static void disguiseToPlayers(Entity entity, Disguise disguise, List players) { - ((TargetedDisguise) disguise).setTargetType(TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS); - for (String name : players) { - ((TargetedDisguise) disguise).setViewDisguise(name); + public static void disguiseToPlayers(Entity entity, Disguise disguise, List playersToViewDisguise) { + ((TargetedDisguise) disguise).setDisguiseTarget(TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS); + for (String name : playersToViewDisguise) { + ((TargetedDisguise) disguise).addPlayer(name); } disguiseEntity(entity, disguise); } + public static void disguiseToPlayers(Entity entity, Disguise disguise, String... playersToViewDisguise) { + disguiseToPlayers(entity, disguise, Arrays.asList(playersToViewDisguise)); + } + /** * Get the disguise of a entity */ diff --git a/src/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java b/src/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java index f43a9ad1..bb912ff7 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java @@ -18,6 +18,20 @@ public abstract class TargetedDisguise extends Disguise { private TargetType targetType = TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS; + public void addPlayer(Player player) { + addPlayer(player.getName()); + } + + public void addPlayer(String playername) { + if (!disguiseViewers.contains(playername)) { + disguiseViewers.add(playername); + if (DisguiseAPI.isDisguiseInUse(this)) { + DisguiseUtilities.checkConflicts(this, playername); + DisguiseUtilities.refreshTracker(this, playername); + } + } + } + public boolean canSee(Player player) { return canSee(player.getName()); } @@ -30,50 +44,44 @@ public abstract class TargetedDisguise extends Disguise { return hasPlayer; } + public TargetType getDisguiseTarget() { + return targetType; + } + public List getObservers() { return Collections.unmodifiableList(disguiseViewers); } - public TargetType getTargetType() { - return targetType; + public void removePlayer(Player player) { + removePlayer(player.getName()); } - public void setTargetType(TargetType newTargetType) { + public void removePlayer(String playername) { + if (disguiseViewers.contains(playername)) { + disguiseViewers.remove(playername); + if (DisguiseAPI.isDisguiseInUse(this)) { + DisguiseUtilities.checkConflicts(this, playername); + DisguiseUtilities.refreshTracker(this, playername); + } + } + } + + public void setDisguiseTarget(TargetType newTargetType) { if (DisguiseUtilities.isDisguiseInUse(this)) { throw new RuntimeException("Cannot set the disguise target after the entity has been disguised"); } targetType = newTargetType; } - public void silentlySetViewDisguise(String playername) { + public void silentlyAddPlayer(String playername) { if (!disguiseViewers.contains(playername)) { disguiseViewers.add(playername); } } - public void silentlyUnsetViewDisguise(String playername) { + public void silentlyRemovePlayer(String playername) { if (disguiseViewers.contains(playername)) { disguiseViewers.remove(playername); } } - - public void setViewDisguise(String playername) { - if (!disguiseViewers.contains(playername)) { - disguiseViewers.add(playername); - if (DisguiseAPI.isDisguiseInUse(this)) { - DisguiseUtilities.checkConflicts(this, playername); - DisguiseUtilities.refreshTracker(this, playername); - } - } - } - - public void unsetViewDisguise(String playername) { - if (disguiseViewers.contains(playername)) { - disguiseViewers.remove(playername); - if (DisguiseAPI.isDisguiseInUse(this)) { - DisguiseUtilities.checkConflicts(this, playername); - DisguiseUtilities.refreshTracker(this, playername); - } - } - } } diff --git a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index d210a31f..910dc43c 100644 --- a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -2,7 +2,6 @@ package me.libraryaddict.disguise.utilities; import java.lang.reflect.Field; import java.lang.reflect.Method; -import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -51,54 +50,61 @@ public class DisguiseUtilities { * observers in the disguise don't see any other disguise. */ public static void checkConflicts(TargetedDisguise disguise, String name) { + // If the disguise is being used.. Else we may accidentally undisguise something else if (DisguiseAPI.isDisguiseInUse(disguise)) { Iterator disguiseItel = getDisguises().get(disguise.getEntity().getEntityId()).iterator(); + // Iterate through the disguises while (disguiseItel.hasNext()) { TargetedDisguise d = disguiseItel.next(); + // Make sure the disguise isn't the same thing if (d != disguise) { - if (d.getTargetType() == TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS) { + // If the loop'd disguise is hiding the disguise to everyone in its list + if (d.getDisguiseTarget() == TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS) { // If player is a observer in the loop - if (disguise.getTargetType() == TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS) { + if (disguise.getDisguiseTarget() == TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS) { // If player is a observer in the disguise // Remove them from the loop if (name != null) { - d.unsetViewDisguise(name); + d.removePlayer(name); } else { for (String playername : disguise.getObservers()) { - d.silentlyUnsetViewDisguise(playername); + d.silentlyRemovePlayer(playername); } } - } else if (disguise.getTargetType() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) { + } else if (disguise.getDisguiseTarget() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) { // If player is not a observer in the loop if (name != null) { if (!disguise.getObservers().contains(name)) { - d.unsetViewDisguise(name); + d.removePlayer(name); } } else { for (String playername : d.getObservers()) { if (!disguise.getObservers().contains(playername)) { - d.silentlyUnsetViewDisguise(playername); + d.silentlyRemovePlayer(playername); } } } } - } else if (d.getTargetType() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) { + } else if (d.getDisguiseTarget() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) { // Here you add it to the loop if they see the disguise - if (disguise.getTargetType() == TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS) { + if (disguise.getDisguiseTarget() == TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS) { // Everyone who is in the disguise needs to be added to the loop if (name != null) { - d.setViewDisguise(name); + d.addPlayer(name); } else { for (String playername : disguise.getObservers()) { - d.silentlySetViewDisguise(playername); + d.silentlyAddPlayer(playername); } } - } else if (disguise.getTargetType() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) { + } else if (disguise.getDisguiseTarget() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS) { // This here is a paradox. // If fed a name. I can do this. // But the rest of the time.. Its going to conflict. - System.out.print("Cannot set more than one " + TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS - + " on a entity. Removed the old disguise."); + // The below is debug output. Most people wouldn't care for it. + + // System.out.print("Cannot set more than one " + TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS + // + " on a entity. Removed the old disguise."); + disguiseItel.remove(); /* if (name != null) { if (!disguise.getObservers().contains(name)) { @@ -123,7 +129,7 @@ public class DisguiseUtilities { TargetedDisguise toReturn = null; if (getDisguises().containsKey(entityId)) { for (TargetedDisguise disguise : getDisguises().get(entityId)) { - if (disguise.getTargetType() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS + if (disguise.getDisguiseTarget() == TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS && disguise.getObservers().isEmpty()) { return disguise; } From c6ff4dafe79d927321c4e5c8a280a1bf7068277f Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Wed, 4 Dec 2013 07:44:33 +1300 Subject: [PATCH 15/33] Add more commenting, add addEntityAnimations to flagwatcher clone --- src/me/libraryaddict/disguise/disguisetypes/AnimalColor.java | 3 +++ src/me/libraryaddict/disguise/disguisetypes/Disguise.java | 5 ++++- src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/me/libraryaddict/disguise/disguisetypes/AnimalColor.java b/src/me/libraryaddict/disguise/disguisetypes/AnimalColor.java index c1021d00..08a1fa5a 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/AnimalColor.java +++ b/src/me/libraryaddict/disguise/disguisetypes/AnimalColor.java @@ -10,6 +10,9 @@ public enum AnimalColor { value = newValue; } + /** + * The color ID as defined by nms internals. + */ public int getId() { return value; } diff --git a/src/me/libraryaddict/disguise/disguisetypes/Disguise.java b/src/me/libraryaddict/disguise/disguisetypes/Disguise.java index 0647bf0b..b4e4dca7 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/Disguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/Disguise.java @@ -48,12 +48,15 @@ public abstract class Disguise { @Override public abstract Disguise clone(); + /** + * Seems I do this method so I can make cleaner constructors on disguises.. + */ protected void createDisguise(DisguiseType newType, boolean doSounds) { if (getWatcher() != null) return; if (newType.getEntityType() == null) { throw new RuntimeException("DisguiseType " + newType - + " was used to attempt to construct a disguise, but this version of craftbukkit does not have that entity"); + + " was used in a futile attempt to construct a disguise, but this version of craftbukkit does not have that entity"); } // Set the disguise type disguiseType = newType; diff --git a/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java index 18bc51aa..80591207 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java @@ -67,6 +67,7 @@ public class FlagWatcher { cloned.entityValues = (HashMap) entityValues.clone(); cloned.items = items.clone(); cloned.modifiedEntityAnimations = (HashSet) modifiedEntityAnimations.clone(); + cloned.addEntityAnimations = addEntityAnimations; return cloned; } From 3299d97495a41fb552cbce3465ede8a0cce53545 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Thu, 5 Dec 2013 20:15:58 +1300 Subject: [PATCH 16/33] Cleaned up getEntitySize() minorly. --- src/me/libraryaddict/disguise/utilities/DisguiseValues.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/me/libraryaddict/disguise/utilities/DisguiseValues.java b/src/me/libraryaddict/disguise/utilities/DisguiseValues.java index 0a3cb7c4..c9cdbda2 100644 --- a/src/me/libraryaddict/disguise/utilities/DisguiseValues.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseValues.java @@ -87,7 +87,8 @@ public class DisguiseValues { } return (int) Math.ceil(paramDouble * 32.0D); - case 6: + default: + break; } if (d > 0.0D) { return (int) Math.ceil(paramDouble * 32.0D); From d415f6340ef3bfe92aad1a02bc99cfa0a0b2ca94 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Thu, 5 Dec 2013 20:38:41 +1300 Subject: [PATCH 17/33] Start the road to a 1.7 update --- pom.xml | 2 +- .../disguise/utilities/PacketsManager.java | 8 +++-- .../disguise/utilities/ReflectionManager.java | 33 +++++++++++++++++-- 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 329017a3..166c02fb 100644 --- a/pom.xml +++ b/pom.xml @@ -56,7 +56,7 @@ com.comphenix.protocol ProtocolLib - 2.7.0 + 3.0.0-SNAPSHOT 7.7.5-SNAPSHOT diff --git a/src/me/libraryaddict/disguise/utilities/PacketsManager.java b/src/me/libraryaddict/disguise/utilities/PacketsManager.java index 373b1d50..d685b607 100644 --- a/src/me/libraryaddict/disguise/utilities/PacketsManager.java +++ b/src/me/libraryaddict/disguise/utilities/PacketsManager.java @@ -196,8 +196,12 @@ public class PacketsManager { spawnPackets[0] = new PacketContainer(Packets.Server.NAMED_ENTITY_SPAWN); StructureModifier stringMods = spawnPackets[0].getStrings(); - for (int i = 0; i < stringMods.size(); i++) { - stringMods.write(i, ((PlayerDisguise) disguise).getName()); + if (stringMods.size() > 0) { + for (int i = 0; i < stringMods.size(); i++) { + stringMods.write(i, ((PlayerDisguise) disguise).getName()); + } + } else { + spawnPackets[0].getModifier().write(1, ReflectionManager.getGameProfile(((PlayerDisguise) disguise).getName())); } StructureModifier intMods = spawnPackets[0].getIntegers(); intMods.write(0, disguisedEntity.getEntityId()); diff --git a/src/me/libraryaddict/disguise/utilities/ReflectionManager.java b/src/me/libraryaddict/disguise/utilities/ReflectionManager.java index 8892e00e..cbfa3260 100644 --- a/src/me/libraryaddict/disguise/utilities/ReflectionManager.java +++ b/src/me/libraryaddict/disguise/utilities/ReflectionManager.java @@ -51,12 +51,29 @@ public class ReflectionManager { Object entityObject; Object world = getWorld(Bukkit.getWorlds().get(0)); if (entityName.equals("Player")) { + boolean useOld = false; + if (bukkitVersion.startsWith("1.")) { + try { + if (Integer.parseInt(bukkitVersion.split("\\.")[1]) < 7) { + useOld = true; + } + } catch (Exception ex) { + + } + } Object minecraftServer = getNmsClass("MinecraftServer").getMethod("getServer").invoke(null); Object playerinteractmanager = getNmsClass("PlayerInteractManager").getConstructor(getNmsClass("World")) .newInstance(world); - entityObject = entityClass.getConstructor(getNmsClass("MinecraftServer"), getNmsClass("World"), String.class, - playerinteractmanager.getClass()).newInstance(minecraftServer, world, "LibsDisguises", - playerinteractmanager); + if (useOld) { + entityObject = entityClass.getConstructor(getNmsClass("MinecraftServer"), getNmsClass("World"), String.class, + playerinteractmanager.getClass()).newInstance(minecraftServer, world, "LibsDisguises", + playerinteractmanager); + } else { + Object gameProfile = getGameProfile("LibsDisguises"); + entityObject = entityClass.getConstructor(getNmsClass("MinecraftServer"), getNmsClass("WorldServer"), + gameProfile.getClass(), playerinteractmanager.getClass()).newInstance(minecraftServer, world, + gameProfile, playerinteractmanager); + } } else { entityObject = entityClass.getConstructor(getNmsClass("World")).newInstance(world); } @@ -67,6 +84,16 @@ public class ReflectionManager { return null; } + public static Object getGameProfile(String playerName) { + try { + return Class.forName("net.minecraft.util.com.mojang.authlib.GameProfile").getConstructor(String.class, String.class) + .newInstance(playerName, playerName); + } catch (Exception ex) { + ex.printStackTrace(); + } + return null; + } + public static Entity getBukkitEntity(Object nmsEntity) { try { Entity bukkitEntity = (Entity) ReflectionManager.getNmsClass("Entity").getMethod("getBukkitEntity").invoke(nmsEntity); From 6e5241aec3aff925cfececbd36103f3876ebea80 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Thu, 5 Dec 2013 21:05:58 +1300 Subject: [PATCH 18/33] Add new config option to remove unseen disguises for targeted disguises. --- config.yml | 6 +++- .../libraryaddict/disguise/DisguiseAPI.java | 9 ++++++ .../disguise/DisguiseListener.java | 11 +++++++ .../libraryaddict/disguise/LibsDisguises.java | 1 + .../disguise/utilities/DisguiseUtilities.java | 31 ++++++++++++++++--- .../disguise/utilities/ReflectionManager.java | 20 ++++++------ 6 files changed, 63 insertions(+), 15 deletions(-) diff --git a/config.yml b/config.yml index c801f202..32293f0d 100644 --- a/config.yml +++ b/config.yml @@ -27,4 +27,8 @@ RemoveHeldItem: true # If you set a disguise to burning, it will no longer be able to be shown as sneaking or invisible. # Set this to true if you want the disguise to get the animations of the disguised entity. Such as invisible, on fire, sprinting, sneaking, blocking # This is only valid if you set a animation on the disguise itself. Because the entitys animations are applied otherwise. -AddEntityAnimations: true \ No newline at end of file +AddEntityAnimations: true +# If all players who can see a targeted disguise (Only advalible to plugins) have quit. +# Does the plugin remove that disguise from valid disguises? If your plugin handles this. Then thats good. +# Else its a memory leak. This loops through all disguise to see if anyone else is online who can see that disguise. +RemoveUnusedDisguises: true \ No newline at end of file diff --git a/src/me/libraryaddict/disguise/DisguiseAPI.java b/src/me/libraryaddict/disguise/DisguiseAPI.java index 1bd1aa5b..34637388 100644 --- a/src/me/libraryaddict/disguise/DisguiseAPI.java +++ b/src/me/libraryaddict/disguise/DisguiseAPI.java @@ -22,6 +22,7 @@ public class DisguiseAPI { private static boolean hidingArmor; private static boolean hidingHeldItem; private static boolean isEntityAnimationsAdded; + private static boolean removeUnseenDisguises; private static boolean sendVelocity; @Deprecated @@ -203,6 +204,10 @@ public class DisguiseAPI { return PacketsManager.isHearDisguisesEnabled(); } + public static boolean isUnusedDisguisesRemoved() { + return removeUnseenDisguises; + } + /** * Is the velocity packets sent */ @@ -261,6 +266,10 @@ public class DisguiseAPI { PacketsManager.setHearDisguisesListener(isSoundsEnabled); } + public static void setUnusedDisguisesRemoved(boolean remove) { + removeUnseenDisguises = remove; + } + /** * Disable velocity packets being sent for w/e reason. Maybe you want every ounce of performance you can get? */ diff --git a/src/me/libraryaddict/disguise/DisguiseListener.java b/src/me/libraryaddict/disguise/DisguiseListener.java index 13d4d2bf..ba27fbeb 100644 --- a/src/me/libraryaddict/disguise/DisguiseListener.java +++ b/src/me/libraryaddict/disguise/DisguiseListener.java @@ -3,6 +3,7 @@ package me.libraryaddict.disguise; import java.util.HashMap; import me.libraryaddict.disguise.disguisetypes.Disguise; +import me.libraryaddict.disguise.disguisetypes.TargetedDisguise; import me.libraryaddict.disguise.utilities.DisguiseUtilities; import me.libraryaddict.disguise.utilities.UpdateChecker; @@ -14,6 +15,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.vehicle.VehicleEnterEvent; import org.bukkit.event.vehicle.VehicleExitEvent; import org.bukkit.scheduler.BukkitRunnable; @@ -66,6 +68,15 @@ public class DisguiseListener implements Listener { p.sendMessage(String.format(updateMessage, currentVersion, latestVersion)); } + @EventHandler + public void onQuit(PlayerQuitEvent event) { + if (DisguiseAPI.isUnusedDisguisesRemoved()) { + for (TargetedDisguise disguise : DisguiseUtilities.getSeenDisguises(event.getPlayer().getName())) { + disguise.removeDisguise(); + } + } + } + @EventHandler public void onRightClick(PlayerInteractEntityEvent event) { if (disguiseSlap.containsKey(event.getPlayer().getName())) { diff --git a/src/me/libraryaddict/disguise/LibsDisguises.java b/src/me/libraryaddict/disguise/LibsDisguises.java index 60820715..5a3cdda0 100644 --- a/src/me/libraryaddict/disguise/LibsDisguises.java +++ b/src/me/libraryaddict/disguise/LibsDisguises.java @@ -64,6 +64,7 @@ public class LibsDisguises extends JavaPlugin { DisguiseAPI.setHideArmorFromSelf(getConfig().getBoolean("RemoveArmor")); DisguiseAPI.setHideHeldItemFromSelf(getConfig().getBoolean("RemoveHeldItem")); DisguiseAPI.setAddEntityAnimations(getConfig().getBoolean("AddEntityAnimations")); + DisguiseAPI.setUnusedDisguisesRemoved(getConfig().getBoolean("RemoveUnusedDisguises")); if (DisguiseAPI.isHidingArmorFromSelf() || DisguiseAPI.isHidingHeldItemFromSelf()) { DisguiseAPI.setInventoryListenerEnabled(true); } diff --git a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index 910dc43c..66cced71 100644 --- a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -2,9 +2,11 @@ package me.libraryaddict.disguise.utilities; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.List; import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.LibsDisguises; @@ -101,10 +103,10 @@ public class DisguiseUtilities { // If fed a name. I can do this. // But the rest of the time.. Its going to conflict. // The below is debug output. Most people wouldn't care for it. - - // System.out.print("Cannot set more than one " + TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS - // + " on a entity. Removed the old disguise."); - + + // System.out.print("Cannot set more than one " + TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS + // + " on a entity. Removed the old disguise."); + disguiseItel.remove(); /* if (name != null) { if (!disguise.getObservers().contains(name)) { @@ -163,6 +165,27 @@ public class DisguiseUtilities { return new TargetedDisguise[0]; } + public static List getSeenDisguises(String viewer) { + List dis = new ArrayList(); + for (HashSet disguises : getDisguises().values()) { + for (TargetedDisguise disguise : disguises) { + if (disguise.getDisguiseTarget() == TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS) { + if (disguise.canSee(viewer)) { + boolean add = false; + for (String observer : disguise.getObservers()) { + if (!observer.equals(viewer) && Bukkit.getPlayerExact(observer) != null) { + add = true; + break; + } + } + if (add) + dis.add(disguise); + } + } + } + }return dis; + } + public static HashMap getSelfDisguisesIds() { return selfDisguisesIds; } diff --git a/src/me/libraryaddict/disguise/utilities/ReflectionManager.java b/src/me/libraryaddict/disguise/utilities/ReflectionManager.java index cbfa3260..8a1cd1a9 100644 --- a/src/me/libraryaddict/disguise/utilities/ReflectionManager.java +++ b/src/me/libraryaddict/disguise/utilities/ReflectionManager.java @@ -84,16 +84,6 @@ public class ReflectionManager { return null; } - public static Object getGameProfile(String playerName) { - try { - return Class.forName("net.minecraft.util.com.mojang.authlib.GameProfile").getConstructor(String.class, String.class) - .newInstance(playerName, playerName); - } catch (Exception ex) { - ex.printStackTrace(); - } - return null; - } - public static Entity getBukkitEntity(Object nmsEntity) { try { Entity bukkitEntity = (Entity) ReflectionManager.getNmsClass("Entity").getMethod("getBukkitEntity").invoke(nmsEntity); @@ -147,6 +137,16 @@ public class ReflectionManager { return null; } + public static Object getGameProfile(String playerName) { + try { + return Class.forName("net.minecraft.util.com.mojang.authlib.GameProfile").getConstructor(String.class, String.class) + .newInstance(playerName, playerName); + } catch (Exception ex) { + ex.printStackTrace(); + } + return null; + } + public static Class getNmsClass(String className) { try { return Class.forName("net.minecraft.server." + bukkitVersion + "." + className); From bd83ff0c80cf8c3f2c759e5a457856d26847bb9d Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Thu, 5 Dec 2013 21:06:52 +1300 Subject: [PATCH 19/33] Fix bug. And it only removes the disguises targeted towards certain players. --- .../libraryaddict/disguise/utilities/DisguiseUtilities.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index 66cced71..1111d9fb 100644 --- a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -171,10 +171,10 @@ public class DisguiseUtilities { for (TargetedDisguise disguise : disguises) { if (disguise.getDisguiseTarget() == TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS) { if (disguise.canSee(viewer)) { - boolean add = false; + boolean add = true; for (String observer : disguise.getObservers()) { if (!observer.equals(viewer) && Bukkit.getPlayerExact(observer) != null) { - add = true; + add = false; break; } } From 40694c50304fe883f4e20d88e28c3c2ef46966ef Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Thu, 5 Dec 2013 21:21:27 +1300 Subject: [PATCH 20/33] Added setBaby and isBaby to zombiewatcher. Deprecated setadult for ageable and zombie watcher --- .../disguisetypes/watchers/AgeableWatcher.java | 2 ++ .../disguisetypes/watchers/ZombieWatcher.java | 12 +++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/me/libraryaddict/disguise/disguisetypes/watchers/AgeableWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/AgeableWatcher.java index 731de581..ad320608 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/watchers/AgeableWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/AgeableWatcher.java @@ -12,6 +12,7 @@ public class AgeableWatcher extends LivingWatcher { return (Integer) getValue(12, 0); } + @Deprecated public boolean isAdult() { return !isBaby(); } @@ -20,6 +21,7 @@ public class AgeableWatcher extends LivingWatcher { return (Integer) getValue(12, 0) < 0; } + @Deprecated public void setAdult(boolean isAdult) { setBaby(!isAdult); } diff --git a/src/me/libraryaddict/disguise/disguisetypes/watchers/ZombieWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/ZombieWatcher.java index f96e40c6..97d44a11 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/watchers/ZombieWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/ZombieWatcher.java @@ -8,16 +8,26 @@ public class ZombieWatcher extends LivingWatcher { super(disguise); } + @Deprecated public boolean isAdult() { return (Byte) getValue(12, (byte) 0) == 0; } + public boolean isBaby() { + return (Byte) getValue(12, (byte) 0) == 1; + } + public boolean isVillager() { return (Byte) getValue(13, (byte) 0) == 1; } + @Deprecated public void setAdult(boolean adult) { - setValue(12, (byte) (adult ? 0 : 1)); + setBaby(!adult); + } + + public void setBaby(boolean baby) { + setValue(12, (byte) (baby ? 1 : 0)); sendData(12); } From a759cfaa59adf6951d5a6e4b0baaf74314597acf Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Thu, 5 Dec 2013 21:27:46 +1300 Subject: [PATCH 21/33] Changed getHeldItem and setHeldItem in enderman and flagwatcher to setItemInHand --- .../disguise/disguisetypes/FlagWatcher.java | 10 ++++++++++ .../disguisetypes/watchers/EndermanWatcher.java | 12 ++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java index 80591207..fd19559f 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java @@ -167,7 +167,12 @@ public class FlagWatcher { return ((Byte) getValue(0, (byte) 0) & 1 << i) != 0; } + @Deprecated public org.bukkit.inventory.ItemStack getHeldItem() { + return getItemInHand(); + } + + public org.bukkit.inventory.ItemStack getItemInHand() { return getItemStack(SlotType.HELD_ITEM); } @@ -272,7 +277,12 @@ public class FlagWatcher { } } + @Deprecated public void setHeldItem(org.bukkit.inventory.ItemStack itemstack) { + setItemInHand(itemstack); + } + + public void setItemInHand(org.bukkit.inventory.ItemStack itemstack) { setItemStack(SlotType.HELD_ITEM, itemstack); } diff --git a/src/me/libraryaddict/disguise/disguisetypes/watchers/EndermanWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/EndermanWatcher.java index 80e46fe9..c7c60659 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/watchers/EndermanWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/EndermanWatcher.java @@ -21,7 +21,13 @@ public class EndermanWatcher extends LivingWatcher { } @Override + @Deprecated public ItemStack getHeldItem() { + return getItemInHand(); + } + + @Override + public ItemStack getItemInHand() { return new ItemStack((Byte) getValue(16, (byte) 0), 1, ((Byte) getValue(17, (byte) 0))); } @@ -49,7 +55,13 @@ public class EndermanWatcher extends LivingWatcher { } @Override + @Deprecated public void setHeldItem(ItemStack itemstack) { + setItemInHand(itemstack); + } + + @Override + public void setItemInHand(ItemStack itemstack) { setValue(16, (byte) (itemstack.getTypeId() & 255)); setValue(17, (byte) (itemstack.getDurability() & 255)); } From 3541e82c48f1114da4e97b5a178139d5f529dd51 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Fri, 6 Dec 2013 05:01:08 +1300 Subject: [PATCH 22/33] Minor code cleanup --- .../libraryaddict/disguise/utilities/DisguiseUtilities.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index 1111d9fb..3c815d5a 100644 --- a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -178,12 +178,14 @@ public class DisguiseUtilities { break; } } - if (add) + if (add) { dis.add(disguise); + } } } } - }return dis; + } + return dis; } public static HashMap getSelfDisguisesIds() { From b29e8e611517647692926f2a1cfeb1655829a37a Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Fri, 6 Dec 2013 20:13:45 +1300 Subject: [PATCH 23/33] Read desc Added method to reflection manager to check if after 1.7 Fixed error with packet use entity Fixed error with walk sounds --- .../disguise/utilities/PacketsManager.java | 9 +++++-- .../disguise/utilities/ReflectionManager.java | 24 ++++++++++--------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/me/libraryaddict/disguise/utilities/PacketsManager.java b/src/me/libraryaddict/disguise/utilities/PacketsManager.java index d685b607..cd5012fa 100644 --- a/src/me/libraryaddict/disguise/utilities/PacketsManager.java +++ b/src/me/libraryaddict/disguise/utilities/PacketsManager.java @@ -110,7 +110,7 @@ public class PacketsManager { try { Player observer = event.getPlayer(); StructureModifier entityModifer = event.getPacket().getEntityModifier(observer.getWorld()); - org.bukkit.entity.Entity entity = entityModifer.read(1); + org.bukkit.entity.Entity entity = entityModifer.read(ReflectionManager.isAfter17() ? 1 : 0); if (entity instanceof ExperienceOrb || entity instanceof Item || entity instanceof Arrow) { event.setCancelled(true); } @@ -535,7 +535,12 @@ public class PacketsManager { int typeId = soundLoc.getWorld().getBlockTypeIdAt(soundLoc.getBlockX(), soundLoc.getBlockY() - 1, soundLoc.getBlockZ()); Class blockClass = ReflectionManager.getNmsClass("Block"); - Object block = ((Object[]) blockClass.getField("byId").get(null))[typeId]; + Object block; + if (ReflectionManager.isAfter17()) { + block = blockClass.getMethod("REGISTRY", int.class).invoke(null, typeId); + } else { + block = ((Object[]) blockClass.getField("byId").get(null))[typeId]; + } if (block != null) { Object step = blockClass.getField("stepSound").get(block); mods.write(0, step.getClass().getMethod("getStepSound").invoke(step)); diff --git a/src/me/libraryaddict/disguise/utilities/ReflectionManager.java b/src/me/libraryaddict/disguise/utilities/ReflectionManager.java index 8a1cd1a9..9ec53b64 100644 --- a/src/me/libraryaddict/disguise/utilities/ReflectionManager.java +++ b/src/me/libraryaddict/disguise/utilities/ReflectionManager.java @@ -15,6 +15,7 @@ public class ReflectionManager { private static String bukkitVersion = Bukkit.getServer().getClass().getName().split("\\.")[3]; private static Class itemClass; private static Method soundMethod; + private static boolean after17 = true; static { for (Method method : getNmsClass("EntityLiving").getDeclaredMethods()) { try { @@ -43,6 +44,17 @@ public class ReflectionManager { } catch (Exception e) { e.printStackTrace(); } + if (bukkitVersion.startsWith("1.")) { + try { + if (Integer.parseInt(bukkitVersion.split("\\.")[1]) < 7) { + after17 = false; + } + } catch (Exception ex) { + + } + } + }public static boolean isAfter17() { + return after17; } public static Object createEntityInstance(String entityName) { @@ -51,20 +63,10 @@ public class ReflectionManager { Object entityObject; Object world = getWorld(Bukkit.getWorlds().get(0)); if (entityName.equals("Player")) { - boolean useOld = false; - if (bukkitVersion.startsWith("1.")) { - try { - if (Integer.parseInt(bukkitVersion.split("\\.")[1]) < 7) { - useOld = true; - } - } catch (Exception ex) { - - } - } Object minecraftServer = getNmsClass("MinecraftServer").getMethod("getServer").invoke(null); Object playerinteractmanager = getNmsClass("PlayerInteractManager").getConstructor(getNmsClass("World")) .newInstance(world); - if (useOld) { + if (!isAfter17()) { entityObject = entityClass.getConstructor(getNmsClass("MinecraftServer"), getNmsClass("World"), String.class, playerinteractmanager.getClass()).newInstance(minecraftServer, world, "LibsDisguises", playerinteractmanager); From af51c6def05c0bf73507037781732f598ffc3c0c Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Fri, 6 Dec 2013 20:19:08 +1300 Subject: [PATCH 24/33] Fix error --- src/me/libraryaddict/disguise/utilities/PacketsManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/me/libraryaddict/disguise/utilities/PacketsManager.java b/src/me/libraryaddict/disguise/utilities/PacketsManager.java index cd5012fa..c8f1bfbe 100644 --- a/src/me/libraryaddict/disguise/utilities/PacketsManager.java +++ b/src/me/libraryaddict/disguise/utilities/PacketsManager.java @@ -110,7 +110,7 @@ public class PacketsManager { try { Player observer = event.getPlayer(); StructureModifier entityModifer = event.getPacket().getEntityModifier(observer.getWorld()); - org.bukkit.entity.Entity entity = entityModifer.read(ReflectionManager.isAfter17() ? 1 : 0); + org.bukkit.entity.Entity entity = entityModifer.read(ReflectionManager.isAfter17() ? 0 : 1); if (entity instanceof ExperienceOrb || entity instanceof Item || entity instanceof Arrow) { event.setCancelled(true); } From a8b5c44a720bd307f4bbe9cfb1b9edc6de2455e5 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Sun, 8 Dec 2013 03:30:30 +1300 Subject: [PATCH 25/33] Convert all the packet ids to use the new packettype --- pom.xml | 5 + .../disguise/disguisetypes/Disguise.java | 7 +- .../disguise/disguisetypes/FlagWatcher.java | 5 +- .../disguise/utilities/DisguiseUtilities.java | 21 +- .../disguise/utilities/PacketsManager.java | 206 ++++++++---------- 5 files changed, 111 insertions(+), 133 deletions(-) diff --git a/pom.xml b/pom.xml index 166c02fb..b2bf9055 100644 --- a/pom.xml +++ b/pom.xml @@ -41,6 +41,11 @@ Comphenix Repository http://repo.comphenix.net/content/groups/public + + comphenix-rep + Comphenix Snapshot Repository + http://repo.comphenix.net/content/repositories/snapshots/ + bukkit-repo http://repo.bukkit.org/content/groups/public diff --git a/src/me/libraryaddict/disguise/disguisetypes/Disguise.java b/src/me/libraryaddict/disguise/disguisetypes/Disguise.java index b4e4dca7..f142e8bd 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/Disguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/Disguise.java @@ -22,6 +22,7 @@ import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.util.Vector; +import com.comphenix.protocol.PacketType; import com.comphenix.protocol.Packets; import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.events.PacketContainer; @@ -210,7 +211,7 @@ public abstract class Disguise { if (getType() != DisguiseType.EXPERIENCE_ORB || !getEntity().isOnGround()) { PacketContainer lookPacket = null; if (getType() == DisguiseType.WITHER_SKULL) { - lookPacket = new PacketContainer(Packets.Server.ENTITY_LOOK); + lookPacket = new PacketContainer(PacketType.Play.Server.ENTITY_LOOK); StructureModifier mods = lookPacket.getModifier(); mods.write(0, getEntity().getEntityId()); Location loc = getEntity().getLocation(); @@ -233,7 +234,7 @@ public abstract class Disguise { try { Field ping = ReflectionManager.getNmsClass("EntityPlayer").getField("ping"); for (Player player : getPerverts()) { - PacketContainer packet = new PacketContainer(Packets.Server.ENTITY_VELOCITY); + PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_VELOCITY); StructureModifier mods = packet.getModifier(); if (getEntity() == player) { if (!isSelfDisguiseVisible()) { @@ -260,7 +261,7 @@ public abstract class Disguise { } // If we need to send more packets because else it still 'sinks' if (sendMovementPacket) { - PacketContainer packet = new PacketContainer(Packets.Server.REL_ENTITY_MOVE); + PacketContainer packet = new PacketContainer(PacketType.Play.Server.REL_ENTITY_MOVE); StructureModifier mods = packet.getModifier(); mods.write(0, getEntity().getEntityId()); for (Player player : getPerverts()) { diff --git a/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java index fd19559f..777f334f 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java @@ -12,6 +12,7 @@ import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.inventory.EntityEquipment; +import com.comphenix.protocol.PacketType; import com.comphenix.protocol.Packets; import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.events.PacketContainer; @@ -232,7 +233,7 @@ public class FlagWatcher { Object value = entityValues.get(data); List list = new ArrayList(); list.add(new WrappedWatchableObject(data, value)); - PacketContainer packet = new PacketContainer(Packets.Server.ENTITY_METADATA); + PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA); StructureModifier mods = packet.getModifier(); mods.write(0, entity.getEntityId()); packet.getWatchableCollectionModifier().write(0, list); @@ -316,7 +317,7 @@ public class FlagWatcher { slot++; if (slot > 4) slot = 0; - PacketContainer packet = new PacketContainer(Packets.Server.ENTITY_EQUIPMENT); + PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_EQUIPMENT); StructureModifier mods = packet.getModifier(); mods.write(0, getDisguise().getEntity().getEntityId()); mods.write(1, slot); diff --git a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index 3c815d5a..e5d862f8 100644 --- a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -23,6 +23,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionEffect; import org.bukkit.util.Vector; +import com.comphenix.protocol.PacketType; import com.comphenix.protocol.Packets; import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.ProtocolManager; @@ -282,7 +283,7 @@ public class DisguiseUtilities { public static void removeSelfDisguise(Player player) { if (selfDisguisesIds.containsKey(player.getEntityId())) { // Send a packet to destroy the fake entity - PacketContainer packet = new PacketContainer(Packets.Server.DESTROY_ENTITY); + PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_DESTROY); packet.getModifier().write(0, new int[] { selfDisguisesIds.get(player.getEntityId()) }); try { ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet); @@ -313,7 +314,7 @@ public class DisguiseUtilities { player, ProtocolLibrary .getProtocolManager() - .createPacketConstructor(Packets.Server.ENTITY_METADATA, player.getEntityId(), + .createPacketConstructor(PacketType.Play.Server.ENTITY_METADATA, player.getEntityId(), WrappedDataWatcher.getEntityWatcher(player), true) .createPacket(player.getEntityId(), WrappedDataWatcher.getEntityWatcher(player), true)); } catch (Exception ex) { @@ -352,11 +353,11 @@ public class DisguiseUtilities { .getNmsEntity(player)); ProtocolManager manager = ProtocolLibrary.getProtocolManager(); // Send the player a packet with himself being spawned - manager.sendServerPacket(player, manager.createPacketConstructor(Packets.Server.NAMED_ENTITY_SPAWN, player) + manager.sendServerPacket(player, manager.createPacketConstructor(PacketType.Play.Server.NAMED_ENTITY_SPAWN, player) .createPacket(player)); manager.sendServerPacket( player, - manager.createPacketConstructor(Packets.Server.ENTITY_METADATA, player.getEntityId(), + manager.createPacketConstructor(PacketType.Play.Server.ENTITY_METADATA, player.getEntityId(), WrappedDataWatcher.getEntityWatcher(player), true).createPacket(player.getEntityId(), WrappedDataWatcher.getEntityWatcher(player), true)); @@ -373,7 +374,7 @@ public class DisguiseUtilities { Vector velocity = player.getVelocity(); manager.sendServerPacket( player, - manager.createPacketConstructor(Packets.Server.ENTITY_VELOCITY, player.getEntityId(), velocity.getX(), + manager.createPacketConstructor(PacketType.Play.Server.ENTITY_VELOCITY, player.getEntityId(), velocity.getX(), velocity.getY(), velocity.getZ()).createPacket(player.getEntityId(), velocity.getX(), velocity.getY(), velocity.getZ())); } @@ -381,11 +382,11 @@ public class DisguiseUtilities { // Why the hell would he even need this. Meh. if (player.getVehicle() != null && player.getEntityId() > player.getVehicle().getEntityId()) { manager.sendServerPacket(player, - manager.createPacketConstructor(Packets.Server.ATTACH_ENTITY, 0, player, player.getVehicle()) + manager.createPacketConstructor(PacketType.Play.Server.ATTACH_ENTITY, 0, player, player.getVehicle()) .createPacket(0, player, player.getVehicle())); } else if (player.getPassenger() != null && player.getEntityId() > player.getPassenger().getEntityId()) { manager.sendServerPacket(player, - manager.createPacketConstructor(Packets.Server.ATTACH_ENTITY, 0, player.getPassenger(), player) + manager.createPacketConstructor(PacketType.Play.Server.ATTACH_ENTITY, 0, player.getPassenger(), player) .createPacket(0, player.getPassenger(), player)); } @@ -400,7 +401,7 @@ public class DisguiseUtilities { if (item != null && item.getType() != Material.AIR) { manager.sendServerPacket(player, - manager.createPacketConstructor(Packets.Server.ENTITY_EQUIPMENT, player.getEntityId(), i, item) + manager.createPacketConstructor(PacketType.Play.Server.ENTITY_EQUIPMENT, player.getEntityId(), i, item) .createPacket(player.getEntityId(), i, item)); } } @@ -409,7 +410,7 @@ public class DisguiseUtilities { if (player.isSleeping()) { manager.sendServerPacket( player, - manager.createPacketConstructor(Packets.Server.ENTITY_LOCATION_ACTION, player, 0, loc.getBlockX(), + manager.createPacketConstructor(PacketType.Play.Server.BED, player, 0, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()).createPacket(player, 0, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ())); } @@ -419,7 +420,7 @@ public class DisguiseUtilities { while (iterator.hasNext()) { PotionEffect potionEffect = (PotionEffect) iterator.next(); manager.sendServerPacket(player, - manager.createPacketConstructor(Packets.Server.MOB_EFFECT, player.getEntityId(), potionEffect) + manager.createPacketConstructor(PacketType.Play.Server.ENTITY_EFFECT, player.getEntityId(), potionEffect) .createPacket(player.getEntityId(), potionEffect)); } } catch (Exception ex) { diff --git a/src/me/libraryaddict/disguise/utilities/PacketsManager.java b/src/me/libraryaddict/disguise/utilities/PacketsManager.java index c8f1bfbe..291e6054 100644 --- a/src/me/libraryaddict/disguise/utilities/PacketsManager.java +++ b/src/me/libraryaddict/disguise/utilities/PacketsManager.java @@ -33,7 +33,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.util.Vector; -import com.comphenix.protocol.Packets; +import com.comphenix.protocol.PacketType; import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.ProtocolManager; import com.comphenix.protocol.events.ConnectionSide; @@ -59,18 +59,21 @@ public class PacketsManager { public static void addPacketListeners(JavaPlugin libsDisguises) { ProtocolManager manager = ProtocolLibrary.getProtocolManager(); - manager.addPacketListener(new PacketAdapter(libsDisguises, ConnectionSide.SERVER_SIDE, ListenerPriority.HIGH, - Packets.Server.NAMED_ENTITY_SPAWN, Packets.Server.ENTITY_METADATA, Packets.Server.ARM_ANIMATION, - Packets.Server.REL_ENTITY_MOVE_LOOK, Packets.Server.ENTITY_LOOK, Packets.Server.ENTITY_TELEPORT, - Packets.Server.ADD_EXP_ORB, Packets.Server.VEHICLE_SPAWN, Packets.Server.MOB_SPAWN, - Packets.Server.ENTITY_PAINTING, Packets.Server.COLLECT, Packets.Server.UPDATE_ATTRIBUTES, - Packets.Server.ENTITY_EQUIPMENT, Packets.Server.BED, Packets.Server.ENTITY_STATUS) { + manager.addPacketListener(new PacketAdapter(libsDisguises, ListenerPriority.HIGH, + PacketType.Play.Server.NAMED_ENTITY_SPAWN, PacketType.Play.Server.ENTITY_METADATA, + PacketType.Play.Server.ANIMATION, PacketType.Play.Server.ENTITY_MOVE_LOOK, PacketType.Play.Server.ENTITY_LOOK, + PacketType.Play.Server.ENTITY_TELEPORT, PacketType.Play.Server.SPAWN_ENTITY_EXPERIENCE_ORB, + PacketType.Play.Server.SPAWN_ENTITY, PacketType.Play.Server.SPAWN_ENTITY_LIVING, + PacketType.Play.Server.SPAWN_ENTITY_PAINTING, PacketType.Play.Server.COLLECT, + PacketType.Play.Server.UPDATE_ATTRIBUTES, PacketType.Play.Server.ENTITY_EQUIPMENT, PacketType.Play.Server.BED, + PacketType.Play.Server.ENTITY_STATUS) { @Override public void onPacketSending(PacketEvent event) { final Player observer = event.getPlayer(); // First get the entity, the one sending this packet StructureModifier entityModifer = event.getPacket().getEntityModifier(observer.getWorld()); - org.bukkit.entity.Entity entity = entityModifer.read((Packets.Server.COLLECT == event.getPacketID() ? 1 : 0)); + org.bukkit.entity.Entity entity = entityModifer.read((PacketType.Play.Server.COLLECT == event.getPacketType() ? 1 + : 0)); // If the entity is the same as the sender. Don't disguise! // Prevents problems and there is no advantage to be gained. if (entity == observer) @@ -103,8 +106,7 @@ public class PacketsManager { // Now add a client listener to cancel them interacting with uninteractable disguised entitys. // You ain't supposed to be allowed to 'interact' with a item that cannot be clicked. // Because it kicks you for hacking. - manager.addPacketListener(new PacketAdapter(libsDisguises, ConnectionSide.CLIENT_SIDE, ListenerPriority.NORMAL, - Packets.Client.USE_ENTITY) { + manager.addPacketListener(new PacketAdapter(libsDisguises, ListenerPriority.NORMAL, PacketType.Play.Client.USE_ENTITY) { @Override public void onPacketReceiving(PacketEvent event) { try { @@ -145,7 +147,7 @@ public class PacketsManager { } } if (item == null || item.getType() == Material.AIR) { - PacketContainer packet = new PacketContainer(Packets.Server.ENTITY_EQUIPMENT); + PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_EQUIPMENT); StructureModifier mods = packet.getModifier(); mods.write(0, disguisedEntity.getEntityId()); mods.write(1, nmsSlot); @@ -163,7 +165,7 @@ public class PacketsManager { if (disguise.getType() == DisguiseType.EXPERIENCE_ORB) { - spawnPackets[0] = new PacketContainer(Packets.Server.ADD_EXP_ORB); + spawnPackets[0] = new PacketContainer(PacketType.Play.Server.SPAWN_ENTITY_EXPERIENCE_ORB); StructureModifier mods = spawnPackets[0].getModifier(); mods.write(0, disguisedEntity.getEntityId()); mods.write(1, (int) Math.floor(loc.getX() * 32)); @@ -172,7 +174,7 @@ public class PacketsManager { mods.write(4, 1); } else if (disguise.getType() == DisguiseType.PAINTING) { - spawnPackets[0] = new PacketContainer(Packets.Server.ENTITY_PAINTING); + spawnPackets[0] = new PacketContainer(PacketType.Play.Server.SPAWN_ENTITY_PAINTING); StructureModifier mods = spawnPackets[0].getModifier(); mods.write(0, disguisedEntity.getEntityId()); mods.write(1, loc.getBlockX()); @@ -183,7 +185,7 @@ public class PacketsManager { mods.write(5, ReflectionManager.getEnumArt(Art.values()[id])); // Make the teleport packet to make it visible.. - spawnPackets[1] = new PacketContainer(Packets.Server.ENTITY_TELEPORT); + spawnPackets[1] = new PacketContainer(PacketType.Play.Server.ENTITY_TELEPORT); mods = spawnPackets[1].getModifier(); mods.write(0, disguisedEntity.getEntityId()); mods.write(1, (int) Math.floor(loc.getX() * 32D)); @@ -194,7 +196,7 @@ public class PacketsManager { } else if (disguise.getType().isPlayer()) { - spawnPackets[0] = new PacketContainer(Packets.Server.NAMED_ENTITY_SPAWN); + spawnPackets[0] = new PacketContainer(PacketType.Play.Server.NAMED_ENTITY_SPAWN); StructureModifier stringMods = spawnPackets[0].getStrings(); if (stringMods.size() > 0) { for (int i = 0; i < stringMods.size(); i++) { @@ -225,7 +227,7 @@ public class PacketsManager { DisguiseValues values = DisguiseValues.getDisguiseValues(disguise.getType()); Vector vec = disguisedEntity.getVelocity(); - spawnPackets[0] = new PacketContainer(Packets.Server.MOB_SPAWN); + spawnPackets[0] = new PacketContainer(PacketType.Play.Server.SPAWN_ENTITY_LIVING); StructureModifier mods = spawnPackets[0].getModifier(); mods.write(0, disguisedEntity.getEntityId()); mods.write(1, (int) disguise.getType().getEntityType().getTypeId()); @@ -277,12 +279,13 @@ public class PacketsManager { data = -data; }*/ spawnPackets[0] = ProtocolLibrary.getProtocolManager() - .createPacketConstructor(Packets.Server.VEHICLE_SPAWN, nmsEntity, id, data).createPacket(nmsEntity, id, data); + .createPacketConstructor(PacketType.Play.Server.SPAWN_ENTITY, nmsEntity, id, data) + .createPacket(nmsEntity, id, data); spawnPackets[0].getModifier().write(2, (int) Math.floor(loc.getY() * 32D)); spawnPackets[0].getModifier().write(8, yaw); // Make the teleport packet to make it visible.. - spawnPackets[1] = new PacketContainer(Packets.Server.ENTITY_TELEPORT); + spawnPackets[1] = new PacketContainer(PacketType.Play.Server.ENTITY_TELEPORT); StructureModifier mods = spawnPackets[1].getModifier(); mods.write(0, disguisedEntity.getEntityId()); mods.write(1, (int) Math.floor(loc.getX() * 32D)); @@ -294,7 +297,7 @@ public class PacketsManager { } if (spawnPackets[1] == null) { // Make a packet to turn his head! - spawnPackets[1] = new PacketContainer(Packets.Server.ENTITY_HEAD_ROTATION); + spawnPackets[1] = new PacketContainer(PacketType.Play.Server.ENTITY_HEAD_ROTATION); StructureModifier mods = spawnPackets[1].getModifier(); mods.write(0, disguisedEntity.getEntityId()); mods.write(1, yaw); @@ -456,15 +459,15 @@ public class PacketsManager { */ public static void init(LibsDisguises plugin) { libsDisguises = plugin; - soundsListener = new PacketAdapter(libsDisguises, ConnectionSide.SERVER_SIDE, ListenerPriority.NORMAL, - Packets.Server.NAMED_SOUND_EFFECT, Packets.Server.ENTITY_STATUS) { + soundsListener = new PacketAdapter(libsDisguises, ListenerPriority.NORMAL, PacketType.Play.Server.NAMED_SOUND_EFFECT, + PacketType.Play.Server.ENTITY_STATUS) { @Override public void onPacketSending(PacketEvent event) { if (event.isCancelled()) return; StructureModifier mods = event.getPacket().getModifier(); Player observer = event.getPlayer(); - if (event.getPacketID() == Packets.Server.NAMED_SOUND_EFFECT) { + if (event.getPacketType() == PacketType.Play.Server.NAMED_SOUND_EFFECT) { String soundName = (String) mods.read(0); SoundType soundType = null; Location soundLoc = new Location(observer.getWorld(), ((Integer) mods.read(1)) / 8D, @@ -606,7 +609,7 @@ public class PacketsManager { } } } - } else if (event.getPacketID() == Packets.Server.ENTITY_STATUS) { + } else if (event.getPacketType() == PacketType.Play.Server.ENTITY_STATUS) { if ((Byte) mods.read(1) == 1) { // It made a damage animation Entity entity = event.getPacket().getEntityModifier(observer.getWorld()).read(0); @@ -644,7 +647,7 @@ public class PacketsManager { String sound = disSound.getSound(soundType); if (sound != null) { Location loc = entity.getLocation(); - PacketContainer packet = new PacketContainer(Packets.Server.NAMED_SOUND_EFFECT); + PacketContainer packet = new PacketContainer(PacketType.Play.Server.NAMED_SOUND_EFFECT); mods = packet.getModifier(); mods.write(0, sound); mods.write(1, (int) (loc.getX() * 8D)); @@ -677,12 +680,14 @@ public class PacketsManager { } } }; - viewDisguisesListener = new PacketAdapter(libsDisguises, ConnectionSide.SERVER_SIDE, ListenerPriority.HIGH, - Packets.Server.NAMED_ENTITY_SPAWN, Packets.Server.ATTACH_ENTITY, Packets.Server.REL_ENTITY_MOVE, - Packets.Server.REL_ENTITY_MOVE_LOOK, Packets.Server.ENTITY_LOOK, Packets.Server.ENTITY_TELEPORT, - Packets.Server.ENTITY_HEAD_ROTATION, Packets.Server.ENTITY_METADATA, Packets.Server.ENTITY_EQUIPMENT, - Packets.Server.ARM_ANIMATION, Packets.Server.ENTITY_LOCATION_ACTION, Packets.Server.MOB_EFFECT, - Packets.Server.ENTITY_VELOCITY, Packets.Server.UPDATE_ATTRIBUTES) { + viewDisguisesListener = new PacketAdapter(libsDisguises, ListenerPriority.HIGH, + PacketType.Play.Server.NAMED_ENTITY_SPAWN, PacketType.Play.Server.ATTACH_ENTITY, + PacketType.Play.Server.REL_ENTITY_MOVE, PacketType.Play.Server.ENTITY_MOVE_LOOK, + PacketType.Play.Server.ENTITY_LOOK, PacketType.Play.Server.ENTITY_TELEPORT, + PacketType.Play.Server.ENTITY_HEAD_ROTATION, PacketType.Play.Server.ENTITY_METADATA, + PacketType.Play.Server.ENTITY_EQUIPMENT, PacketType.Play.Server.ANIMATION, PacketType.Play.Server.BED, + PacketType.Play.Server.ENTITY_EFFECT, PacketType.Play.Server.ENTITY_VELOCITY, + PacketType.Play.Server.UPDATE_ATTRIBUTES) { @Override public void onPacketSending(PacketEvent event) { final Player observer = event.getPlayer(); @@ -721,8 +726,7 @@ public class PacketsManager { }); } - switch (event.getPacketID()) { - case Packets.Server.ENTITY_METADATA: + if (event.getPacketType() == PacketType.Play.Server.ENTITY_METADATA) { event.setPacket(event.getPacket().deepClone()); Iterator itel = event.getPacket().getWatchableCollectionModifier().read(0) .iterator(); @@ -736,9 +740,9 @@ public class PacketsManager { watch.setValue(a); } } - break; - case Packets.Server.NAMED_ENTITY_SPAWN: - PacketContainer packet = new PacketContainer(Packets.Server.ENTITY_METADATA); + } + if (event.getPacketType() == PacketType.Play.Server.NAMED_ENTITY_SPAWN) { + PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA); StructureModifier mods = packet.getModifier(); mods.write(0, observer.getEntityId()); List watchableList = new ArrayList(); @@ -748,34 +752,31 @@ public class PacketsManager { watchableList.add(new WrappedWatchableObject(0, b)); packet.getWatchableCollectionModifier().write(0, watchableList); event.setPacket(packet); - break; - case Packets.Server.ATTACH_ENTITY: - case Packets.Server.REL_ENTITY_MOVE: - case Packets.Server.REL_ENTITY_MOVE_LOOK: - case Packets.Server.ENTITY_LOOK: - case Packets.Server.ENTITY_TELEPORT: - case Packets.Server.ENTITY_HEAD_ROTATION: - case Packets.Server.MOB_EFFECT: - case Packets.Server.ENTITY_EQUIPMENT: + } + if (event.getPacketType() == PacketType.Play.Server.ATTACH_ENTITY + || event.getPacketType() == PacketType.Play.Server.REL_ENTITY_MOVE + || event.getPacketType() == PacketType.Play.Server.ENTITY_MOVE_LOOK + || event.getPacketType() == PacketType.Play.Server.ENTITY_LOOK + || event.getPacketType() == PacketType.Play.Server.ENTITY_TELEPORT + || event.getPacketType() == PacketType.Play.Server.ENTITY_HEAD_ROTATION + || event.getPacketType() == PacketType.Play.Server.ENTITY_EFFECT + || event.getPacketType() == PacketType.Play.Server.ENTITY_EQUIPMENT) { event.setCancelled(true); - break; + } - /* case Packets.Server.ENTITY_STATUS: + /* case PacketType.Play.Server.ENTITY_STATUS: if (DisguiseAPI.getDisguise(entity).canHearSelfDisguise() && (Byte) event.getPacket().getModifier().read(1) == 1) { event.setCancelled(true); } break;*/ - default: - break; - } } } } }; // TODO Potentionally combine both listeners. - inventoryListenerServer = new PacketAdapter(libsDisguises, ConnectionSide.SERVER_SIDE, ListenerPriority.HIGHEST, - Packets.Server.SET_SLOT, Packets.Server.WINDOW_ITEMS) { + inventoryListenerServer = new PacketAdapter(libsDisguises, ListenerPriority.HIGHEST, PacketType.Play.Server.SET_SLOT, + PacketType.Play.Server.WINDOW_ITEMS) { @Override public void onPacketSending(PacketEvent event) { // If the inventory is the players inventory @@ -785,14 +786,13 @@ public class PacketsManager { // If the player is disguised, views self disguises and is hiding a item. if (disguise != null && disguise.isSelfDisguiseVisible() && (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf())) { - switch (event.getPacketID()) { // If the server is setting the slot // Need to set it to air if its in a place it shouldn't be. // Things such as picking up a item, spawned in item. Plugin sets the item. etc. Will fire this /** * Done */ - case Packets.Server.SET_SLOT: { + if (event.getPacketType() == PacketType.Play.Server.SET_SLOT) { // The raw slot // nms code has the start of the hotbar being 36. int slot = event.getPacket().getIntegers().read(1); @@ -824,12 +824,8 @@ public class PacketsManager { } } } - break; } - /** - * Done - */ - case Packets.Server.WINDOW_ITEMS: { + if (event.getPacketType() == PacketType.Play.Server.WINDOW_ITEMS) { event.setPacket(event.getPacket().deepClone()); StructureModifier mods = event.getPacket().getItemArrayModifier(); ItemStack[] items = mods.read(0); @@ -858,17 +854,14 @@ public class PacketsManager { } } mods.write(0, items); - break; - } - default: - break; } } } } }; - inventoryListenerClient = new PacketAdapter(libsDisguises, ConnectionSide.CLIENT_SIDE, ListenerPriority.HIGHEST, - Packets.Client.BLOCK_ITEM_SWITCH, Packets.Client.SET_CREATIVE_SLOT, Packets.Client.WINDOW_CLICK) { + inventoryListenerClient = new PacketAdapter(libsDisguises, ListenerPriority.HIGHEST, + PacketType.Play.Client.HELD_ITEM_SLOT, PacketType.Play.Client.SET_CREATIVE_SLOT, + PacketType.Play.Client.WINDOW_CLICK) { @Override public void onPacketReceiving(final PacketEvent event) { if (event.getPlayer().getVehicle() == null) { @@ -876,16 +869,15 @@ public class PacketsManager { // If player is disguised, views self disguises and has a inventory modifier if (disguise != null && disguise.isSelfDisguiseVisible() && (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf())) { - switch (event.getPacketID()) { // If they are in creative and clicked on a slot - case Packets.Client.SET_CREATIVE_SLOT: { + if (event.getPacketType() == PacketType.Play.Client.SET_CREATIVE_SLOT) { int slot = event.getPacket().getIntegers().read(0); if (slot >= 5 && slot <= 8) { if (disguise.isHidingArmorFromSelf()) { int armorSlot = Math.abs((slot - 5) - 3); org.bukkit.inventory.ItemStack item = event.getPlayer().getInventory().getArmorContents()[armorSlot]; if (item != null && item.getType() != Material.AIR) { - PacketContainer packet = new PacketContainer(Packets.Server.SET_SLOT); + PacketContainer packet = new PacketContainer(PacketType.Play.Server.SET_SLOT); StructureModifier mods = packet.getModifier(); mods.write(0, 0); mods.write(1, slot); @@ -904,7 +896,7 @@ public class PacketsManager { if (slot + 36 == currentSlot) { org.bukkit.inventory.ItemStack item = event.getPlayer().getItemInHand(); if (item != null && item.getType() != Material.AIR) { - PacketContainer packet = new PacketContainer(Packets.Server.SET_SLOT); + PacketContainer packet = new PacketContainer(PacketType.Play.Server.SET_SLOT); StructureModifier mods = packet.getModifier(); mods.write(0, 0); mods.write(1, slot); @@ -919,10 +911,9 @@ public class PacketsManager { } } } - break; } // If the player switched item, aka he moved from slot 1 to slot 2 - case Packets.Client.BLOCK_ITEM_SWITCH: { + else if (event.getPacketType() == PacketType.Play.Client.HELD_ITEM_SLOT) { if (disguise.isHidingHeldItemFromSelf()) { // From logging, it seems that both bukkit and nms uses the same thing for the slot switching. // 0 1 2 3 - 8 @@ -931,7 +922,7 @@ public class PacketsManager { org.bukkit.inventory.ItemStack currentlyHeld = event.getPlayer().getItemInHand(); // If his old weapon isn't air if (currentlyHeld != null && currentlyHeld.getType() != Material.AIR) { - PacketContainer packet = new PacketContainer(Packets.Server.SET_SLOT); + PacketContainer packet = new PacketContainer(PacketType.Play.Server.SET_SLOT); StructureModifier mods = packet.getModifier(); mods.write(0, 0); mods.write(1, event.getPlayer().getInventory().getHeldItemSlot() + 36); @@ -946,7 +937,7 @@ public class PacketsManager { .getItem(event.getPacket().getIntegers().read(0)); // If his new weapon isn't air either! if (newHeld != null && newHeld.getType() != Material.AIR) { - PacketContainer packet = new PacketContainer(Packets.Server.SET_SLOT); + PacketContainer packet = new PacketContainer(PacketType.Play.Server.SET_SLOT); StructureModifier mods = packet.getModifier(); mods.write(0, 0); mods.write(1, event.getPacket().getIntegers().read(0) + 36); @@ -958,10 +949,9 @@ public class PacketsManager { } } } - break; } - case Packets.Client.WINDOW_CLICK: { + else if (event.getPacketType() == PacketType.Play.Client.WINDOW_CLICK) { int slot = event.getPacket().getIntegers().read(1); org.bukkit.inventory.ItemStack clickedItem; if (event.getPacket().getIntegers().read(3) == 1) { @@ -989,7 +979,7 @@ public class PacketsManager { // If the slot is a armor slot if (slot >= 5 && slot <= 8) { if (disguise.isHidingArmorFromSelf()) { - PacketContainer packet = new PacketContainer(Packets.Server.SET_SLOT); + PacketContainer packet = new PacketContainer(PacketType.Play.Server.SET_SLOT); StructureModifier mods = packet.getModifier(); mods.write(0, 0); mods.write(1, slot); @@ -1007,7 +997,7 @@ public class PacketsManager { int currentSlot = event.getPlayer().getInventory().getHeldItemSlot(); // Check if the player is on the same slot as the slot that its setting if (slot == currentSlot + 36) { - PacketContainer packet = new PacketContainer(Packets.Server.SET_SLOT); + PacketContainer packet = new PacketContainer(PacketType.Play.Server.SET_SLOT); StructureModifier mods = packet.getModifier(); mods.write(0, 0); mods.write(1, slot); @@ -1022,11 +1012,6 @@ public class PacketsManager { } } } - break; - } - - default: - break; } } } @@ -1113,75 +1098,67 @@ public class PacketsManager { try { // First get the entity, the one sending this packet StructureModifier entityModifer = sentPacket.getEntityModifier(observer.getWorld()); - org.bukkit.entity.Entity entity = entityModifer.read((Packets.Server.COLLECT == sentPacket.getID() ? 1 : 0)); + org.bukkit.entity.Entity entity = entityModifer + .read((PacketType.Play.Server.COLLECT == sentPacket.getType() ? 1 : 0)); Disguise disguise = DisguiseAPI.getDisguise(observer, entity); // If disguised. if (disguise != null) { - // If packet is Packets.Server.UPDATE_ATTRIBUTES + // If packet is PacketType.Play.Server.UPDATE_ATTRIBUTES // This packet sends attributes - switch (sentPacket.getID()) { - - case Packets.Server.UPDATE_ATTRIBUTES: + if (sentPacket.getType() == PacketType.Play.Server.UPDATE_ATTRIBUTES) { packets = new PacketContainer[0]; - break; } // Else if the packet is sending entity metadata - case Packets.Server.ENTITY_METADATA: + if (sentPacket.getType() == PacketType.Play.Server.ENTITY_METADATA) { List watchableObjects = disguise.getWatcher().convert( packets[0].getWatchableCollectionModifier().read(0)); - packets[0] = new PacketContainer(sentPacket.getID()); + packets[0] = new PacketContainer(sentPacket.getType()); StructureModifier newMods = packets[0].getModifier(); newMods.write(0, entity.getEntityId()); packets[0].getWatchableCollectionModifier().write(0, watchableObjects); - break; } // Else if the packet is spawning.. - case Packets.Server.NAMED_ENTITY_SPAWN: - case Packets.Server.MOB_SPAWN: - case Packets.Server.ADD_EXP_ORB: - case Packets.Server.VEHICLE_SPAWN: - case Packets.Server.ENTITY_PAINTING: - - { + if (sentPacket.getType() == PacketType.Play.Server.NAMED_ENTITY_SPAWN + || sentPacket.getType() == PacketType.Play.Server.SPAWN_ENTITY_LIVING + || sentPacket.getType() == PacketType.Play.Server.SPAWN_ENTITY_EXPERIENCE_ORB + || sentPacket.getType() == PacketType.Play.Server.SPAWN_ENTITY + || sentPacket.getType() == PacketType.Play.Server.SPAWN_ENTITY_PAINTING) packets = constructSpawnPackets(disguise, entity); - break; - } // Else if the disguise is attempting to send players a forbidden packet - case Packets.Server.ARM_ANIMATION: + if (sentPacket.getType() == PacketType.Play.Server.ANIMATION) { if (disguise.getType().isMisc() || (packets[0].getIntegers().read(1) == 3 && !disguise.getType().isPlayer())) { packets = new PacketContainer[0]; } - break; } - case Packets.Server.COLLECT: + if (sentPacket.getType() == PacketType.Play.Server.COLLECT) { if (disguise.getType().isMisc()) { packets = new PacketContainer[0]; } - break; } // Else if the disguise is moving. - case Packets.Server.REL_ENTITY_MOVE_LOOK: - case Packets.Server.ENTITY_LOOK: - case Packets.Server.ENTITY_TELEPORT: + if (sentPacket.getType() == PacketType.Play.Server.ENTITY_MOVE_LOOK + || sentPacket.getType() == PacketType.Play.Server.ENTITY_LOOK + || sentPacket.getType() == PacketType.Play.Server.ENTITY_TELEPORT) { - if (sentPacket.getID() == Packets.Server.ENTITY_LOOK && disguise.getType() == DisguiseType.WITHER_SKULL) { + if (sentPacket.getType() == PacketType.Play.Server.ENTITY_LOOK + && disguise.getType() == DisguiseType.WITHER_SKULL) { packets = new PacketContainer[0]; } else { packets[0] = sentPacket.shallowClone(); @@ -1190,7 +1167,7 @@ public class PacketsManager { mods.write(4, getYaw(disguise.getType(), entity.getType(), yawValue)); byte pitchValue = (Byte) mods.read(5); mods.write(5, getPitch(disguise.getType(), DisguiseType.getType(entity.getType()), pitchValue)); - if (sentPacket.getID() == Packets.Server.ENTITY_TELEPORT) { + if (sentPacket.getType() == PacketType.Play.Server.ENTITY_TELEPORT) { double y = getYModifier(entity, disguise.getType()); if (y != 0) { y *= 32; @@ -1198,10 +1175,9 @@ public class PacketsManager { } } } - break; } - case Packets.Server.ENTITY_EQUIPMENT: + if (sentPacket.getType() == PacketType.Play.Server.ENTITY_EQUIPMENT) { int slot = (Integer) packets[0].getModifier().read(1) - 1; @@ -1213,29 +1189,23 @@ public class PacketsManager { packets[0].getModifier().write(2, (itemstack.getTypeId() == 0 ? null : ReflectionManager.getNmsItem(itemstack))); } - break; } - case Packets.Server.ENTITY_LOCATION_ACTION: + if (sentPacket.getType() == PacketType.Play.Server.BED) { if (!disguise.getType().isPlayer()) { packets = new PacketContainer[0]; } - break; } - case Packets.Server.ENTITY_STATUS: + if (sentPacket.getType() == PacketType.Play.Server.ENTITY_STATUS) { if (packets[0].getBytes().read(0) == (byte) 3) { packets = new PacketContainer[0]; } } - - default: - break; - } } } catch (Exception e) { e.printStackTrace(); From 90e396092330c68d249b3031e9185524fa439187 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Sun, 8 Dec 2013 03:33:56 +1300 Subject: [PATCH 26/33] Clean up the code --- .../disguise/disguisetypes/Disguise.java | 1 - .../disguise/disguisetypes/FlagWatcher.java | 1 - .../disguise/utilities/DisguiseUtilities.java | 1 - .../disguise/utilities/PacketsManager.java | 60 ++++++------------- 4 files changed, 18 insertions(+), 45 deletions(-) diff --git a/src/me/libraryaddict/disguise/disguisetypes/Disguise.java b/src/me/libraryaddict/disguise/disguisetypes/Disguise.java index f142e8bd..f7a5c21d 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/Disguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/Disguise.java @@ -23,7 +23,6 @@ import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.util.Vector; import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.Packets; import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.reflect.StructureModifier; diff --git a/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java index 777f334f..ff3c9291 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java @@ -13,7 +13,6 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.EntityEquipment; import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.Packets; import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.reflect.StructureModifier; diff --git a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index e5d862f8..cb1fb466 100644 --- a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -24,7 +24,6 @@ import org.bukkit.potion.PotionEffect; import org.bukkit.util.Vector; import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.Packets; import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.ProtocolManager; import com.comphenix.protocol.events.PacketContainer; diff --git a/src/me/libraryaddict/disguise/utilities/PacketsManager.java b/src/me/libraryaddict/disguise/utilities/PacketsManager.java index 291e6054..663c5c48 100644 --- a/src/me/libraryaddict/disguise/utilities/PacketsManager.java +++ b/src/me/libraryaddict/disguise/utilities/PacketsManager.java @@ -36,7 +36,6 @@ import org.bukkit.util.Vector; import com.comphenix.protocol.PacketType; import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.ProtocolManager; -import com.comphenix.protocol.events.ConnectionSide; import com.comphenix.protocol.events.ListenerPriority; import com.comphenix.protocol.events.PacketAdapter; import com.comphenix.protocol.events.PacketContainer; @@ -740,8 +739,7 @@ public class PacketsManager { watch.setValue(a); } } - } - if (event.getPacketType() == PacketType.Play.Server.NAMED_ENTITY_SPAWN) { + } else if (event.getPacketType() == PacketType.Play.Server.NAMED_ENTITY_SPAWN) { PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA); StructureModifier mods = packet.getModifier(); mods.write(0, observer.getEntityId()); @@ -752,8 +750,7 @@ public class PacketsManager { watchableList.add(new WrappedWatchableObject(0, b)); packet.getWatchableCollectionModifier().write(0, watchableList); event.setPacket(packet); - } - if (event.getPacketType() == PacketType.Play.Server.ATTACH_ENTITY + } else if (event.getPacketType() == PacketType.Play.Server.ATTACH_ENTITY || event.getPacketType() == PacketType.Play.Server.REL_ENTITY_MOVE || event.getPacketType() == PacketType.Play.Server.ENTITY_MOVE_LOOK || event.getPacketType() == PacketType.Play.Server.ENTITY_LOOK @@ -824,8 +821,7 @@ public class PacketsManager { } } } - } - if (event.getPacketType() == PacketType.Play.Server.WINDOW_ITEMS) { + } else if (event.getPacketType() == PacketType.Play.Server.WINDOW_ITEMS) { event.setPacket(event.getPacket().deepClone()); StructureModifier mods = event.getPacket().getItemArrayModifier(); ItemStack[] items = mods.read(0); @@ -949,9 +945,7 @@ public class PacketsManager { } } } - } - - else if (event.getPacketType() == PacketType.Play.Client.WINDOW_CLICK) { + } else if (event.getPacketType() == PacketType.Play.Client.WINDOW_CLICK) { int slot = event.getPacket().getIntegers().read(1); org.bukkit.inventory.ItemStack clickedItem; if (event.getPacket().getIntegers().read(3) == 1) { @@ -1105,18 +1099,12 @@ public class PacketsManager { if (disguise != null) { // If packet is PacketType.Play.Server.UPDATE_ATTRIBUTES // This packet sends attributes - - if (sentPacket.getType() == PacketType.Play.Server.UPDATE_ATTRIBUTES) - - { - + if (sentPacket.getType() == PacketType.Play.Server.UPDATE_ATTRIBUTES) { packets = new PacketContainer[0]; } // Else if the packet is sending entity metadata - if (sentPacket.getType() == PacketType.Play.Server.ENTITY_METADATA) - - { + else if (sentPacket.getType() == PacketType.Play.Server.ENTITY_METADATA) { List watchableObjects = disguise.getWatcher().convert( packets[0].getWatchableCollectionModifier().read(0)); packets[0] = new PacketContainer(sentPacket.getType()); @@ -1126,37 +1114,31 @@ public class PacketsManager { } // Else if the packet is spawning.. - if (sentPacket.getType() == PacketType.Play.Server.NAMED_ENTITY_SPAWN + else if (sentPacket.getType() == PacketType.Play.Server.NAMED_ENTITY_SPAWN || sentPacket.getType() == PacketType.Play.Server.SPAWN_ENTITY_LIVING || sentPacket.getType() == PacketType.Play.Server.SPAWN_ENTITY_EXPERIENCE_ORB || sentPacket.getType() == PacketType.Play.Server.SPAWN_ENTITY - || sentPacket.getType() == PacketType.Play.Server.SPAWN_ENTITY_PAINTING) + || sentPacket.getType() == PacketType.Play.Server.SPAWN_ENTITY_PAINTING) { packets = constructSpawnPackets(disguise, entity); + } // Else if the disguise is attempting to send players a forbidden packet - if (sentPacket.getType() == PacketType.Play.Server.ANIMATION) - - { + else if (sentPacket.getType() == PacketType.Play.Server.ANIMATION) { if (disguise.getType().isMisc() || (packets[0].getIntegers().read(1) == 3 && !disguise.getType().isPlayer())) { packets = new PacketContainer[0]; } - } - if (sentPacket.getType() == PacketType.Play.Server.COLLECT) - - { + else if (sentPacket.getType() == PacketType.Play.Server.COLLECT) { if (disguise.getType().isMisc()) { packets = new PacketContainer[0]; } - } - // Else if the disguise is moving. - if (sentPacket.getType() == PacketType.Play.Server.ENTITY_MOVE_LOOK - || sentPacket.getType() == PacketType.Play.Server.ENTITY_LOOK - || sentPacket.getType() == PacketType.Play.Server.ENTITY_TELEPORT) - { + // Else if the disguise is moving. + else if (sentPacket.getType() == PacketType.Play.Server.ENTITY_MOVE_LOOK + || sentPacket.getType() == PacketType.Play.Server.ENTITY_LOOK + || sentPacket.getType() == PacketType.Play.Server.ENTITY_TELEPORT) { if (sentPacket.getType() == PacketType.Play.Server.ENTITY_LOOK && disguise.getType() == DisguiseType.WITHER_SKULL) { packets = new PacketContainer[0]; @@ -1177,9 +1159,7 @@ public class PacketsManager { } } - if (sentPacket.getType() == PacketType.Play.Server.ENTITY_EQUIPMENT) - - { + else if (sentPacket.getType() == PacketType.Play.Server.ENTITY_EQUIPMENT) { int slot = (Integer) packets[0].getModifier().read(1) - 1; if (slot < 0) slot = 4; @@ -1191,17 +1171,13 @@ public class PacketsManager { } } - if (sentPacket.getType() == PacketType.Play.Server.BED) - - { + else if (sentPacket.getType() == PacketType.Play.Server.BED) { if (!disguise.getType().isPlayer()) { packets = new PacketContainer[0]; } } - if (sentPacket.getType() == PacketType.Play.Server.ENTITY_STATUS) - - { + else if (sentPacket.getType() == PacketType.Play.Server.ENTITY_STATUS) { if (packets[0].getBytes().read(0) == (byte) 3) { packets = new PacketContainer[0]; } From 1434bdc49e5183ad00e42daf28545c27eb54cde6 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Sun, 8 Dec 2013 03:34:42 +1300 Subject: [PATCH 27/33] Give the compenix repo a unique name --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b2bf9055..c485527f 100644 --- a/pom.xml +++ b/pom.xml @@ -42,7 +42,7 @@ http://repo.comphenix.net/content/groups/public - comphenix-rep + comphenix-snapshot-rep Comphenix Snapshot Repository http://repo.comphenix.net/content/repositories/snapshots/ From cdc02b4090935e4a808d38dfe65f5f3eeda71579 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Sun, 8 Dec 2013 07:51:37 +1300 Subject: [PATCH 28/33] Cleaned up code. Fixed error for sounds handling --- .../disguise/disguisetypes/FlagWatcher.java | 8 ++++---- .../disguise/utilities/DisguiseUtilities.java | 19 ++++++++++--------- .../disguise/utilities/PacketsManager.java | 5 ++++- .../disguise/utilities/ReflectionManager.java | 12 ++++++------ 4 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java index ff3c9291..dc79010f 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java @@ -282,15 +282,15 @@ public class FlagWatcher { setItemInHand(itemstack); } - public void setItemInHand(org.bukkit.inventory.ItemStack itemstack) { - setItemStack(SlotType.HELD_ITEM, itemstack); - } - public void setInvisible(boolean setInvis) { setFlag(0, 5, setInvis); sendData(0); } + public void setItemInHand(org.bukkit.inventory.ItemStack itemstack) { + setItemStack(SlotType.HELD_ITEM, itemstack); + } + public void setItemStack(int slot, org.bukkit.inventory.ItemStack itemStack) { // Itemstack which is null means that its not replacing the disguises itemstack. if (itemStack == null) { diff --git a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index cb1fb466..41876296 100644 --- a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -226,6 +226,7 @@ public class DisguiseUtilities { if (player.equals(((Player) ReflectionManager.getBukkitEntity(p)).getName())) { clear.invoke(entityTrackerEntry, p); updatePlayer.invoke(entityTrackerEntry, p); + break; } } } @@ -373,9 +374,9 @@ public class DisguiseUtilities { Vector velocity = player.getVelocity(); manager.sendServerPacket( 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())); + manager.createPacketConstructor(PacketType.Play.Server.ENTITY_VELOCITY, player.getEntityId(), + velocity.getX(), velocity.getY(), velocity.getZ()).createPacket(player.getEntityId(), + velocity.getX(), velocity.getY(), velocity.getZ())); } // Why the hell would he even need this. Meh. @@ -399,9 +400,10 @@ public class DisguiseUtilities { } if (item != null && item.getType() != Material.AIR) { - manager.sendServerPacket(player, - manager.createPacketConstructor(PacketType.Play.Server.ENTITY_EQUIPMENT, player.getEntityId(), i, item) - .createPacket(player.getEntityId(), i, item)); + manager.sendServerPacket( + player, + manager.createPacketConstructor(PacketType.Play.Server.ENTITY_EQUIPMENT, player.getEntityId(), i, + item).createPacket(player.getEntityId(), i, item)); } } Location loc = player.getLocation(); @@ -409,9 +411,8 @@ public class DisguiseUtilities { if (player.isSleeping()) { manager.sendServerPacket( player, - manager.createPacketConstructor(PacketType.Play.Server.BED, player, 0, loc.getBlockX(), - loc.getBlockY(), loc.getBlockZ()).createPacket(player, 0, loc.getBlockX(), loc.getBlockY(), - loc.getBlockZ())); + manager.createPacketConstructor(PacketType.Play.Server.BED, player, 0, loc.getBlockX(), loc.getBlockY(), + loc.getBlockZ()).createPacket(player, 0, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ())); } // Resend any active potion effects diff --git a/src/me/libraryaddict/disguise/utilities/PacketsManager.java b/src/me/libraryaddict/disguise/utilities/PacketsManager.java index 663c5c48..224dea7d 100644 --- a/src/me/libraryaddict/disguise/utilities/PacketsManager.java +++ b/src/me/libraryaddict/disguise/utilities/PacketsManager.java @@ -2,6 +2,7 @@ package me.libraryaddict.disguise.utilities; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Random; @@ -539,7 +540,9 @@ public class PacketsManager { Class blockClass = ReflectionManager.getNmsClass("Block"); Object block; if (ReflectionManager.isAfter17()) { - block = blockClass.getMethod("REGISTRY", int.class).invoke(null, typeId); + block = ReflectionManager.getNmsClass("RegistryMaterials") + .getMethod("a", int.class) + .invoke(blockClass.getField("REGISTRY").get(null), typeId); } else { block = ((Object[]) blockClass.getField("byId").get(null))[typeId]; } diff --git a/src/me/libraryaddict/disguise/utilities/ReflectionManager.java b/src/me/libraryaddict/disguise/utilities/ReflectionManager.java index 9ec53b64..29373cfa 100644 --- a/src/me/libraryaddict/disguise/utilities/ReflectionManager.java +++ b/src/me/libraryaddict/disguise/utilities/ReflectionManager.java @@ -12,10 +12,10 @@ import org.bukkit.entity.Entity; import org.bukkit.inventory.ItemStack; public class ReflectionManager { + private static boolean after17 = true; private static String bukkitVersion = Bukkit.getServer().getClass().getName().split("\\.")[3]; private static Class itemClass; private static Method soundMethod; - private static boolean after17 = true; static { for (Method method : getNmsClass("EntityLiving").getDeclaredMethods()) { try { @@ -53,11 +53,7 @@ public class ReflectionManager { } } - }public static boolean isAfter17() { - return after17; - } - - public static Object createEntityInstance(String entityName) { + }public static Object createEntityInstance(String entityName) { try { Class entityClass = getNmsClass("Entity" + entityName); Object entityObject; @@ -194,4 +190,8 @@ public class ReflectionManager { return null; } + public static boolean isAfter17() { + return after17; + } + } From 95e28757b7f9d1b9ff355f0c65f8533e41606fc4 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Sun, 8 Dec 2013 10:49:41 +1300 Subject: [PATCH 29/33] Fixed the version checking being wrong. --- .../disguise/utilities/ReflectionManager.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/me/libraryaddict/disguise/utilities/ReflectionManager.java b/src/me/libraryaddict/disguise/utilities/ReflectionManager.java index 29373cfa..c3a6a0f9 100644 --- a/src/me/libraryaddict/disguise/utilities/ReflectionManager.java +++ b/src/me/libraryaddict/disguise/utilities/ReflectionManager.java @@ -44,16 +44,18 @@ public class ReflectionManager { } catch (Exception e) { e.printStackTrace(); } - if (bukkitVersion.startsWith("1.")) { + if (bukkitVersion.startsWith("v1_")) { try { - if (Integer.parseInt(bukkitVersion.split("\\.")[1]) < 7) { + if (Integer.parseInt(bukkitVersion.split("_")[1]) < 7) { after17 = false; } } catch (Exception ex) { } } - }public static Object createEntityInstance(String entityName) { + } + + public static Object createEntityInstance(String entityName) { try { Class entityClass = getNmsClass("Entity" + entityName); Object entityObject; @@ -62,15 +64,15 @@ public class ReflectionManager { Object minecraftServer = getNmsClass("MinecraftServer").getMethod("getServer").invoke(null); Object playerinteractmanager = getNmsClass("PlayerInteractManager").getConstructor(getNmsClass("World")) .newInstance(world); - if (!isAfter17()) { - entityObject = entityClass.getConstructor(getNmsClass("MinecraftServer"), getNmsClass("World"), String.class, - playerinteractmanager.getClass()).newInstance(minecraftServer, world, "LibsDisguises", - playerinteractmanager); - } else { + if (isAfter17()) { Object gameProfile = getGameProfile("LibsDisguises"); entityObject = entityClass.getConstructor(getNmsClass("MinecraftServer"), getNmsClass("WorldServer"), gameProfile.getClass(), playerinteractmanager.getClass()).newInstance(minecraftServer, world, gameProfile, playerinteractmanager); + } else { + entityObject = entityClass.getConstructor(getNmsClass("MinecraftServer"), getNmsClass("World"), String.class, + playerinteractmanager.getClass()).newInstance(minecraftServer, world, "LibsDisguises", + playerinteractmanager); } } else { entityObject = entityClass.getConstructor(getNmsClass("World")).newInstance(world); From a178fbace71c9de3738495919976564c605cd855 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Sun, 8 Dec 2013 15:32:57 +1300 Subject: [PATCH 30/33] Fix 1.7 self disguises sounds not playing properly --- .../disguise/utilities/PacketsManager.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/me/libraryaddict/disguise/utilities/PacketsManager.java b/src/me/libraryaddict/disguise/utilities/PacketsManager.java index 224dea7d..72e6b0f5 100644 --- a/src/me/libraryaddict/disguise/utilities/PacketsManager.java +++ b/src/me/libraryaddict/disguise/utilities/PacketsManager.java @@ -612,7 +612,7 @@ public class PacketsManager { } } } else if (event.getPacketType() == PacketType.Play.Server.ENTITY_STATUS) { - if ((Byte) mods.read(1) == 1) { + if ((Byte) mods.read(1) == 2) { // It made a damage animation Entity entity = event.getPacket().getEntityModifier(observer.getWorld()).read(0); Disguise disguise = DisguiseAPI.getDisguise(observer, entity); @@ -689,7 +689,7 @@ public class PacketsManager { PacketType.Play.Server.ENTITY_HEAD_ROTATION, PacketType.Play.Server.ENTITY_METADATA, PacketType.Play.Server.ENTITY_EQUIPMENT, PacketType.Play.Server.ANIMATION, PacketType.Play.Server.BED, PacketType.Play.Server.ENTITY_EFFECT, PacketType.Play.Server.ENTITY_VELOCITY, - PacketType.Play.Server.UPDATE_ATTRIBUTES) { + PacketType.Play.Server.UPDATE_ATTRIBUTES, PacketType.Play.Server.ENTITY_STATUS) { @Override public void onPacketSending(PacketEvent event) { final Player observer = event.getPlayer(); @@ -764,12 +764,12 @@ public class PacketsManager { event.setCancelled(true); } - /* case PacketType.Play.Server.ENTITY_STATUS: - if (DisguiseAPI.getDisguise(entity).canHearSelfDisguise() - && (Byte) event.getPacket().getModifier().read(1) == 1) { - event.setCancelled(true); - } - break;*/ + else if (event.getPacketType() == PacketType.Play.Server.ENTITY_STATUS) { + if (DisguiseAPI.getDisguise(event.getPlayer(), event.getPlayer()).isSelfDisguiseSoundsReplaced() + && (Byte) event.getPacket().getModifier().read(1) == 2) { + event.setCancelled(true); + } + } } } } From 585f8ad1166dd321979f0e055cc282d4bde6395e Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Sun, 8 Dec 2013 15:36:11 +1300 Subject: [PATCH 31/33] Add compatibility for older versions of MC for sounds --- src/me/libraryaddict/disguise/utilities/PacketsManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/me/libraryaddict/disguise/utilities/PacketsManager.java b/src/me/libraryaddict/disguise/utilities/PacketsManager.java index 72e6b0f5..98835e47 100644 --- a/src/me/libraryaddict/disguise/utilities/PacketsManager.java +++ b/src/me/libraryaddict/disguise/utilities/PacketsManager.java @@ -612,7 +612,7 @@ public class PacketsManager { } } } else if (event.getPacketType() == PacketType.Play.Server.ENTITY_STATUS) { - if ((Byte) mods.read(1) == 2) { + if ((Byte) mods.read(1) == (ReflectionManager.isAfter17() ? 2 : 1)) { // It made a damage animation Entity entity = event.getPacket().getEntityModifier(observer.getWorld()).read(0); Disguise disguise = DisguiseAPI.getDisguise(observer, entity); @@ -766,7 +766,7 @@ public class PacketsManager { else if (event.getPacketType() == PacketType.Play.Server.ENTITY_STATUS) { if (DisguiseAPI.getDisguise(event.getPlayer(), event.getPlayer()).isSelfDisguiseSoundsReplaced() - && (Byte) event.getPacket().getModifier().read(1) == 2) { + && (Byte) event.getPacket().getModifier().read(1) == (ReflectionManager.isAfter17() ? 2 : 1)) { event.setCancelled(true); } } From 8dd604153e9bdd37a37e1fa9916c3966323d63a6 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Sun, 8 Dec 2013 17:34:30 +1300 Subject: [PATCH 32/33] Deprecated isFused and setFused as they are the same as isIgnited and setIgnited --- .../disguise/disguisetypes/watchers/CreeperWatcher.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/me/libraryaddict/disguise/disguisetypes/watchers/CreeperWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/CreeperWatcher.java index feb112e0..71ad3c85 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/watchers/CreeperWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/CreeperWatcher.java @@ -8,6 +8,7 @@ public class CreeperWatcher extends LivingWatcher { super(disguise); } + @Deprecated public boolean isFused() { return (Byte) getValue(16, (byte) 0) == 1; } @@ -26,6 +27,7 @@ public class CreeperWatcher extends LivingWatcher { sendData(16); } + @Deprecated public void setFused(boolean isFused) { setValue(16, (byte) (isFused ? 1 : -1)); sendData(16); From 319c987f9432c4e878a7c26568c76693abd93af3 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Mon, 9 Dec 2013 04:44:02 +1300 Subject: [PATCH 33/33] Added 2 config options to show names above disguised players head --- config.yml | 11 +++++++++- .../libraryaddict/disguise/DisguiseAPI.java | 22 ++++++++++++++----- .../disguise/DisguiseListener.java | 10 +++++++++ .../libraryaddict/disguise/LibsDisguises.java | 6 ++--- .../disguise/commands/DisguiseCommand.java | 9 ++++++++ .../commands/DisguisePlayerCommand.java | 9 ++++++++ .../commands/DisguiseRadiusCommand.java | 10 +++++++++ .../disguise/utilities/PacketsManager.java | 1 - 8 files changed, 66 insertions(+), 12 deletions(-) diff --git a/config.yml b/config.yml index 32293f0d..9427d2e4 100644 --- a/config.yml +++ b/config.yml @@ -31,4 +31,13 @@ AddEntityAnimations: true # If all players who can see a targeted disguise (Only advalible to plugins) have quit. # Does the plugin remove that disguise from valid disguises? If your plugin handles this. Then thats good. # Else its a memory leak. This loops through all disguise to see if anyone else is online who can see that disguise. -RemoveUnusedDisguises: true \ No newline at end of file +RemoveUnusedDisguises: true +# This is only called into action when the disguise is constructed using the commands. +# And when the disguise supports that. This will not be used at all for plugins constructing the disguises for instance. +# Such as prophunt. Its also false because its kind of a retarded feature. +# This is pretty simple. It shows the players displayname (Name as it appears in chat) above their head. +# This also overrides any custom name they have set in their disguise options. +ShowNamesAboveDisguises: false +# This supports the above option. +# If this is true, then the name shown above the head appears regardless of if you are looking at the disguise directly or not. +NameAboveHeadAlwaysVisible: true \ No newline at end of file diff --git a/src/me/libraryaddict/disguise/DisguiseAPI.java b/src/me/libraryaddict/disguise/DisguiseAPI.java index 34637388..ba9a2b3e 100644 --- a/src/me/libraryaddict/disguise/DisguiseAPI.java +++ b/src/me/libraryaddict/disguise/DisguiseAPI.java @@ -24,6 +24,8 @@ public class DisguiseAPI { private static boolean isEntityAnimationsAdded; private static boolean removeUnseenDisguises; private static boolean sendVelocity; + private static boolean showNameAboveHead; + private static boolean showNameAboveHeadAlwaysVisible; @Deprecated public static boolean canHearSelfDisguise() { @@ -189,8 +191,12 @@ public class DisguiseAPI { return hidingHeldItem; } - public static boolean isInventoryListenerEnabled() { - return PacketsManager.isInventoryListenerEnabled(); + public static boolean isNameAboveHeadAlwaysVisible() { + return showNameAboveHeadAlwaysVisible; + } + + public static boolean isNameOfPlayerShownAboveDisguise() { + return showNameAboveHead; } public static boolean isSelfDisguisesSoundsReplaced() { @@ -241,6 +247,7 @@ public class DisguiseAPI { public static void setHideArmorFromSelf(boolean hideArmor) { if (hidingArmor != hideArmor) { hidingArmor = hideArmor; + PacketsManager.setInventoryListenerEnabled(isHidingHeldItemFromSelf() || isHidingArmorFromSelf()); } } @@ -250,13 +257,16 @@ public class DisguiseAPI { public static void setHideHeldItemFromSelf(boolean hideHelditem) { if (hidingHeldItem != hideHelditem) { hidingHeldItem = hideHelditem; + PacketsManager.setInventoryListenerEnabled(isHidingHeldItemFromSelf() || isHidingArmorFromSelf()); } } - public static void setInventoryListenerEnabled(boolean inventoryListenerEnabled) { - if (PacketsManager.isInventoryListenerEnabled() != inventoryListenerEnabled) { - PacketsManager.setInventoryListenerEnabled(inventoryListenerEnabled); - } + public static void setNameAboveHeadAlwaysVisible(boolean alwaysVisible) { + showNameAboveHeadAlwaysVisible = alwaysVisible; + } + + public static void setNameOfPlayerShownAboveDisguise(boolean showNames) { + showNameAboveHead = showNames; } /** diff --git a/src/me/libraryaddict/disguise/DisguiseListener.java b/src/me/libraryaddict/disguise/DisguiseListener.java index ba27fbeb..be0871ee 100644 --- a/src/me/libraryaddict/disguise/DisguiseListener.java +++ b/src/me/libraryaddict/disguise/DisguiseListener.java @@ -4,6 +4,7 @@ import java.util.HashMap; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.TargetedDisguise; +import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; import me.libraryaddict.disguise.utilities.DisguiseUtilities; import me.libraryaddict.disguise.utilities.UpdateChecker; @@ -85,6 +86,15 @@ public class DisguiseListener implements Listener { disguiseRunnable.remove(event.getPlayer().getName()).cancel(); String entityName = event.getRightClicked().getType().name().toLowerCase().replace("_", " "); if (disguise != null) { + if (event.getRightClicked() instanceof Player && DisguiseAPI.isNameOfPlayerShownAboveDisguise()) { + if (disguise.getWatcher() instanceof LivingWatcher) { + ((LivingWatcher) disguise.getWatcher()) + .setCustomName(((Player) event.getRightClicked()).getDisplayName()); + if (DisguiseAPI.isNameAboveHeadAlwaysVisible()) { + ((LivingWatcher) disguise.getWatcher()).setCustomNameVisible(true); + } + } + } DisguiseAPI.disguiseToAll(event.getRightClicked(), disguise); event.getPlayer().sendMessage( ChatColor.RED + "Disguised the " + entityName + " as a " diff --git a/src/me/libraryaddict/disguise/LibsDisguises.java b/src/me/libraryaddict/disguise/LibsDisguises.java index 5a3cdda0..3f033f17 100644 --- a/src/me/libraryaddict/disguise/LibsDisguises.java +++ b/src/me/libraryaddict/disguise/LibsDisguises.java @@ -64,10 +64,8 @@ public class LibsDisguises extends JavaPlugin { DisguiseAPI.setHideArmorFromSelf(getConfig().getBoolean("RemoveArmor")); DisguiseAPI.setHideHeldItemFromSelf(getConfig().getBoolean("RemoveHeldItem")); DisguiseAPI.setAddEntityAnimations(getConfig().getBoolean("AddEntityAnimations")); - DisguiseAPI.setUnusedDisguisesRemoved(getConfig().getBoolean("RemoveUnusedDisguises")); - if (DisguiseAPI.isHidingArmorFromSelf() || DisguiseAPI.isHidingHeldItemFromSelf()) { - DisguiseAPI.setInventoryListenerEnabled(true); - } + DisguiseAPI.setNameOfPlayerShownAboveDisguise(getConfig().getBoolean("ShowNamesAboveDisguises")); + DisguiseAPI.setNameAboveHeadAlwaysVisible(getConfig().getBoolean("NameAboveHeadAlwaysVisible")); try { // Here I use reflection to set the plugin for Disguise.. // Kind of stupid but I don't want open API calls for a commonly used object. diff --git a/src/me/libraryaddict/disguise/commands/DisguiseCommand.java b/src/me/libraryaddict/disguise/commands/DisguiseCommand.java index c71244b3..ef05a279 100644 --- a/src/me/libraryaddict/disguise/commands/DisguiseCommand.java +++ b/src/me/libraryaddict/disguise/commands/DisguiseCommand.java @@ -3,6 +3,7 @@ package me.libraryaddict.disguise.commands; import java.util.ArrayList; import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.disguisetypes.Disguise; +import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; import me.libraryaddict.disguise.utilities.BaseDisguiseCommand; import org.apache.commons.lang.StringUtils; @@ -30,6 +31,14 @@ public class DisguiseCommand extends BaseDisguiseCommand { } return true; } + if (DisguiseAPI.isNameOfPlayerShownAboveDisguise()) { + if (disguise.getWatcher() instanceof LivingWatcher) { + ((LivingWatcher) disguise.getWatcher()).setCustomName(((Player) sender).getDisplayName()); + if (DisguiseAPI.isNameAboveHeadAlwaysVisible()) { + ((LivingWatcher) disguise.getWatcher()).setCustomNameVisible(true); + } + } + } DisguiseAPI.disguiseToAll((Player) sender, disguise); sender.sendMessage(ChatColor.RED + "Now disguised as a " + disguise.getType().toReadable()); return true; diff --git a/src/me/libraryaddict/disguise/commands/DisguisePlayerCommand.java b/src/me/libraryaddict/disguise/commands/DisguisePlayerCommand.java index 4618a970..7130272d 100644 --- a/src/me/libraryaddict/disguise/commands/DisguisePlayerCommand.java +++ b/src/me/libraryaddict/disguise/commands/DisguisePlayerCommand.java @@ -3,6 +3,7 @@ package me.libraryaddict.disguise.commands; import java.util.ArrayList; import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.disguisetypes.Disguise; +import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; import me.libraryaddict.disguise.utilities.BaseDisguiseCommand; import org.apache.commons.lang.StringUtils; @@ -49,6 +50,14 @@ public class DisguisePlayerCommand extends BaseDisguiseCommand { } return true; } + if (DisguiseAPI.isNameOfPlayerShownAboveDisguise()) { + if (disguise.getWatcher() instanceof LivingWatcher) { + ((LivingWatcher) disguise.getWatcher()).setCustomName(((Player) player).getDisplayName()); + if (DisguiseAPI.isNameAboveHeadAlwaysVisible()) { + ((LivingWatcher) disguise.getWatcher()).setCustomNameVisible(true); + } + } + } DisguiseAPI.disguiseToAll(player, disguise); sender.sendMessage(ChatColor.RED + "Successfully disguised " + player.getName() + " as a " + disguise.getType().toReadable() + "!"); diff --git a/src/me/libraryaddict/disguise/commands/DisguiseRadiusCommand.java b/src/me/libraryaddict/disguise/commands/DisguiseRadiusCommand.java index 178daeb6..c1f885c5 100644 --- a/src/me/libraryaddict/disguise/commands/DisguiseRadiusCommand.java +++ b/src/me/libraryaddict/disguise/commands/DisguiseRadiusCommand.java @@ -3,6 +3,7 @@ package me.libraryaddict.disguise.commands; import java.util.ArrayList; import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.disguisetypes.Disguise; +import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; import me.libraryaddict.disguise.utilities.BaseDisguiseCommand; import org.apache.commons.lang.StringUtils; @@ -66,6 +67,15 @@ public class DisguiseRadiusCommand extends BaseDisguiseCommand { for (Entity entity : ((Player) sender).getNearbyEntities(radius, radius, radius)) { if (entity == sender) continue; + disguise = disguise.clone(); + if (entity instanceof Player && DisguiseAPI.isNameOfPlayerShownAboveDisguise()) { + if (disguise.getWatcher() instanceof LivingWatcher) { + ((LivingWatcher) disguise.getWatcher()).setCustomName(((Player) entity).getDisplayName()); + if (DisguiseAPI.isNameAboveHeadAlwaysVisible()) { + ((LivingWatcher) disguise.getWatcher()).setCustomNameVisible(true); + } + } + } DisguiseAPI.disguiseToAll(entity, disguise); disguisedEntitys++; } diff --git a/src/me/libraryaddict/disguise/utilities/PacketsManager.java b/src/me/libraryaddict/disguise/utilities/PacketsManager.java index 98835e47..f2653097 100644 --- a/src/me/libraryaddict/disguise/utilities/PacketsManager.java +++ b/src/me/libraryaddict/disguise/utilities/PacketsManager.java @@ -2,7 +2,6 @@ package me.libraryaddict.disguise.utilities; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; -import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Random;