diff --git a/src/me/libraryaddict/disguise/DisguiseConfig.java b/src/me/libraryaddict/disguise/DisguiseConfig.java index 61020c52..c653ee07 100644 --- a/src/me/libraryaddict/disguise/DisguiseConfig.java +++ b/src/me/libraryaddict/disguise/DisguiseConfig.java @@ -14,9 +14,9 @@ public class DisguiseConfig { private static String disguiseBlownMessage; private static int disguiseCloneExpire; private static int disguiseEntityExpire; - private static boolean equipmentEnabled; private static boolean entityAnimationsAdded; private static boolean entityStatusEnabled; + private static boolean equipmentEnabled; private static boolean hearSelfDisguise; private static boolean hidingArmor; private static boolean hidingHeldItem; @@ -105,13 +105,13 @@ public class DisguiseConfig { return blowDisguisesOnAttack; } - public static boolean isEquipmentPacketsEnabled() { - return equipmentEnabled; - } /** * @deprecated Spelling mistake. */ - @Deprecated public static boolean isEnquipmentPacketsEnabled() { return equipmentEnabled; } + @Deprecated + public static boolean isEnquipmentPacketsEnabled() { + return equipmentEnabled; + } public static boolean isEntityAnimationsAdded() { return entityAnimationsAdded; @@ -121,6 +121,10 @@ public class DisguiseConfig { return entityStatusEnabled; } + public static boolean isEquipmentPacketsEnabled() { + return equipmentEnabled; + } + /** * Is the plugin modifying the inventory packets so that players when self disguised, do not see their armor floating around */ diff --git a/src/me/libraryaddict/disguise/commands/DisguiseCloneCommand.java b/src/me/libraryaddict/disguise/commands/DisguiseCloneCommand.java index 513070d8..54124509 100644 --- a/src/me/libraryaddict/disguise/commands/DisguiseCloneCommand.java +++ b/src/me/libraryaddict/disguise/commands/DisguiseCloneCommand.java @@ -32,7 +32,8 @@ public class DisguiseCloneCommand extends BaseDisguiseCommand { boolean doSneak = false; boolean doSprint = false; for (String option : args) { - if (StringUtils.startsWithIgnoreCase(option, "ignoreEquip") || StringUtils.startsWithIgnoreCase(option, "ignoreEnquip")) { + if (StringUtils.startsWithIgnoreCase(option, "ignoreEquip") + || StringUtils.startsWithIgnoreCase(option, "ignoreEnquip")) { doEquipment = false; } else if (option.equalsIgnoreCase("doSneakSprint")) { doSneak = true; @@ -62,8 +63,9 @@ public class DisguiseCloneCommand extends BaseDisguiseCommand { protected void sendCommandUsage(CommandSender sender, HashMap, Boolean>> map) { sender.sendMessage(ChatColor.DARK_GREEN + "Right click a entity to get a disguise reference you can pass to other disguise commands!"); - sender.sendMessage(ChatColor.DARK_GREEN + "Security note: Any references you create will be available to all players able to use disguise references."); - sender.sendMessage(ChatColor.DARK_GREEN + "/disguiseclone IgnoreEquipment" + ChatColor.DARK_GREEN + "(" - + ChatColor.GREEN + "Optional" + ChatColor.DARK_GREEN + ")"); + sender.sendMessage(ChatColor.DARK_GREEN + + "Security note: Any references you create will be available to all players able to use disguise references."); + sender.sendMessage(ChatColor.DARK_GREEN + "/disguiseclone IgnoreEquipment" + ChatColor.DARK_GREEN + "(" + ChatColor.GREEN + + "Optional" + ChatColor.DARK_GREEN + ")"); } } diff --git a/src/me/libraryaddict/disguise/commands/UndisguiseCommand.java b/src/me/libraryaddict/disguise/commands/UndisguiseCommand.java index 89ee84d8..38550724 100644 --- a/src/me/libraryaddict/disguise/commands/UndisguiseCommand.java +++ b/src/me/libraryaddict/disguise/commands/UndisguiseCommand.java @@ -1,6 +1,5 @@ package me.libraryaddict.disguise.commands; - import me.libraryaddict.disguise.DisguiseAPI; import org.bukkit.ChatColor; @@ -10,7 +9,6 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; - public class UndisguiseCommand implements CommandExecutor { @Override diff --git a/src/me/libraryaddict/disguise/commands/UndisguisePlayerCommand.java b/src/me/libraryaddict/disguise/commands/UndisguisePlayerCommand.java index a41062f4..73524691 100644 --- a/src/me/libraryaddict/disguise/commands/UndisguisePlayerCommand.java +++ b/src/me/libraryaddict/disguise/commands/UndisguisePlayerCommand.java @@ -1,6 +1,5 @@ package me.libraryaddict.disguise.commands; - import me.libraryaddict.disguise.DisguiseAPI; import org.bukkit.Bukkit; @@ -10,7 +9,6 @@ import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; - public class UndisguisePlayerCommand implements CommandExecutor { @Override diff --git a/src/me/libraryaddict/disguise/commands/UndisguiseRadiusCommand.java b/src/me/libraryaddict/disguise/commands/UndisguiseRadiusCommand.java index 3bf552e2..5eb40ac7 100644 --- a/src/me/libraryaddict/disguise/commands/UndisguiseRadiusCommand.java +++ b/src/me/libraryaddict/disguise/commands/UndisguiseRadiusCommand.java @@ -1,6 +1,5 @@ package me.libraryaddict.disguise.commands; - import me.libraryaddict.disguise.DisguiseAPI; import org.bukkit.ChatColor; @@ -10,7 +9,6 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; - public class UndisguiseRadiusCommand implements CommandExecutor { private int maxRadius = 30; diff --git a/src/me/libraryaddict/disguise/disguisetypes/MobDisguise.java b/src/me/libraryaddict/disguise/disguisetypes/MobDisguise.java index faa7d390..4206040b 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/MobDisguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/MobDisguise.java @@ -62,8 +62,7 @@ public class MobDisguise extends TargetedDisguise { } public boolean doesDisguiseAge() { - return getWatcher() != null && - (getWatcher() instanceof AgeableWatcher || getWatcher() instanceof ZombieWatcher); + return getWatcher() != null && (getWatcher() instanceof AgeableWatcher || getWatcher() instanceof ZombieWatcher); } public boolean isAdult() { diff --git a/src/me/libraryaddict/disguise/events/UndisguiseEvent.java b/src/me/libraryaddict/disguise/events/UndisguiseEvent.java index 18f3baeb..5722ba79 100644 --- a/src/me/libraryaddict/disguise/events/UndisguiseEvent.java +++ b/src/me/libraryaddict/disguise/events/UndisguiseEvent.java @@ -1,6 +1,5 @@ package me.libraryaddict.disguise.events; - import me.libraryaddict.disguise.disguisetypes.Disguise; import org.bukkit.entity.Entity; @@ -8,7 +7,6 @@ import org.bukkit.event.Cancellable; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; - public class UndisguiseEvent extends Event implements Cancellable { private static final HandlerList handlers = new HandlerList(); diff --git a/src/me/libraryaddict/disguise/utilities/DisguiseSound.java b/src/me/libraryaddict/disguise/utilities/DisguiseSound.java index be269b05..31afc31f 100644 --- a/src/me/libraryaddict/disguise/utilities/DisguiseSound.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseSound.java @@ -98,8 +98,8 @@ public enum DisguiseSound { WOLF("mob.wolf.hurt", "mob.wolf.step", "mob.wolf.death", "mob.wolf.bark", "mob.wolf.panting", "mob.wolf.whine", "mob.wolf.howl", "mob.wolf.growl", "mob.wolf.shake"), - ZOMBIE("mob.zombie.hurt", "mob.zombie.step", "mob.zombie.death", "mob.zombie.say", "mob.zombie.infect", "mob.zombie.woodbreak", - "mob.zombie.metal", "mob.zombie.wood"); + ZOMBIE("mob.zombie.hurt", "mob.zombie.step", "mob.zombie.death", "mob.zombie.say", "mob.zombie.infect", + "mob.zombie.woodbreak", "mob.zombie.metal", "mob.zombie.wood"); public enum SoundType { CANCEL, DEATH, HURT, IDLE, STEP; diff --git a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index 30697cf6..506b4869 100644 --- a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -204,8 +204,8 @@ public class DisguiseUtilities { try { Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(disguise.getEntity()); if (entityTrackerEntry != null) { - HashSet trackedPlayers = (HashSet) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers") - .get(entityTrackerEntry); + HashSet trackedPlayers = (HashSet) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get( + entityTrackerEntry); HashSet cloned = (HashSet) trackedPlayers.clone(); PacketContainer destroyPacket = new PacketContainer(PacketType.Play.Server.ENTITY_DESTROY); destroyPacket.getIntegerArrays().write(0, new int[] { disguise.getEntity().getEntityId() }); @@ -323,8 +323,8 @@ public class DisguiseUtilities { try { Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(disguise.getEntity()); if (entityTrackerEntry != null) { - HashSet trackedPlayers = (HashSet) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers") - .get(entityTrackerEntry); + HashSet trackedPlayers = (HashSet) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get( + entityTrackerEntry); for (Object p : trackedPlayers) { Player player = (Player) ReflectionManager.getBukkitEntity(p); if (((TargetedDisguise) disguise).canSee(player)) { @@ -460,8 +460,8 @@ public class DisguiseUtilities { try { Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(disguise.getEntity()); if (entityTrackerEntry != null) { - HashSet trackedPlayers = (HashSet) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers") - .get(entityTrackerEntry); + HashSet trackedPlayers = (HashSet) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get( + entityTrackerEntry); Method clear = ReflectionManager.getNmsMethod("EntityTrackerEntry", "clear", ReflectionManager.getNmsClass("EntityPlayer")); Method updatePlayer = ReflectionManager.getNmsMethod("EntityTrackerEntry", "updatePlayer", @@ -489,8 +489,8 @@ public class DisguiseUtilities { try { Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(entity); if (entityTrackerEntry != null) { - HashSet trackedPlayers = (HashSet) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers") - .get(entityTrackerEntry); + HashSet trackedPlayers = (HashSet) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get( + entityTrackerEntry); Method clear = ReflectionManager.getNmsMethod("EntityTrackerEntry", "clear", ReflectionManager.getNmsClass("EntityPlayer")); Method updatePlayer = ReflectionManager.getNmsMethod("EntityTrackerEntry", "updatePlayer", @@ -520,8 +520,8 @@ public class DisguiseUtilities { try { Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(disguise.getEntity()); if (entityTrackerEntry != null) { - HashSet trackedPlayers = (HashSet) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers") - .get(entityTrackerEntry); + HashSet trackedPlayers = (HashSet) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get( + entityTrackerEntry); Method clear = ReflectionManager.getNmsMethod("EntityTrackerEntry", "clear", ReflectionManager.getNmsClass("EntityPlayer")); Method updatePlayer = ReflectionManager.getNmsMethod("EntityTrackerEntry", "updatePlayer", @@ -582,8 +582,8 @@ public class DisguiseUtilities { try { Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(player); if (entityTrackerEntry != null) { - HashSet trackedPlayers = (HashSet) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers") - .get(entityTrackerEntry); + HashSet trackedPlayers = (HashSet) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get( + entityTrackerEntry); // If the tracker exists. Remove himself from his tracker trackedPlayers.remove(ReflectionManager.getNmsEntity(player)); } @@ -631,7 +631,8 @@ public class DisguiseUtilities { } int fakeId = selfDisguisesIds.get(player.getUniqueId()); // Add himself to his own entity tracker - ((HashSet) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(entityTrackerEntry)).add(ReflectionManager.getNmsEntity(player)); + ((HashSet) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(entityTrackerEntry)) + .add(ReflectionManager.getNmsEntity(player)); ProtocolManager manager = ProtocolLibrary.getProtocolManager(); // Send the player a packet with himself being spawned manager.sendServerPacket(player, manager.createPacketConstructor(PacketType.Play.Server.NAMED_ENTITY_SPAWN, player) diff --git a/src/me/libraryaddict/disguise/utilities/ReflectionManager.java b/src/me/libraryaddict/disguise/utilities/ReflectionManager.java index 3bf0c1de..f0b7858f 100644 --- a/src/me/libraryaddict/disguise/utilities/ReflectionManager.java +++ b/src/me/libraryaddict/disguise/utilities/ReflectionManager.java @@ -64,8 +64,10 @@ public class ReflectionManager { } private static final String bukkitVersion = Bukkit.getServer().getClass().getName().split("\\.")[3]; - private static final boolean isForge = Bukkit.getServer().getName().equalsIgnoreCase("Cauldron"); + private static final Class craftItemClass; + private static Method damageAndIdleSoundMethod; + private static final Field entitiesField; /** * Map of mc-dev simple class name to fully qualified Forge class name. */ @@ -74,26 +76,25 @@ public class ReflectionManager { * Map of Forge fully qualified class names to a map from mc-dev field names to Forge field names. */ private static Map> ForgeFieldMappings; + /** - * Map of Forge fully qualified class names to a map from mc-dev method names to a map from method signatures to Forge method names. + * Map of Forge fully qualified class names to a map from mc-dev method names to a map from method signatures to Forge method + * names. */ private static Map>> ForgeMethodMappings; - private static Map, String> primitiveTypes; + private static final Method ihmGet; + private static final boolean isForge = Bukkit.getServer().getName().equalsIgnoreCase("Cauldron"); + private static final Field pingField; + private static Map, String> primitiveTypes; + private static final Field trackerField; static { final String nameseg_class = "a-zA-Z0-9$_"; final String fqn_class = nameseg_class + "/"; - primitiveTypes = ImmutableMap., String>builder() - .put(boolean.class,"Z") - .put(byte.class, "B") - .put(char.class, "C") - .put(short.class, "S") - .put(int.class, "I") - .put(long.class, "J") - .put(float.class, "F") - .put(double.class, "D") - .put(void.class, "V").build(); + primitiveTypes = ImmutableMap., String> builder().put(boolean.class, "Z").put(byte.class, "B") + .put(char.class, "C").put(short.class, "S").put(int.class, "I").put(long.class, "J").put(float.class, "F") + .put(double.class, "D").put(void.class, "V").build(); if (isForge) { // Initialize the maps by reading the srg file @@ -107,12 +108,14 @@ public class ReflectionManager { // 1: cb-simpleName // 2: forge-fullName (Needs dir2fqn()) - Pattern classPattern = Pattern.compile("^CL: net/minecraft/server/([" + nameseg_class + "]+) ([" + fqn_class + "]+)$"); + Pattern classPattern = Pattern.compile("^CL: net/minecraft/server/([" + nameseg_class + "]+) ([" + fqn_class + + "]+)$"); // 1: cb-simpleName // 2: cb-fieldName // 3: forge-fullName (Needs dir2fqn()) // 4: forge-fieldName - Pattern fieldPattern = Pattern.compile("^FD: net/minecraft/server/([" + nameseg_class + "]+)/([" + nameseg_class + "]+) ([" + fqn_class + "]+)/([" + nameseg_class + "]+)$"); + Pattern fieldPattern = Pattern.compile("^FD: net/minecraft/server/([" + nameseg_class + "]+)/([" + nameseg_class + + "]+) ([" + fqn_class + "]+)/([" + nameseg_class + "]+)$"); // 1: cb-simpleName // 2: cb-methodName // 3: cb-signature-args @@ -121,8 +124,9 @@ public class ReflectionManager { // 6: forge-methodName // 7: forge-signature-args // 8: forge-signature-ret - Pattern methodPattern = Pattern.compile("^MD: net/minecraft/server/([" + fqn_class + "]+)/([" + nameseg_class + "]+) \\(([;\\[" + fqn_class + "]*)\\)([;\\[" + fqn_class + "]+) " + - "([" + fqn_class + "]+)/([" + nameseg_class + "]+) \\(([;\\[" + fqn_class + "]*)\\)([;\\[" + fqn_class + "]+)$"); + Pattern methodPattern = Pattern.compile("^MD: net/minecraft/server/([" + fqn_class + "]+)/([" + nameseg_class + + "]+) \\(([;\\[" + fqn_class + "]*)\\)([;\\[" + fqn_class + "]+) " + "([" + fqn_class + "]+)/([" + + nameseg_class + "]+) \\(([;\\[" + fqn_class + "]*)\\)([;\\[" + fqn_class + "]+)$"); String line; while ((line = reader.readLine()) != null) { @@ -169,21 +173,16 @@ public class ReflectionManager { System.out.println("[LibsDisguises] Loaded " + ForgeMethodMappings.size() + " Cauldron method mappings"); } catch (ClassNotFoundException e) { e.printStackTrace(); - System.err.println("Warning: Running on Cauldron server, but couldn't load mappings file. LibsDisguises will likely crash!"); + System.err + .println("Warning: Running on Cauldron server, but couldn't load mappings file. LibsDisguises will likely crash!"); } catch (IOException e) { e.printStackTrace(); - System.err.println("Warning: Running on Cauldron server, but couldn't load mappings file. LibsDisguises will likely crash!"); + System.err + .println("Warning: Running on Cauldron server, but couldn't load mappings file. LibsDisguises will likely crash!"); } } } - private static final Class craftItemClass; - private static final Field pingField; - private static final Field trackerField; - private static final Field entitiesField; - private static final Method ihmGet; - private static Method damageAndIdleSoundMethod; - static { for (Method method : getNmsClass("EntityLiving").getDeclaredMethods()) { try { @@ -213,12 +212,6 @@ public class ReflectionManager { DisguiseType.ARROW.isMisc(); } - private static String dir2fqn(String s) { - return s.replaceAll("/", "."); - } - - // === - public static Object createEntityInstance(String entityName) { try { Class entityClass = getNmsClass("Entity" + entityName); @@ -248,6 +241,12 @@ public class ReflectionManager { return null; } + // === + + private static String dir2fqn(String s) { + return s.replaceAll("/", "."); + } + public static FakeBoundingBox getBoundingBox(Entity entity) { try { Object boundingBox = getNmsField("Entity", "boundingBox").get(getNmsEntity(entity)); @@ -328,6 +327,13 @@ public class ReflectionManager { return null; } + static Object getEntityTrackerEntry(Entity target) throws Exception { + Object world = getWorld(target.getWorld()); + Object tracker = trackerField.get(world); + Object trackedEntities = entitiesField.get(tracker); + return ihmGet.invoke(trackedEntities, target.getEntityId()); + } + public static String getEnumArt(Art art) { try { Object enumArt = getCraftClass("CraftArt").getMethod("BukkitToNotch", Art.class).invoke(null, art); @@ -342,13 +348,6 @@ public class ReflectionManager { return null; } - static Object getEntityTrackerEntry(Entity target) throws Exception { - Object world = getWorld(target.getWorld()); - Object tracker = trackerField.get(world); - Object trackedEntities = entitiesField.get(tracker); - return ihmGet.invoke(trackedEntities, target.getEntityId()); - } - public static WrappedGameProfile getGameProfile(Player player) { if (LibVersion.is1_7()) { return WrappedGameProfile.fromPlayer(player); @@ -406,19 +405,6 @@ public class ReflectionManager { return null; } - public static Object getNmsItem(ItemStack itemstack) { - try { - return craftItemClass.getMethod("asNMSCopy", ItemStack.class).invoke(null, itemstack); - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - - public static Field getNmsField(String className, String fieldName) { - return getNmsField(getNmsClass(className), fieldName); - } - public static Field getNmsField(Class clazz, String fieldName) { if (isForge) { try { @@ -436,18 +422,17 @@ public class ReflectionManager { return null; } - public static Method getNmsMethod(String className, String methodName, Class... parameters) { - return getNmsMethod(getNmsClass(className), methodName, parameters); + public static Field getNmsField(String className, String fieldName) { + return getNmsField(getNmsClass(className), fieldName); } - private static String methodSignaturePart(Class param) { - if (param.isArray()) { - return "[" + methodSignaturePart(param.getComponentType()); - } else if (param.isPrimitive()) { - return primitiveTypes.get(param); - } else { - return "L" + param.getName().replaceAll("\\.", "/") + ";"; + public static Object getNmsItem(ItemStack itemstack) { + try { + return craftItemClass.getMethod("asNMSCopy", ItemStack.class).invoke(null, itemstack); + } catch (Exception e) { + e.printStackTrace(); } + return null; } public static Method getNmsMethod(Class clazz, String methodName, Class... parameters) { @@ -472,6 +457,10 @@ public class ReflectionManager { return null; } + public static Method getNmsMethod(String className, String methodName, Class... parameters) { + return getNmsMethod(getNmsClass(className), methodName, parameters); + } + public static double getPing(Player player) { try { return (double) pingField.getInt(ReflectionManager.getNmsEntity(player)); @@ -554,6 +543,16 @@ public class ReflectionManager { return !gameProfile.getProperties().isEmpty(); } + private static String methodSignaturePart(Class param) { + if (param.isArray()) { + return "[" + methodSignaturePart(param.getComponentType()); + } else if (param.isPrimitive()) { + return primitiveTypes.get(param); + } else { + return "L" + param.getName().replaceAll("\\.", "/") + ";"; + } + } + public static void setAllowSleep(Player player) { try { Object nmsEntity = getNmsEntity(player);