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)) {