Now can clone a player without clicking on them
This commit is contained in:
		
							
								
								
									
										2
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								pom.xml
									
									
									
									
									
								
							| @@ -3,7 +3,7 @@ | ||||
| 	<modelVersion>4.0.0</modelVersion> | ||||
| 	<groupId>LibsDisguises</groupId> | ||||
| 	<artifactId>LibsDisguises</artifactId> | ||||
| 	<version>9.2.4</version> | ||||
| 	<version>9.2.4-SNAPSHOT</version> | ||||
|  | ||||
| 	<build> | ||||
| 		<sourceDirectory>src</sourceDirectory> | ||||
|   | ||||
| @@ -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<String> 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<String> 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<String> 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<String> 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() { | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -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()); | ||||
|   | ||||
| @@ -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<String> onTabComplete(CommandSender sender, Command cmd, String label, String[] origArgs) { | ||||
|         ArrayList<String> tabs = new ArrayList<String>(); | ||||
|  | ||||
|         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"); | ||||
|   | ||||
| @@ -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)) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user