From d84ec1fd2c611b2a28bc747df40f8198cb8bcaaa Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Sat, 21 Jan 2017 07:58:51 +1300 Subject: [PATCH] Now can clone a player without clicking on them --- pom.xml | 2 +- .../libraryaddict/disguise/DisguiseAPI.java | 869 +++++++++--------- .../disguise/DisguiseListener.java | 36 +- .../commands/DisguiseCloneCommand.java | 34 +- .../disguise/utilities/DisguiseUtilities.java | 48 + 5 files changed, 514 insertions(+), 475 deletions(-) diff --git a/pom.xml b/pom.xml index eb83b3fe..336bc5f3 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 LibsDisguises LibsDisguises - 9.2.4 + 9.2.4-SNAPSHOT src diff --git a/src/me/libraryaddict/disguise/DisguiseAPI.java b/src/me/libraryaddict/disguise/DisguiseAPI.java index 5c46bb1b..7f6023e8 100644 --- a/src/me/libraryaddict/disguise/DisguiseAPI.java +++ b/src/me/libraryaddict/disguise/DisguiseAPI.java @@ -1,434 +1,435 @@ -package me.libraryaddict.disguise; - -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import org.bukkit.DyeColor; -import org.bukkit.Material; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Horse; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; -import org.bukkit.inventory.EntityEquipment; -import org.bukkit.inventory.HorseInventory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; - -import me.libraryaddict.disguise.disguisetypes.AnimalColor; -import me.libraryaddict.disguise.disguisetypes.Disguise; -import me.libraryaddict.disguise.disguisetypes.DisguiseType; -import me.libraryaddict.disguise.disguisetypes.FlagWatcher; -import me.libraryaddict.disguise.disguisetypes.MiscDisguise; -import me.libraryaddict.disguise.disguisetypes.MobDisguise; -import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; -import me.libraryaddict.disguise.disguisetypes.TargetedDisguise; -import me.libraryaddict.disguise.disguisetypes.TargetedDisguise.TargetType; -import me.libraryaddict.disguise.disguisetypes.watchers.AbstractHorseWatcher; -import me.libraryaddict.disguise.disguisetypes.watchers.HorseWatcher; -import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; -import me.libraryaddict.disguise.utilities.DisguiseUtilities; -import me.libraryaddict.disguise.utilities.ReflectionManager; - -public class DisguiseAPI { - public static Disguise constructDisguise(Entity entity) { - return constructDisguise(entity, true, true, true); - } - - public static Disguise constructDisguise(Entity entity, boolean doEquipment, boolean doSneak, boolean doSprint) { - DisguiseType disguiseType = DisguiseType.getType(entity); - Disguise disguise; - - if (disguiseType.isMisc()) { - disguise = new MiscDisguise(disguiseType); - } - else if (disguiseType.isMob()) { - disguise = new MobDisguise(disguiseType); - } - else { - disguise = new PlayerDisguise(entity.getName()); - } - - FlagWatcher watcher = disguise.getWatcher(); - - if (entity instanceof LivingEntity) { - for (PotionEffect effect : ((LivingEntity) entity).getActivePotionEffects()) { - ((LivingWatcher) watcher).addPotionEffect(effect.getType()); - - if (effect.getType() == PotionEffectType.INVISIBILITY) { - watcher.setInvisible(true); - } - else if (effect.getType() == PotionEffectType.GLOWING) { - watcher.setGlowing(true); - } - } - } - - if (entity.getFireTicks() > 0) { - watcher.setBurning(true); - } - - if (doEquipment && entity instanceof LivingEntity) { - EntityEquipment equip = ((LivingEntity) entity).getEquipment(); - - watcher.setArmor(equip.getArmorContents()); - watcher.setItemInMainHand(equip.getItemInMainHand()); - - if (disguiseType.getEntityType() == EntityType.HORSE) { - Horse horse = (Horse) entity; - HorseInventory horseInventory = horse.getInventory(); - ItemStack saddle = horseInventory.getSaddle(); - - if (saddle != null && saddle.getType() == Material.SADDLE) { - ((AbstractHorseWatcher) watcher).setSaddled(true); - } - - if (watcher instanceof HorseWatcher) - ((HorseWatcher) watcher).setHorseArmor(horseInventory.getArmor()); - } - } - for (Method method : entity.getClass().getMethods()) { - if ((doSneak || !method.getName().equals("setSneaking")) && (doSprint || !method.getName().equals("setSprinting")) - && method.getParameterTypes().length == 0 && method.getReturnType() != void.class) { - Class methodReturn = method.getReturnType(); - - if (methodReturn == float.class || methodReturn == Float.class || methodReturn == Double.class) { - methodReturn = double.class; - } - - int firstCapitalMethod = firstCapital(method.getName()); - - if (firstCapitalMethod > 0) { - for (Method watcherMethod : watcher.getClass().getMethods()) { - if (!watcherMethod.getName().startsWith("get") && watcherMethod.getReturnType() == void.class - && watcherMethod.getParameterTypes().length == 1) { - int firstCapitalWatcher = firstCapital(watcherMethod.getName()); - - if (firstCapitalWatcher > 0 && method.getName().substring(firstCapitalMethod) - .equalsIgnoreCase(watcherMethod.getName().substring(firstCapitalWatcher))) { - Class methodParam = watcherMethod.getParameterTypes()[0]; - - if (methodParam == float.class || methodParam == Float.class || methodParam == Double.class) { - methodParam = double.class; - } - else if (methodParam == AnimalColor.class) { - methodParam = DyeColor.class; - } - if (methodReturn == methodParam) { - try { - Object value = method.invoke(entity); - if (value != null) { - Class toCast = watcherMethod.getParameterTypes()[0]; - if (!(toCast.isInstance(value))) { - if (toCast == float.class) { - if (!(value instanceof Float)) { - double d = (Double) value; - value = (float) d; - } - } - else if (toCast == double.class) { - if (!(value instanceof Double)) { - float d = (Float) value; - value = (double) d; - } - } - else if (toCast == AnimalColor.class) { - value = AnimalColor.valueOf(((DyeColor) value).name()); - } - } - if (value instanceof Boolean && !(Boolean) value - && watcherMethod.getDeclaringClass() == FlagWatcher.class) { - continue; - } - } - watcherMethod.invoke(watcher, value); - } - catch (Exception ex) { - ex.printStackTrace(); - } - } - } - } - } - } - } - } - return 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) { - return; - } - // The event wasn't cancelled. - // If the disguise entity isn't the same as the one we are disguising - if (disguise.getEntity() != entity) { - // If the disguise entity actually exists - if (disguise.getEntity() != null) { - // Clone the disguise - disguise = disguise.clone(); - } - // Set the disguise's entity - disguise.setEntity(entity); - } - - if (Disguise.getViewSelf().contains(disguise.getEntity().getUniqueId())) { - disguise.setViewSelfDisguise(true); - } - - disguise.startDisguise(); - } - - public static void disguiseIgnorePlayers(Entity entity, Disguise disguise, Collection playersToNotSeeDisguise) { - if (disguise.getEntity() != null) { - disguise = disguise.clone(); - } - - ((TargetedDisguise) disguise).setDisguiseTarget(TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS); - - for (Object obj : playersToNotSeeDisguise) { - if (obj instanceof String) { - ((TargetedDisguise) disguise).addPlayer((String) obj); - } - else if (obj instanceof Player) { - ((TargetedDisguise) disguise).addPlayer(((Player) obj).getName()); - } - } - - disguiseEntity(entity, disguise); - } - - @Deprecated - public static void disguiseIgnorePlayers(Entity entity, Disguise disguise, List playersToNotSeeDisguise) { - disguiseIgnorePlayers(entity, disguise, (Collection) playersToNotSeeDisguise); - } - - public static void disguiseIgnorePlayers(Entity entity, Disguise disguise, Player... playersToNotSeeDisguise) { - disguiseIgnorePlayers(entity, disguise, (Collection) Arrays.asList(playersToNotSeeDisguise)); - } - - public static void disguiseIgnorePlayers(Entity entity, Disguise disguise, String... playersToNotSeeDisguise) { - disguiseIgnorePlayers(entity, disguise, (Collection) Arrays.asList(playersToNotSeeDisguise)); - } - - /** - * Disguise the next entity to spawn, this means you need to spawn an entity immediately after calling this. - * - * @param disguise - * @return - */ - public static int disguiseNextEntity(Disguise disguise) { - if (disguise == null) { - return -1; - } - - if (disguise.getEntity() != null || DisguiseUtilities.getDisguises().containsValue(disguise)) { - disguise = disguise.clone(); - } - - try { - int id = ReflectionManager.getNmsField("Entity", "entityCount").getInt(null); - DisguiseUtilities.addFutureDisguise(id, (TargetedDisguise) disguise); - - return id; - } - catch (IllegalAccessException e) { - e.printStackTrace(); - } - - return -1; - } - - /** - * Disguise this entity with this disguise - * - * @param entity - * @param disguise - */ - public static void disguiseToAll(Entity entity, Disguise disguise) { - if (disguise.getEntity() != null) { - disguise = disguise.clone(); - } - - // You called the disguiseToAll method foolish mortal! Prepare to have your custom settings wiped!!! - ((TargetedDisguise) disguise).setDisguiseTarget(TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS); - - for (String observer : ((TargetedDisguise) disguise).getObservers()) { - ((TargetedDisguise) disguise).removePlayer(observer); - } - disguiseEntity(entity, disguise); - } - - public static void disguiseToPlayers(Entity entity, Disguise disguise, Collection playersToViewDisguise) { - if (disguise.getEntity() != null) { - disguise = disguise.clone(); - } - - ((TargetedDisguise) disguise).setDisguiseTarget(TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS); - - for (Object obj : playersToViewDisguise) { - if (obj instanceof String) { - ((TargetedDisguise) disguise).addPlayer((String) obj); - } - else if (obj instanceof Player) { - ((TargetedDisguise) disguise).addPlayer(((Player) obj).getName()); - } - } - - disguiseEntity(entity, disguise); - } - - @Deprecated - public static void disguiseToPlayers(Entity entity, Disguise disguise, List playersToViewDisguise) { - disguiseToPlayers(entity, disguise, (Collection) playersToViewDisguise); - } - - public static void disguiseToPlayers(Entity entity, Disguise disguise, Player... playersToViewDisguise) { - disguiseToPlayers(entity, disguise, (Collection) Arrays.asList(playersToViewDisguise)); - } - - public static void disguiseToPlayers(Entity entity, Disguise disguise, String... playersToViewDisguise) { - disguiseToPlayers(entity, disguise, (Collection) Arrays.asList(playersToViewDisguise)); - } - - private static int firstCapital(String str) { - for (int i = 0; i < str.length(); i++) { - if (Character.isUpperCase(str.charAt(i))) { - return i; - } - } - - return -1; - } - - /** - * Get the disguise of a entity - * - * @param disguised - * @return - */ - public static Disguise getDisguise(Entity disguised) { - if (disguised == null) { - return null; - } - - return DisguiseUtilities.getMainDisguise(disguised.getUniqueId()); - } - - /** - * Get the disguise of a entity - * - * @param observer - * @param disguised - * @return - */ - public static Disguise getDisguise(Player observer, Entity disguised) { - if (disguised == null || observer == null) { - return null; - } - - return DisguiseUtilities.getDisguise(observer, disguised); - } - - /** - * Get the disguises of a entity - * - * @param disguised - * @return - */ - public static Disguise[] getDisguises(Entity disguised) { - if (disguised == null) { - return null; - } - - return DisguiseUtilities.getDisguises(disguised.getUniqueId()); - } - - public static int getSelfDisguiseId() { - return -10; - } - - /** - * Is this entity disguised - * - * @param disguised - * @return - */ - public static boolean isDisguised(Entity disguised) { - return getDisguise(disguised) != null; - } - - /** - * Is this entity disguised - * - * @param observer - * @param disguised - * @return - */ - public static boolean isDisguised(Player observer, Entity disguised) { - return getDisguise(observer, disguised) != null; - } - - public static boolean isDisguiseInUse(Disguise disguise) { - return disguise.isDisguiseInUse(); - } - - public static boolean isSelfDisguised(Player player) { - return DisguiseUtilities.getSelfDisguised().contains(player.getUniqueId()); - } - - /** - * Returns true if the entitiy has /disguiseviewself toggled on. - * - * @param entity - * @return - */ - public static boolean isViewSelfToggled(Entity entity) { - return isDisguised(entity) ? getDisguise(entity).isSelfDisguiseVisible() - : Disguise.getViewSelf().contains(entity.getUniqueId()); - } - - /** - * Undisguise the entity. This doesn't let you cancel the UndisguiseEvent if the entity is no longer valid. Aka removed from - * the world. - * - * @param entity - */ - public static void undisguiseToAll(Entity entity) { - Disguise[] disguises = getDisguises(entity); - - for (Disguise disguise : disguises) { - disguise.removeDisguise(); - } - } - - /** - * Set whether this player can see his own disguise or not. - * - * @param entity - * @param toggled - */ - public static void setViewDisguiseToggled(Entity entity, boolean toggled) { - if (isDisguised(entity)) { - Disguise disguise = getDisguise(entity); - disguise.setViewSelfDisguise(toggled); - } - - if (toggled) { - if (!Disguise.getViewSelf().contains(entity.getUniqueId())) { - Disguise.getViewSelf().add(entity.getUniqueId()); - } - } - else { - Disguise.getViewSelf().remove(entity.getUniqueId()); - } - } - - private DisguiseAPI() { - } -} +package me.libraryaddict.disguise; + +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +import org.bukkit.DyeColor; +import org.bukkit.Material; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Horse; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.inventory.EntityEquipment; +import org.bukkit.inventory.HorseInventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import me.libraryaddict.disguise.disguisetypes.AnimalColor; +import me.libraryaddict.disguise.disguisetypes.Disguise; +import me.libraryaddict.disguise.disguisetypes.DisguiseType; +import me.libraryaddict.disguise.disguisetypes.FlagWatcher; +import me.libraryaddict.disguise.disguisetypes.MiscDisguise; +import me.libraryaddict.disguise.disguisetypes.MobDisguise; +import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; +import me.libraryaddict.disguise.disguisetypes.TargetedDisguise; +import me.libraryaddict.disguise.disguisetypes.TargetedDisguise.TargetType; +import me.libraryaddict.disguise.disguisetypes.watchers.AbstractHorseWatcher; +import me.libraryaddict.disguise.disguisetypes.watchers.HorseWatcher; +import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; +import me.libraryaddict.disguise.utilities.DisguiseUtilities; +import me.libraryaddict.disguise.utilities.ReflectionManager; + +public class DisguiseAPI { + public static Disguise constructDisguise(Entity entity) { + return constructDisguise(entity, true, true, true); + } + + public static Disguise constructDisguise(Entity entity, boolean doEquipment, boolean doSneak, boolean doSprint) { + DisguiseType disguiseType = DisguiseType.getType(entity); + Disguise disguise; + + if (disguiseType.isMisc()) { + disguise = new MiscDisguise(disguiseType); + } + else if (disguiseType.isMob()) { + disguise = new MobDisguise(disguiseType); + } + else { + disguise = new PlayerDisguise(entity.getName()); + } + + FlagWatcher watcher = disguise.getWatcher(); + + if (entity instanceof LivingEntity) { + for (PotionEffect effect : ((LivingEntity) entity).getActivePotionEffects()) { + ((LivingWatcher) watcher).addPotionEffect(effect.getType()); + + if (effect.getType() == PotionEffectType.INVISIBILITY) { + watcher.setInvisible(true); + } + else if (effect.getType() == PotionEffectType.GLOWING) { + watcher.setGlowing(true); + } + } + } + + if (entity.getFireTicks() > 0) { + watcher.setBurning(true); + } + + if (doEquipment && entity instanceof LivingEntity) { + EntityEquipment equip = ((LivingEntity) entity).getEquipment(); + + watcher.setArmor(equip.getArmorContents()); + watcher.setItemInMainHand(equip.getItemInMainHand()); + + if (disguiseType.getEntityType() == EntityType.HORSE) { + Horse horse = (Horse) entity; + HorseInventory horseInventory = horse.getInventory(); + ItemStack saddle = horseInventory.getSaddle(); + + if (saddle != null && saddle.getType() == Material.SADDLE) { + ((AbstractHorseWatcher) watcher).setSaddled(true); + } + + if (watcher instanceof HorseWatcher) + ((HorseWatcher) watcher).setHorseArmor(horseInventory.getArmor()); + } + } + for (Method method : entity.getClass().getMethods()) { + if ((doSneak || !method.getName().equals("setSneaking")) && (doSprint || !method.getName().equals("setSprinting")) + && method.getParameterTypes().length == 0 && method.getReturnType() != void.class) { + Class methodReturn = method.getReturnType(); + + if (methodReturn == float.class || methodReturn == Float.class || methodReturn == Double.class) { + methodReturn = double.class; + } + + int firstCapitalMethod = firstCapital(method.getName()); + + if (firstCapitalMethod > 0) { + for (Method watcherMethod : watcher.getClass().getMethods()) { + if (!watcherMethod.getName().startsWith("get") && watcherMethod.getReturnType() == void.class + && watcherMethod.getParameterTypes().length == 1) { + int firstCapitalWatcher = firstCapital(watcherMethod.getName()); + + if (firstCapitalWatcher > 0 && method.getName().substring(firstCapitalMethod) + .equalsIgnoreCase(watcherMethod.getName().substring(firstCapitalWatcher))) { + Class methodParam = watcherMethod.getParameterTypes()[0]; + + if (methodParam == float.class || methodParam == Float.class || methodParam == Double.class) { + methodParam = double.class; + } + else if (methodParam == AnimalColor.class) { + methodParam = DyeColor.class; + } + if (methodReturn == methodParam) { + try { + Object value = method.invoke(entity); + if (value != null) { + Class toCast = watcherMethod.getParameterTypes()[0]; + if (!(toCast.isInstance(value))) { + if (toCast == float.class) { + if (!(value instanceof Float)) { + double d = (Double) value; + value = (float) d; + } + } + else if (toCast == double.class) { + if (!(value instanceof Double)) { + float d = (Float) value; + value = (double) d; + } + } + else if (toCast == AnimalColor.class) { + value = AnimalColor.valueOf(((DyeColor) value).name()); + } + } + if (value instanceof Boolean && !(Boolean) value + && watcherMethod.getDeclaringClass() == FlagWatcher.class) { + continue; + } + } + watcherMethod.invoke(watcher, value); + } + catch (Exception ex) { + ex.printStackTrace(); + } + } + } + } + } + } + } + } + + return 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) { + return; + } + // The event wasn't cancelled. + // If the disguise entity isn't the same as the one we are disguising + if (disguise.getEntity() != entity) { + // If the disguise entity actually exists + if (disguise.getEntity() != null) { + // Clone the disguise + disguise = disguise.clone(); + } + // Set the disguise's entity + disguise.setEntity(entity); + } + + if (Disguise.getViewSelf().contains(disguise.getEntity().getUniqueId())) { + disguise.setViewSelfDisguise(true); + } + + disguise.startDisguise(); + } + + public static void disguiseIgnorePlayers(Entity entity, Disguise disguise, Collection playersToNotSeeDisguise) { + if (disguise.getEntity() != null) { + disguise = disguise.clone(); + } + + ((TargetedDisguise) disguise).setDisguiseTarget(TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS); + + for (Object obj : playersToNotSeeDisguise) { + if (obj instanceof String) { + ((TargetedDisguise) disguise).addPlayer((String) obj); + } + else if (obj instanceof Player) { + ((TargetedDisguise) disguise).addPlayer(((Player) obj).getName()); + } + } + + disguiseEntity(entity, disguise); + } + + @Deprecated + public static void disguiseIgnorePlayers(Entity entity, Disguise disguise, List playersToNotSeeDisguise) { + disguiseIgnorePlayers(entity, disguise, (Collection) playersToNotSeeDisguise); + } + + public static void disguiseIgnorePlayers(Entity entity, Disguise disguise, Player... playersToNotSeeDisguise) { + disguiseIgnorePlayers(entity, disguise, (Collection) Arrays.asList(playersToNotSeeDisguise)); + } + + public static void disguiseIgnorePlayers(Entity entity, Disguise disguise, String... playersToNotSeeDisguise) { + disguiseIgnorePlayers(entity, disguise, (Collection) Arrays.asList(playersToNotSeeDisguise)); + } + + /** + * Disguise the next entity to spawn, this means you need to spawn an entity immediately after calling this. + * + * @param disguise + * @return + */ + public static int disguiseNextEntity(Disguise disguise) { + if (disguise == null) { + return -1; + } + + if (disguise.getEntity() != null || DisguiseUtilities.getDisguises().containsValue(disguise)) { + disguise = disguise.clone(); + } + + try { + int id = ReflectionManager.getNmsField("Entity", "entityCount").getInt(null); + DisguiseUtilities.addFutureDisguise(id, (TargetedDisguise) disguise); + + return id; + } + catch (IllegalAccessException e) { + e.printStackTrace(); + } + + return -1; + } + + /** + * Disguise this entity with this disguise + * + * @param entity + * @param disguise + */ + public static void disguiseToAll(Entity entity, Disguise disguise) { + if (disguise.getEntity() != null) { + disguise = disguise.clone(); + } + + // You called the disguiseToAll method foolish mortal! Prepare to have your custom settings wiped!!! + ((TargetedDisguise) disguise).setDisguiseTarget(TargetType.SHOW_TO_EVERYONE_BUT_THESE_PLAYERS); + + for (String observer : ((TargetedDisguise) disguise).getObservers()) { + ((TargetedDisguise) disguise).removePlayer(observer); + } + disguiseEntity(entity, disguise); + } + + public static void disguiseToPlayers(Entity entity, Disguise disguise, Collection playersToViewDisguise) { + if (disguise.getEntity() != null) { + disguise = disguise.clone(); + } + + ((TargetedDisguise) disguise).setDisguiseTarget(TargetType.HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS); + + for (Object obj : playersToViewDisguise) { + if (obj instanceof String) { + ((TargetedDisguise) disguise).addPlayer((String) obj); + } + else if (obj instanceof Player) { + ((TargetedDisguise) disguise).addPlayer(((Player) obj).getName()); + } + } + + disguiseEntity(entity, disguise); + } + + @Deprecated + public static void disguiseToPlayers(Entity entity, Disguise disguise, List playersToViewDisguise) { + disguiseToPlayers(entity, disguise, (Collection) playersToViewDisguise); + } + + public static void disguiseToPlayers(Entity entity, Disguise disguise, Player... playersToViewDisguise) { + disguiseToPlayers(entity, disguise, (Collection) Arrays.asList(playersToViewDisguise)); + } + + public static void disguiseToPlayers(Entity entity, Disguise disguise, String... playersToViewDisguise) { + disguiseToPlayers(entity, disguise, (Collection) Arrays.asList(playersToViewDisguise)); + } + + private static int firstCapital(String str) { + for (int i = 0; i < str.length(); i++) { + if (Character.isUpperCase(str.charAt(i))) { + return i; + } + } + + return -1; + } + + /** + * Get the disguise of a entity + * + * @param disguised + * @return + */ + public static Disguise getDisguise(Entity disguised) { + if (disguised == null) { + return null; + } + + return DisguiseUtilities.getMainDisguise(disguised.getUniqueId()); + } + + /** + * Get the disguise of a entity + * + * @param observer + * @param disguised + * @return + */ + public static Disguise getDisguise(Player observer, Entity disguised) { + if (disguised == null || observer == null) { + return null; + } + + return DisguiseUtilities.getDisguise(observer, disguised); + } + + /** + * Get the disguises of a entity + * + * @param disguised + * @return + */ + public static Disguise[] getDisguises(Entity disguised) { + if (disguised == null) { + return null; + } + + return DisguiseUtilities.getDisguises(disguised.getUniqueId()); + } + + public static int getSelfDisguiseId() { + return -10; + } + + /** + * Is this entity disguised + * + * @param disguised + * @return + */ + public static boolean isDisguised(Entity disguised) { + return getDisguise(disguised) != null; + } + + /** + * Is this entity disguised + * + * @param observer + * @param disguised + * @return + */ + public static boolean isDisguised(Player observer, Entity disguised) { + return getDisguise(observer, disguised) != null; + } + + public static boolean isDisguiseInUse(Disguise disguise) { + return disguise.isDisguiseInUse(); + } + + public static boolean isSelfDisguised(Player player) { + return DisguiseUtilities.getSelfDisguised().contains(player.getUniqueId()); + } + + /** + * Returns true if the entitiy has /disguiseviewself toggled on. + * + * @param entity + * @return + */ + public static boolean isViewSelfToggled(Entity entity) { + return isDisguised(entity) ? getDisguise(entity).isSelfDisguiseVisible() + : Disguise.getViewSelf().contains(entity.getUniqueId()); + } + + /** + * Undisguise the entity. This doesn't let you cancel the UndisguiseEvent if the entity is no longer valid. Aka removed from + * the world. + * + * @param entity + */ + public static void undisguiseToAll(Entity entity) { + Disguise[] disguises = getDisguises(entity); + + for (Disguise disguise : disguises) { + disguise.removeDisguise(); + } + } + + /** + * Set whether this player can see his own disguise or not. + * + * @param entity + * @param toggled + */ + public static void setViewDisguiseToggled(Entity entity, boolean toggled) { + if (isDisguised(entity)) { + Disguise disguise = getDisguise(entity); + disguise.setViewSelfDisguise(toggled); + } + + if (toggled) { + if (!Disguise.getViewSelf().contains(entity.getUniqueId())) { + Disguise.getViewSelf().add(entity.getUniqueId()); + } + } + else { + Disguise.getViewSelf().remove(entity.getUniqueId()); + } + } + + private DisguiseAPI() { + } +} diff --git a/src/me/libraryaddict/disguise/DisguiseListener.java b/src/me/libraryaddict/disguise/DisguiseListener.java index c77a0a65..4e06493c 100644 --- a/src/me/libraryaddict/disguise/DisguiseListener.java +++ b/src/me/libraryaddict/disguise/DisguiseListener.java @@ -329,41 +329,7 @@ public class DisguiseListener implements Listener { if (disguiseClone.containsKey(p.getName())) { Boolean[] options = disguiseClone.remove(p.getName()); - Disguise disguise = DisguiseAPI.getDisguise(p, entity); - - if (disguise == null) { - disguise = DisguiseAPI.constructDisguise(entity, options[0], options[1], options[2]); - } - else { - disguise = disguise.clone(); - } - - char[] alphabet = "abcdefghijklmnopqrstuvwxyz".toCharArray(); - - String reference = null; - int referenceLength = Math.max(2, (int) Math.ceil((0.1D + DisguiseConfig.getMaxClonedDisguises()) / 26D)); - int attempts = 0; - - while (reference == null && attempts++ < 1000) { - reference = "@"; - - for (int i = 0; i < referenceLength; i++) { - reference += alphabet[DisguiseUtilities.random.nextInt(alphabet.length)]; - } - - if (DisguiseUtilities.getClonedDisguise(reference) != null) { - reference = null; - } - } - - if (reference != null && DisguiseUtilities.addClonedDisguise(reference, disguise)) { - p.sendMessage(ChatColor.RED + "Constructed a " + entityName + " disguise! Your reference is " + reference); - p.sendMessage(ChatColor.RED + "Example usage: /disguise " + reference); - } - else { - p.sendMessage( - ChatColor.RED + "Failed to store the reference due to lack of size. Please set this in the config"); - } + DisguiseUtilities.createClonedDisguise(p, entity, options); } else if (disguiseEntity.containsKey(p.getName())) { Disguise disguise = disguiseEntity.remove(p.getName()); diff --git a/src/me/libraryaddict/disguise/commands/DisguiseCloneCommand.java b/src/me/libraryaddict/disguise/commands/DisguiseCloneCommand.java index 7fcb7f1e..dd91f4b0 100644 --- a/src/me/libraryaddict/disguise/commands/DisguiseCloneCommand.java +++ b/src/me/libraryaddict/disguise/commands/DisguiseCloneCommand.java @@ -5,14 +5,17 @@ import java.util.HashMap; import java.util.List; import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabCompleter; +import org.bukkit.entity.Player; import me.libraryaddict.disguise.DisguiseConfig; import me.libraryaddict.disguise.LibsDisguises; import me.libraryaddict.disguise.utilities.DisguiseParser.DisguisePerm; +import me.libraryaddict.disguise.utilities.DisguiseUtilities; public class DisguiseCloneCommand extends DisguiseBaseCommand implements TabCompleter { @Override @@ -26,8 +29,14 @@ public class DisguiseCloneCommand extends DisguiseBaseCommand implements TabComp boolean doEquipment = true; boolean doSneak = false; boolean doSprint = false; + Player player = null; - for (String option : args) { + if (args.length > 0) { + player = Bukkit.getPlayerExact(args[0]); + } + + for (int i = player == null ? 0 : 1; i < args.length; i++) { + String option = args[i]; if (StringUtils.startsWithIgnoreCase(option, "ignoreEquip") || StringUtils.startsWithIgnoreCase(option, "ignoreEnquip")) { doEquipment = false; @@ -49,12 +58,19 @@ public class DisguiseCloneCommand extends DisguiseBaseCommand implements TabComp } } - LibsDisguises.getInstance().getListener().setDisguiseClone(sender.getName(), new Boolean[] { + Boolean[] options = new Boolean[] { doEquipment, doSneak, doSprint - }); + }; - sender.sendMessage(ChatColor.RED + "Right click a entity in the next " + DisguiseConfig.getDisguiseCloneExpire() - + " seconds to grab the disguise reference!"); + if (player != null) { + DisguiseUtilities.createClonedDisguise((Player) sender, player, options); + } + else { + LibsDisguises.getInstance().getListener().setDisguiseClone(sender.getName(), options); + + sender.sendMessage(ChatColor.RED + "Right click a entity in the next " + DisguiseConfig.getDisguiseCloneExpire() + + " seconds to grab the disguise reference!"); + } } else { sender.sendMessage(ChatColor.RED + "You are forbidden to use this command."); @@ -67,6 +83,14 @@ public class DisguiseCloneCommand extends DisguiseBaseCommand implements TabComp public List onTabComplete(CommandSender sender, Command cmd, String label, String[] origArgs) { ArrayList tabs = new ArrayList(); + String[] args = getArgs(origArgs); + + if (args.length == 0) { + for (Player player : Bukkit.getOnlinePlayers()) { + tabs.add(player.getName()); + } + } + tabs.add("ignoreEquip"); tabs.add("doSneakSprint"); tabs.add("doSneak"); diff --git a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index bc8af5ac..c59a3b15 100644 --- a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -17,6 +17,7 @@ import java.util.UUID; import java.util.regex.Pattern; import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; @@ -58,6 +59,9 @@ import me.libraryaddict.disguise.disguisetypes.watchers.AgeableWatcher; import me.libraryaddict.disguise.disguisetypes.watchers.PlayerWatcher; import me.libraryaddict.disguise.disguisetypes.watchers.ZombieWatcher; import me.libraryaddict.disguise.utilities.PacketsManager.LibsPackets; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.ClickEvent.Action; +import net.md_5.bungee.api.chat.ComponentBuilder; public class DisguiseUtilities { public static final Random random = new Random(); @@ -143,6 +147,50 @@ public class DisguiseUtilities { } } + public static void createClonedDisguise(Player player, Entity toClone, Boolean[] options) { + Disguise disguise = DisguiseAPI.getDisguise(player, toClone); + + if (disguise == null) { + disguise = DisguiseAPI.constructDisguise(toClone, options[0], options[1], options[2]); + } + else { + disguise = disguise.clone(); + } + + char[] alphabet = "abcdefghijklmnopqrstuvwxyz".toCharArray(); + + String reference = null; + int referenceLength = Math.max(2, (int) Math.ceil((0.1D + DisguiseConfig.getMaxClonedDisguises()) / 26D)); + int attempts = 0; + + while (reference == null && attempts++ < 1000) { + reference = "@"; + + for (int i = 0; i < referenceLength; i++) { + reference += alphabet[DisguiseUtilities.random.nextInt(alphabet.length)]; + } + + if (DisguiseUtilities.getClonedDisguise(reference) != null) { + reference = null; + } + } + + if (reference != null && DisguiseUtilities.addClonedDisguise(reference, disguise)) { + String entityName = DisguiseType.getType(toClone).toReadable(); + + ComponentBuilder text = new ComponentBuilder( + ChatColor.RED + "Constructed a " + entityName + " disguise! Your reference is "); + text.append(reference).event(new ClickEvent(Action.SUGGEST_COMMAND, reference)); + + player.sendRawMessage(text.toString()); + player.sendMessage(ChatColor.RED + "Example usage: /disguise " + reference); + } + else { + player.sendMessage( + ChatColor.RED + "Failed to store the reference, too many cloned disguises. Please set this in the config"); + } + } + public static boolean addClonedDisguise(String key, Disguise disguise) { if (DisguiseConfig.getMaxClonedDisguises() > 0) { if (clonedDisguises.containsKey(key)) {