diff --git a/src/main/java/me/libraryaddict/disguise/DisguiseAPI.java b/src/main/java/me/libraryaddict/disguise/DisguiseAPI.java index 9f361ec0..25e4b97c 100644 --- a/src/main/java/me/libraryaddict/disguise/DisguiseAPI.java +++ b/src/main/java/me/libraryaddict/disguise/DisguiseAPI.java @@ -6,28 +6,23 @@ import com.comphenix.protocol.wrappers.WrappedWatchableObject; import lombok.Getter; import me.libraryaddict.disguise.disguisetypes.*; import me.libraryaddict.disguise.disguisetypes.TargetedDisguise.TargetType; -import me.libraryaddict.disguise.disguisetypes.watchers.AbstractHorseWatcher; -import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; import me.libraryaddict.disguise.utilities.DisguiseUtilities; import me.libraryaddict.disguise.utilities.parser.DisguiseParseException; import me.libraryaddict.disguise.utilities.parser.DisguiseParser; import me.libraryaddict.disguise.utilities.parser.DisguisePerm; import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; -import org.bukkit.DyeColor; import org.bukkit.Material; import org.bukkit.command.CommandSender; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.entity.*; +import org.bukkit.entity.Entity; +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 java.io.File; import java.io.IOException; -import java.lang.reflect.Method; import java.util.Arrays; import java.util.Collection; import java.util.List; diff --git a/src/main/java/me/libraryaddict/disguise/DisguiseConfig.java b/src/main/java/me/libraryaddict/disguise/DisguiseConfig.java index b0e06ac9..58597d19 100644 --- a/src/main/java/me/libraryaddict/disguise/DisguiseConfig.java +++ b/src/main/java/me/libraryaddict/disguise/DisguiseConfig.java @@ -18,7 +18,6 @@ import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; import me.libraryaddict.disguise.utilities.translations.LibsMsg; import me.libraryaddict.disguise.utilities.translations.TranslateType; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.NamespacedKey; import org.bukkit.boss.BarColor; import org.bukkit.boss.BarStyle; @@ -31,7 +30,6 @@ import org.bukkit.permissions.PermissionDefault; import org.bukkit.scheduler.BukkitTask; import java.io.*; -import java.lang.reflect.InvocationTargetException; import java.util.*; import java.util.Map.Entry; import java.util.concurrent.TimeUnit; @@ -462,7 +460,7 @@ public class DisguiseConfig { try { return new HashMap.SimpleEntry(entry.getKey(), DisguiseParser.parseDisguise(entry.getValue())); - } catch (IllegalAccessException | InvocationTargetException | DisguiseParseException e) { + } catch (Throwable e) { DisguiseUtilities.getLogger().warning("Error when attempting to grab the custom disguise " + disguise); e.printStackTrace(); } @@ -470,8 +468,7 @@ public class DisguiseConfig { return null; } - public static Entry getCustomDisguise(Entity target, String disguise) - throws IllegalAccessException, DisguiseParseException, InvocationTargetException { + public static Entry getCustomDisguise(Entity target, String disguise) throws Throwable { if (!Bukkit.isPrimaryThread()) { throw new IllegalStateException("Custom Disguises should not be called async!"); } @@ -485,8 +482,7 @@ public class DisguiseConfig { return new HashMap.SimpleEntry(entry.getKey(), DisguiseParser.parseDisguise(Bukkit.getConsoleSender(), target, entry.getValue())); } - public static Entry getCustomDisguise(CommandSender invoker, Entity target, String disguise) - throws IllegalAccessException, DisguiseParseException, InvocationTargetException { + public static Entry getCustomDisguise(CommandSender invoker, Entity target, String disguise) throws Throwable { if (!Bukkit.isPrimaryThread()) { throw new IllegalStateException("Custom Disguises should not be called async!"); } @@ -946,7 +942,7 @@ public class DisguiseConfig { DisguiseUtilities.getLogger().info("Loaded custom disguise " + disguiseName); } catch (DisguiseParseException e) { throw new DisguiseParseException(LibsMsg.ERROR_LOADING_CUSTOM_DISGUISE, disguiseName, (e.getMessage() == null ? "" : ": " + e.getMessage())); - } catch (IllegalAccessException | InvocationTargetException e) { + } catch (Throwable e) { e.printStackTrace(); throw new DisguiseParseException(LibsMsg.ERROR_LOADING_CUSTOM_DISGUISE, disguiseName, ""); } diff --git a/src/main/java/me/libraryaddict/disguise/LibsDisguises.java b/src/main/java/me/libraryaddict/disguise/LibsDisguises.java index b4e6ee67..4100acb8 100644 --- a/src/main/java/me/libraryaddict/disguise/LibsDisguises.java +++ b/src/main/java/me/libraryaddict/disguise/LibsDisguises.java @@ -27,14 +27,12 @@ import me.libraryaddict.disguise.utilities.packets.PacketsManager; import me.libraryaddict.disguise.utilities.parser.DisguiseParser; import me.libraryaddict.disguise.utilities.reflection.NmsVersion; import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; -import me.libraryaddict.disguise.utilities.reflection.asm.WatcherSanitizer; import me.libraryaddict.disguise.utilities.sounds.SoundManager; import me.libraryaddict.disguise.utilities.updates.UpdateChecker; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.command.*; import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.scheduler.BukkitRunnable; @@ -67,8 +65,6 @@ public class LibsDisguises extends JavaPlugin { instance = this; - WatcherSanitizer.init(); - Plugin plugin = Bukkit.getPluginManager().getPlugin("ProtocolLib"); if (plugin == null || DisguiseUtilities.isOlderThan(DisguiseUtilities.getProtocolLibRequiredVersion(), plugin.getDescription().getVersion())) { diff --git a/src/main/java/me/libraryaddict/disguise/commands/DisguiseBaseCommand.java b/src/main/java/me/libraryaddict/disguise/commands/DisguiseBaseCommand.java index ebd19945..7bb936b8 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/DisguiseBaseCommand.java +++ b/src/main/java/me/libraryaddict/disguise/commands/DisguiseBaseCommand.java @@ -18,6 +18,7 @@ import me.libraryaddict.disguise.utilities.params.ParamInfoManager; import me.libraryaddict.disguise.utilities.parser.DisguiseParser; import me.libraryaddict.disguise.utilities.parser.DisguisePerm; import me.libraryaddict.disguise.utilities.parser.DisguisePermissions; +import me.libraryaddict.disguise.utilities.parser.WatcherMethod; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.CommandExecutor; @@ -25,7 +26,6 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import java.lang.reflect.Method; import java.util.*; /** @@ -118,11 +118,11 @@ public abstract class DisguiseBaseCommand implements CommandExecutor { DisguisePerm disguisePerm, String[] allArgs, int startsAt, String currentArg) { ArrayList usedOptions = new ArrayList<>(); - Method[] methods = ParamInfoManager.getDisguiseWatcherMethods(disguisePerm.getWatcherClass()); + WatcherMethod[] methods = ParamInfoManager.getDisguiseWatcherMethods(disguisePerm.getWatcherClass()); // Find which methods the disguiser has already used for (int i = startsAt; i < allArgs.length; i++) { - for (Method method : methods) { + for (WatcherMethod method : methods) { String arg = allArgs[i]; if (!method.getName().equalsIgnoreCase(arg)) { @@ -186,7 +186,7 @@ public abstract class DisguiseBaseCommand implements CommandExecutor { if (addMethods) { // If this is a method, add. Else if it can be a param of the previous argument, add. - for (Method method : ParamInfoManager.getDisguiseWatcherMethods(disguisePerm.getWatcherClass())) { + for (WatcherMethod method : ParamInfoManager.getDisguiseWatcherMethods(disguisePerm.getWatcherClass())) { if (!perms.isAllowedDisguise(disguisePerm, Collections.singletonList(method.getName()))) { continue; } diff --git a/src/main/java/me/libraryaddict/disguise/commands/disguise/DisguiseCommand.java b/src/main/java/me/libraryaddict/disguise/commands/disguise/DisguiseCommand.java index abb5ff7c..e590c993 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/disguise/DisguiseCommand.java +++ b/src/main/java/me/libraryaddict/disguise/commands/disguise/DisguiseCommand.java @@ -50,7 +50,7 @@ public class DisguiseCommand extends DisguiseBaseCommand implements TabCompleter return true; } - catch (Exception ex) { + catch (Throwable ex) { ex.printStackTrace(); return true; } diff --git a/src/main/java/me/libraryaddict/disguise/commands/disguise/DisguiseEntityCommand.java b/src/main/java/me/libraryaddict/disguise/commands/disguise/DisguiseEntityCommand.java index b333b510..a1cb193f 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/disguise/DisguiseEntityCommand.java +++ b/src/main/java/me/libraryaddict/disguise/commands/disguise/DisguiseEntityCommand.java @@ -16,7 +16,6 @@ import org.bukkit.command.CommandSender; import org.bukkit.command.TabCompleter; import org.bukkit.entity.Player; -import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; @@ -46,27 +45,22 @@ public class DisguiseEntityCommand extends DisguiseBaseCommand implements TabCom Disguise testDisguise; try { - testDisguise = DisguiseParser - .parseTestDisguise(sender, getPermNode(), disguiseArgs, getPermissions(sender)); - } - catch (DisguiseParseException ex) { + testDisguise = DisguiseParser.parseTestDisguise(sender, getPermNode(), disguiseArgs, getPermissions(sender)); + } catch (DisguiseParseException ex) { if (ex.getMessage() != null) { DisguiseUtilities.sendMessage(sender, ex.getMessage()); } return true; - } - catch (IllegalAccessException | InvocationTargetException ex) { + } catch (Throwable ex) { ex.printStackTrace(); return true; } LibsDisguises.getInstance().getListener() - .addInteraction(sender.getName(), new DisguiseEntityInteraction(disguiseArgs), - DisguiseConfig.getDisguiseEntityExpire()); + .addInteraction(sender.getName(), new DisguiseEntityInteraction(disguiseArgs), DisguiseConfig.getDisguiseEntityExpire()); - LibsMsg.DISG_ENT_CLICK.send(sender, DisguiseConfig.getDisguiseEntityExpire(), - testDisguise.getDisguiseName()); + LibsMsg.DISG_ENT_CLICK.send(sender, DisguiseConfig.getDisguiseEntityExpire(), testDisguise.getDisguiseName()); return true; } @@ -98,8 +92,7 @@ public class DisguiseEntityCommand extends DisguiseBaseCommand implements TabCom } LibsMsg.DISG_ENT_HELP1.send(sender); - LibsMsg.CAN_USE_DISGS.send(sender, - StringUtils.join(allowedDisguises, LibsMsg.CAN_USE_DISGS_SEPERATOR.get())); + LibsMsg.CAN_USE_DISGS.send(sender, StringUtils.join(allowedDisguises, LibsMsg.CAN_USE_DISGS_SEPERATOR.get())); if (allowedDisguises.contains("player")) { LibsMsg.DISG_ENT_HELP3.send(sender); diff --git a/src/main/java/me/libraryaddict/disguise/commands/disguise/DisguisePlayerCommand.java b/src/main/java/me/libraryaddict/disguise/commands/disguise/DisguisePlayerCommand.java index b71aefac..e8f92110 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/disguise/DisguisePlayerCommand.java +++ b/src/main/java/me/libraryaddict/disguise/commands/disguise/DisguisePlayerCommand.java @@ -54,8 +54,7 @@ public class DisguisePlayerCommand extends DisguiseBaseCommand implements TabCom if (args[0].contains("-")) { try { entityTarget = Bukkit.getEntity(UUID.fromString(args[0])); - } - catch (Exception ignored) { + } catch (Exception ignored) { } } } @@ -76,17 +75,13 @@ public class DisguisePlayerCommand extends DisguiseBaseCommand implements TabCom Disguise disguise; try { - disguise = DisguiseParser.parseDisguise(sender, entityTarget, getPermNode(), - DisguiseUtilities.split(StringUtils.join(newArgs, " ")), permissions); - } - catch (DisguiseParseException ex) { + disguise = DisguiseParser.parseDisguise(sender, entityTarget, getPermNode(), DisguiseUtilities.split(StringUtils.join(newArgs, " ")), permissions); + } catch (DisguiseParseException ex) { if (ex.getMessage() != null) { DisguiseUtilities.sendMessage(sender, ex.getMessage()); } return true; - } - - catch (Exception ex) { + } catch (Throwable ex) { ex.printStackTrace(); return true; } @@ -96,8 +91,7 @@ public class DisguisePlayerCommand extends DisguiseBaseCommand implements TabCom return true; } - if (DisguiseConfig.isNameOfPlayerShownAboveDisguise() && - !entityTarget.hasPermission("libsdisguises.hidename")) { + if (DisguiseConfig.isNameOfPlayerShownAboveDisguise() && !entityTarget.hasPermission("libsdisguises.hidename")) { if (disguise.getWatcher() instanceof LivingWatcher) { disguise.getWatcher().setCustomName(getDisplayName(entityTarget)); @@ -111,9 +105,9 @@ public class DisguisePlayerCommand extends DisguiseBaseCommand implements TabCom if (!setViewDisguise(args)) { // They prefer to have the opposite of whatever the view disguises option is - if (DisguiseAPI.hasSelfDisguisePreference(disguise.getEntity()) && - disguise.isSelfDisguiseVisible() == DisguiseConfig.isViewDisguises()) + if (DisguiseAPI.hasSelfDisguisePreference(disguise.getEntity()) && disguise.isSelfDisguiseVisible() == DisguiseConfig.isViewDisguises()) { disguise.setViewSelfDisguise(!disguise.isSelfDisguiseVisible()); + } } if (!DisguiseAPI.isActionBarShown(disguise.getEntity())) { @@ -123,13 +117,12 @@ public class DisguisePlayerCommand extends DisguiseBaseCommand implements TabCom disguise.startDisguise(sender); if (disguise.isDisguiseInUse()) { - LibsMsg.DISG_PLAYER_AS_DISG.send(sender, - entityTarget instanceof Player ? entityTarget.getName() : - DisguiseType.getType(entityTarget).toReadable(), disguise.getDisguiseName()); + LibsMsg.DISG_PLAYER_AS_DISG.send(sender, entityTarget instanceof Player ? entityTarget.getName() : DisguiseType.getType(entityTarget).toReadable(), + disguise.getDisguiseName()); } else { - LibsMsg.DISG_PLAYER_AS_DISG_FAIL.send(sender, - entityTarget instanceof Player ? entityTarget.getName() : - DisguiseType.getType(entityTarget).toReadable(), disguise.getDisguiseName()); + LibsMsg.DISG_PLAYER_AS_DISG_FAIL + .send(sender, entityTarget instanceof Player ? entityTarget.getName() : DisguiseType.getType(entityTarget).toReadable(), + disguise.getDisguiseName()); } return true; @@ -137,8 +130,9 @@ public class DisguisePlayerCommand extends DisguiseBaseCommand implements TabCom private boolean setViewDisguise(String[] strings) { for (String string : strings) { - if (!string.equalsIgnoreCase("setSelfDisguiseVisible")) + if (!string.equalsIgnoreCase("setSelfDisguiseVisible")) { continue; + } return true; } @@ -182,8 +176,7 @@ public class DisguisePlayerCommand extends DisguiseBaseCommand implements TabCom } LibsMsg.D_HELP1.send(sender); - LibsMsg.CAN_USE_DISGS.send(sender, - StringUtils.join(allowedDisguises, LibsMsg.CAN_USE_DISGS_SEPERATOR.get())); + LibsMsg.CAN_USE_DISGS.send(sender, StringUtils.join(allowedDisguises, LibsMsg.CAN_USE_DISGS_SEPERATOR.get())); if (allowedDisguises.contains("player")) { LibsMsg.D_HELP3.send(sender); diff --git a/src/main/java/me/libraryaddict/disguise/commands/disguise/DisguiseRadiusCommand.java b/src/main/java/me/libraryaddict/disguise/commands/disguise/DisguiseRadiusCommand.java index 920e6f4a..37a01717 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/disguise/DisguiseRadiusCommand.java +++ b/src/main/java/me/libraryaddict/disguise/commands/disguise/DisguiseRadiusCommand.java @@ -66,8 +66,7 @@ public class DisguiseRadiusCommand extends DisguiseBaseCommand implements TabCom return true; } - if (args[0].equalsIgnoreCase(TranslateType.DISGUISES.get("EntityType")) || - args[0].equalsIgnoreCase(TranslateType.DISGUISES.get("EntityType") + "s")) { + if (args[0].equalsIgnoreCase(TranslateType.DISGUISES.get("EntityType")) || args[0].equalsIgnoreCase(TranslateType.DISGUISES.get("EntityType") + "s")) { ArrayList classes = new ArrayList<>(); for (Class c : validClasses) { @@ -76,8 +75,7 @@ public class DisguiseRadiusCommand extends DisguiseBaseCommand implements TabCom Collections.sort(classes); - LibsMsg.DRADIUS_ENTITIES.send(sender, - ChatColor.GREEN + StringUtils.join(classes, ChatColor.DARK_GREEN + ", " + ChatColor.GREEN)); + LibsMsg.DRADIUS_ENTITIES.send(sender, ChatColor.GREEN + StringUtils.join(classes, ChatColor.DARK_GREEN + ", " + ChatColor.GREEN)); return true; } @@ -97,8 +95,7 @@ public class DisguiseRadiusCommand extends DisguiseBaseCommand implements TabCom if (starting == 0) { try { type = EntityType.valueOf(args[0].toUpperCase(Locale.ENGLISH)); - } - catch (Exception ignored) { + } catch (Exception ignored) { } if (type == null) { @@ -168,17 +165,14 @@ public class DisguiseRadiusCommand extends DisguiseBaseCommand implements TabCom continue; } - if (testDisguise.isMiscDisguise() && !DisguiseConfig.isMiscDisguisesForLivingEnabled() && - entity instanceof LivingEntity) { + if (testDisguise.isMiscDisguise() && !DisguiseConfig.isMiscDisguisesForLivingEnabled() && entity instanceof LivingEntity) { miscDisguises++; continue; } - Disguise disguise = DisguiseParser - .parseDisguise(sender, entity, getPermNode(), disguiseArgs, permissions); + Disguise disguise = DisguiseParser.parseDisguise(sender, entity, getPermNode(), disguiseArgs, permissions); - if (entity instanceof Player && DisguiseConfig.isNameOfPlayerShownAboveDisguise() && - !entity.hasPermission("libsdisguises.hidename")) { + if (entity instanceof Player && DisguiseConfig.isNameOfPlayerShownAboveDisguise() && !entity.hasPermission("libsdisguises.hidename")) { if (disguise.getWatcher() instanceof LivingWatcher) { disguise.getWatcher().setCustomName(getDisplayName(entity)); if (DisguiseConfig.isNameAboveHeadAlwaysVisible()) { @@ -191,9 +185,9 @@ public class DisguiseRadiusCommand extends DisguiseBaseCommand implements TabCom if (!setViewDisguise(args)) { // They prefer to have the opposite of whatever the view disguises option is - if (DisguiseAPI.hasSelfDisguisePreference(disguise.getEntity()) && - disguise.isSelfDisguiseVisible() == DisguiseConfig.isViewDisguises()) + if (DisguiseAPI.hasSelfDisguisePreference(disguise.getEntity()) && disguise.isSelfDisguiseVisible() == DisguiseConfig.isViewDisguises()) { disguise.setViewSelfDisguise(!disguise.isSelfDisguiseVisible()); + } } if (!DisguiseAPI.isActionBarShown(disguise.getEntity())) { @@ -216,13 +210,11 @@ public class DisguiseRadiusCommand extends DisguiseBaseCommand implements TabCom if (miscDisguises > 0) { LibsMsg.DRADIUS_MISCDISG.send(sender, miscDisguises); } - } - catch (DisguiseParseException ex) { + } catch (DisguiseParseException ex) { if (ex.getMessage() != null) { DisguiseUtilities.sendMessage(sender, ex.getMessage()); } - } - catch (Exception ex) { + } catch (Throwable ex) { ex.printStackTrace(); } @@ -231,8 +223,9 @@ public class DisguiseRadiusCommand extends DisguiseBaseCommand implements TabCom private boolean setViewDisguise(String[] strings) { for (String string : strings) { - if (!string.equalsIgnoreCase("setSelfDisguiseVisible")) + if (!string.equalsIgnoreCase("setSelfDisguiseVisible")) { continue; + } return true; } @@ -259,16 +252,18 @@ public class DisguiseRadiusCommand extends DisguiseBaseCommand implements TabCom if (!isInteger(args[0])) { for (Class c : validClasses) { - if (!TranslateType.DISGUISES.get(c.getSimpleName()).equalsIgnoreCase(args[0])) + if (!TranslateType.DISGUISES.get(c.getSimpleName()).equalsIgnoreCase(args[0])) { continue; + } starting = 2; break; } // Not a valid radius - if (starting == 1 || args.length == 1 || !isInteger(args[1])) + if (starting == 1 || args.length == 1 || !isInteger(args[1])) { return filterTabs(tabs, origArgs); + } } tabs.addAll(getTabDisguiseTypes(sender, perms, args, starting, getCurrentArg(origArgs))); diff --git a/src/main/java/me/libraryaddict/disguise/commands/interactions/DisguiseEntityInteraction.java b/src/main/java/me/libraryaddict/disguise/commands/interactions/DisguiseEntityInteraction.java index 138cfb29..4da3c2cb 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/interactions/DisguiseEntityInteraction.java +++ b/src/main/java/me/libraryaddict/disguise/commands/interactions/DisguiseEntityInteraction.java @@ -11,7 +11,6 @@ import me.libraryaddict.disguise.utilities.LibsEntityInteract; import me.libraryaddict.disguise.utilities.parser.DisguiseParseException; import me.libraryaddict.disguise.utilities.parser.DisguiseParser; import me.libraryaddict.disguise.utilities.translations.LibsMsg; -import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; @@ -37,25 +36,22 @@ public class DisguiseEntityInteraction implements LibsEntityInteract { Disguise disguise; try { - disguise = DisguiseParser.parseDisguise(p, entity, "disguiseentity", disguiseArgs, - DisguiseParser.getPermissions(p, "disguiseentity")); + disguise = DisguiseParser.parseDisguise(p, entity, "disguiseentity", disguiseArgs, DisguiseParser.getPermissions(p, "disguiseentity")); } catch (DisguiseParseException e) { if (e.getMessage() != null) { DisguiseUtilities.sendMessage(p, e.getMessage()); } return; - } catch (Exception e) { + } catch (Throwable e) { e.printStackTrace(); return; } - if (disguise.isMiscDisguise() && !DisguiseConfig.isMiscDisguisesForLivingEnabled() && - entity instanceof LivingEntity) { + if (disguise.isMiscDisguise() && !DisguiseConfig.isMiscDisguisesForLivingEnabled() && entity instanceof LivingEntity) { LibsMsg.DISABLED_LIVING_TO_MISC.send(p); } else { - if (entity instanceof Player && DisguiseConfig.isNameOfPlayerShownAboveDisguise() && - !entity.hasPermission("libsdisguises.hidename")) { + if (entity instanceof Player && DisguiseConfig.isNameOfPlayerShownAboveDisguise() && !entity.hasPermission("libsdisguises.hidename")) { if (disguise.getWatcher() instanceof LivingWatcher) { disguise.getWatcher().setCustomName(getDisplayName(entity)); diff --git a/src/main/java/me/libraryaddict/disguise/commands/interactions/DisguiseModifyInteraction.java b/src/main/java/me/libraryaddict/disguise/commands/interactions/DisguiseModifyInteraction.java index cfc25361..75bb9ca0 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/interactions/DisguiseModifyInteraction.java +++ b/src/main/java/me/libraryaddict/disguise/commands/interactions/DisguiseModifyInteraction.java @@ -53,17 +53,13 @@ public class DisguiseModifyInteraction implements LibsEntityInteract { } try { - DisguiseParser - .callMethods(p, disguise, perms, disguisePerm, new ArrayList<>(Arrays.asList(options)), options, - "DisguiseModifyEntity"); + DisguiseParser.callMethods(p, disguise, perms, disguisePerm, new ArrayList<>(Arrays.asList(options)), options, "DisguiseModifyEntity"); LibsMsg.LISTENER_MODIFIED_DISG.send(p); - } - catch (DisguiseParseException ex) { + } catch (DisguiseParseException ex) { if (ex.getMessage() != null) { DisguiseUtilities.sendMessage(p, ex.getMessage()); } - } - catch (Exception ex) { + } catch (Throwable ex) { ex.printStackTrace(); } } diff --git a/src/main/java/me/libraryaddict/disguise/commands/modify/DisguiseModifyCommand.java b/src/main/java/me/libraryaddict/disguise/commands/modify/DisguiseModifyCommand.java index 3ff2fab9..83a68bc0 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/modify/DisguiseModifyCommand.java +++ b/src/main/java/me/libraryaddict/disguise/commands/modify/DisguiseModifyCommand.java @@ -68,7 +68,7 @@ public class DisguiseModifyCommand extends DisguiseBaseCommand implements TabCom return true; } - catch (Exception ex) { + catch (Throwable ex) { ex.printStackTrace(); return true; } diff --git a/src/main/java/me/libraryaddict/disguise/commands/modify/DisguiseModifyPlayerCommand.java b/src/main/java/me/libraryaddict/disguise/commands/modify/DisguiseModifyPlayerCommand.java index 666a9a56..fe036732 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/modify/DisguiseModifyPlayerCommand.java +++ b/src/main/java/me/libraryaddict/disguise/commands/modify/DisguiseModifyPlayerCommand.java @@ -97,7 +97,7 @@ public class DisguiseModifyPlayerCommand extends DisguiseBaseCommand implements return true; } - catch (Exception ex) { + catch (Throwable ex) { ex.printStackTrace(); return true; } diff --git a/src/main/java/me/libraryaddict/disguise/commands/modify/DisguiseModifyRadiusCommand.java b/src/main/java/me/libraryaddict/disguise/commands/modify/DisguiseModifyRadiusCommand.java index 22bad4df..638cee49 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/modify/DisguiseModifyRadiusCommand.java +++ b/src/main/java/me/libraryaddict/disguise/commands/modify/DisguiseModifyRadiusCommand.java @@ -7,10 +7,7 @@ import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.DisguiseType; import me.libraryaddict.disguise.utilities.DisguiseUtilities; import me.libraryaddict.disguise.utilities.params.ParamInfoManager; -import me.libraryaddict.disguise.utilities.parser.DisguiseParseException; -import me.libraryaddict.disguise.utilities.parser.DisguiseParser; -import me.libraryaddict.disguise.utilities.parser.DisguisePerm; -import me.libraryaddict.disguise.utilities.parser.DisguisePermissions; +import me.libraryaddict.disguise.utilities.parser.*; import me.libraryaddict.disguise.utilities.translations.LibsMsg; import me.libraryaddict.disguise.utilities.translations.TranslateType; import org.apache.commons.lang.StringUtils; @@ -23,7 +20,6 @@ import org.bukkit.command.TabCompleter; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; -import java.lang.reflect.Method; import java.util.*; public class DisguiseModifyRadiusCommand extends DisguiseBaseCommand implements TabCompleter { @@ -177,7 +173,7 @@ public class DisguiseModifyRadiusCommand extends DisguiseBaseCommand implements } return true; - } catch (Exception ex) { + } catch (Throwable ex) { ex.printStackTrace(); return true; } @@ -259,7 +255,7 @@ public class DisguiseModifyRadiusCommand extends DisguiseBaseCommand implements DisguiseType disguiseType = disguise.getType(); - for (Method method : ParamInfoManager.getDisguiseWatcherMethods(disguiseType.getWatcherClass())) { + for (WatcherMethod method : ParamInfoManager.getDisguiseWatcherMethods(disguiseType.getWatcherClass())) { for (String arg : args) { if (!method.getName().equalsIgnoreCase(arg) || usedOptions.contains(arg)) { continue; diff --git a/src/main/java/me/libraryaddict/disguise/commands/utils/DisguiseHelpCommand.java b/src/main/java/me/libraryaddict/disguise/commands/utils/DisguiseHelpCommand.java index f34883d3..60b9a14a 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/utils/DisguiseHelpCommand.java +++ b/src/main/java/me/libraryaddict/disguise/commands/utils/DisguiseHelpCommand.java @@ -6,6 +6,7 @@ import me.libraryaddict.disguise.utilities.params.ParamInfoManager; import me.libraryaddict.disguise.utilities.parser.DisguiseParser; import me.libraryaddict.disguise.utilities.parser.DisguisePerm; import me.libraryaddict.disguise.utilities.parser.DisguisePermissions; +import me.libraryaddict.disguise.utilities.parser.WatcherMethod; import me.libraryaddict.disguise.utilities.translations.LibsMsg; import me.libraryaddict.disguise.utilities.translations.TranslateType; import org.apache.commons.lang.StringUtils; @@ -14,7 +15,6 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabCompleter; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -79,7 +79,7 @@ public class DisguiseHelpCommand extends DisguiseBaseCommand implements TabCompl int ignored = 0; try { - for (Method method : ParamInfoManager.getDisguiseWatcherMethods(watcher)) { + for (WatcherMethod method : ParamInfoManager.getDisguiseWatcherMethods(watcher)) { if (args.length < 2 || !args[1].equalsIgnoreCase(LibsMsg.DHELP_SHOW.get())) { if (!perms.isAllowedDisguise(type, Collections.singleton(method.getName().toLowerCase( Locale.ENGLISH)))) { diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/Disguise.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/Disguise.java index 0a6611e1..cc13bfd8 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/Disguise.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/Disguise.java @@ -262,7 +262,7 @@ public abstract class Disguise { } catch (Exception e) { e.printStackTrace(); } - } else { + } else if (getWatcher().getDisguise() != this) { getWatcher().setDisguise((TargetedDisguise) this); } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java index 83c54653..6326df78 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java @@ -586,11 +586,16 @@ public class FlagWatcher { } } - protected TargetedDisguise getDisguise() { + public TargetedDisguise getDisguise() { return disguise; } - protected void setDisguise(TargetedDisguise disguise) { + @Deprecated + public void setDisguise(TargetedDisguise disguise) { + if (this.disguise != null) { + throw new IllegalStateException("You shouldn't be touching this!"); + } + this.disguise = disguise; equipment.setFlagWatcher(this); diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java index d849d449..d7ce862f 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java @@ -19,7 +19,6 @@ import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; import java.lang.reflect.InvocationTargetException; -import java.util.UUID; public class PlayerDisguise extends TargetedDisguise { private transient LibsProfileLookup currentLookup; diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.java index 4700f883..c0f70a88 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.java @@ -4,7 +4,6 @@ import com.comphenix.protocol.PacketType; import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.reflect.StructureModifier; -import lombok.Getter; import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.FlagWatcher; diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/IronGolemWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/IronGolemWatcher.java index 7b26f052..8c4a619d 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/IronGolemWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/IronGolemWatcher.java @@ -1,6 +1,5 @@ package me.libraryaddict.disguise.disguisetypes.watchers; -import lombok.Getter; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.GolemCrack; import me.libraryaddict.disguise.utilities.reflection.NmsAddedIn; diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/LivingWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/LivingWatcher.java index ff3254ae..dd6a38c8 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/LivingWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/LivingWatcher.java @@ -11,7 +11,6 @@ import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.FlagWatcher; import me.libraryaddict.disguise.disguisetypes.MetaIndex; import me.libraryaddict.disguise.utilities.DisguiseUtilities; -import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue; import me.libraryaddict.disguise.utilities.reflection.NmsAddedIn; import me.libraryaddict.disguise.utilities.reflection.NmsVersion; import org.bukkit.Color; diff --git a/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index 2e02a12d..eb4bb2d1 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -18,7 +18,6 @@ import lombok.Getter; import lombok.Setter; import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.DisguiseConfig; -import me.libraryaddict.disguise.DisguiseConfig.DisguisePushing; import me.libraryaddict.disguise.LibsDisguises; import me.libraryaddict.disguise.disguisetypes.*; import me.libraryaddict.disguise.disguisetypes.TargetedDisguise.TargetType; @@ -29,6 +28,7 @@ import me.libraryaddict.disguise.utilities.json.*; import me.libraryaddict.disguise.utilities.mineskin.MineSkinAPI; import me.libraryaddict.disguise.utilities.packets.LibsPackets; import me.libraryaddict.disguise.utilities.packets.PacketsManager; +import me.libraryaddict.disguise.utilities.parser.DisguiseParser; import me.libraryaddict.disguise.utilities.reflection.FakeBoundingBox; import me.libraryaddict.disguise.utilities.reflection.LibsProfileLookup; import me.libraryaddict.disguise.utilities.reflection.NmsVersion; @@ -194,6 +194,25 @@ public class DisguiseUtilities { private static long lastSavedPreferences; @Getter private final static ConcurrentHashMap teams = new ConcurrentHashMap<>(); + private final static boolean java16; + private static boolean criedOverJava16; + + static { + final Matcher matcher = Pattern.compile("(?:1\\.)?(\\d+)").matcher(System.getProperty("java.version")); + + if (!matcher.find()) { + java16 = true; + } else { + int vers = 16; + + try { + vers = Integer.parseInt(matcher.group(1)); + } catch (NumberFormatException ignored) { + } + + java16 = vers >= 16; + } + } /** * Only allow saves every 2 minutes @@ -607,19 +626,19 @@ public class DisguiseUtilities { disguiseFile.delete(); } } else { - Disguise[] disguises = new Disguise[disguise.length]; - - for (int i = 0; i < disguise.length; i++) { - Disguise dis = disguise[i].clone(); - dis.setEntity(null); - - disguises[i] = dis; - } // I hear pirates don't obey standards @SuppressWarnings("MismatchedStringCase") PrintWriter writer = new PrintWriter(disguiseFile, "12345".equals("%%__USER__%%") ? "US-ASCII" : "UTF-8"); - writer.write(gson.toJson(disguises)); + + for (int i = 0; i < disguise.length; i++) { + writer.write(DisguiseParser.parseToString(disguise[i])); + + if (i + 1 < disguise.length) { + writer.write("\n"); + } + } + writer.close(); savedDisguiseList.add(owningEntity); @@ -662,14 +681,36 @@ public class DisguiseUtilities { removeSavedDisguise(entityUUID); } - Disguise[] disguises = gson.fromJson(cached, Disguise[].class); + Disguise[] disguises; + + if (cached.isEmpty()) { + return new Disguise[0]; + } + + if (Character.isAlphabetic(cached.charAt(0))) { + String[] spl = cached.split("\n"); + disguises = new Disguise[spl.length]; + + for (int i = 0; i < disguises.length; i++) { + disguises[i] = DisguiseParser.parseDisguise(spl[i]); + } + } else if (!java16) { + disguises = gson.fromJson(cached, Disguise[].class); + } else { + if (!criedOverJava16) { + criedOverJava16 = true; + getLogger().warning("Failed to load a disguise using old format, this is due to Java 16 breaking stuff. This error will only print once."); + } + + return new Disguise[0]; + } if (disguises == null) { return new Disguise[0]; } return disguises; - } catch (Exception e) { + } catch (Throwable e) { getLogger().severe("Malformed disguise for " + entityUUID); e.printStackTrace(); } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/json/SerializerDisguise.java b/src/main/java/me/libraryaddict/disguise/utilities/json/SerializerDisguise.java index 135d5ffa..4a72c2fd 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/json/SerializerDisguise.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/json/SerializerDisguise.java @@ -3,18 +3,19 @@ package me.libraryaddict.disguise.utilities.json; import com.google.gson.*; import me.libraryaddict.disguise.disguisetypes.*; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; import java.lang.reflect.Method; import java.lang.reflect.Type; /** * Created by libraryaddict on 1/06/2017. */ -public class SerializerDisguise implements JsonDeserializer, JsonSerializer, - InstanceCreator { +public class SerializerDisguise implements JsonDeserializer, JsonSerializer, InstanceCreator { @Override - public Disguise deserialize(JsonElement json, Type typeOfT, - JsonDeserializationContext context) throws JsonParseException { + public Disguise deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { JsonObject obj = (JsonObject) json; DisguiseType type = DisguiseType.valueOf(obj.get("disguiseType").getAsString()); TargetedDisguise disg; @@ -25,29 +26,24 @@ public class SerializerDisguise implements JsonDeserializer, JsonSeria disg = context.deserialize(json, MobDisguise.class); } else if (type.isMisc()) { disg = context.deserialize(json, MiscDisguise.class); - } else + } else { return null; + } - try { - Method method = FlagWatcher.class.getDeclaredMethod("setDisguise", TargetedDisguise.class); - method.setAccessible(true); - method.invoke(disg.getWatcher(), disg); - } - catch (Exception e) { - e.printStackTrace(); - } + disg.getWatcher().setDisguise(disg); return disg; } @Override public Disguise createInstance(Type type) { - if (type == PlayerDisguise.class) + if (type == PlayerDisguise.class) { return new PlayerDisguise("SaveDisgError"); - else if (type == MobDisguise.class) + } else if (type == MobDisguise.class) { return new MobDisguise(DisguiseType.SHEEP); - else if (type == MiscDisguise.class) + } else if (type == MiscDisguise.class) { return new MiscDisguise(DisguiseType.BOAT); + } return null; } @@ -56,12 +52,13 @@ public class SerializerDisguise implements JsonDeserializer, JsonSeria public JsonElement serialize(Disguise src, Type typeOfSrc, JsonSerializationContext context) { if (src.isCustomDisguise()) { return context.serialize(src, ModdedDisguise.class); - } else if (src.isPlayerDisguise()) + } else if (src.isPlayerDisguise()) { return context.serialize(src, PlayerDisguise.class); - else if (src.isMobDisguise()) + } else if (src.isMobDisguise()) { return context.serialize(src, MobDisguise.class); - else if (src.isMiscDisguise()) + } else if (src.isMiscDisguise()) { return context.serialize(src, MiscDisguise.class); + } return null; } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/json/SerializerFlagWatcher.java b/src/main/java/me/libraryaddict/disguise/utilities/json/SerializerFlagWatcher.java index 5f232b12..0ee2bc64 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/json/SerializerFlagWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/json/SerializerFlagWatcher.java @@ -11,6 +11,9 @@ import me.libraryaddict.disguise.utilities.params.types.custom.ParamInfoParticle import me.libraryaddict.disguise.utilities.parser.DisguiseParseException; import org.bukkit.inventory.ItemStack; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; @@ -141,15 +144,7 @@ public class SerializerFlagWatcher implements JsonDeserializer, Jso JsonObject obj = (JsonObject) gson.toJsonTree(src); obj.addProperty("flagType", src.getClass().getName()); - - try { - Method method = FlagWatcher.class.getDeclaredMethod("getDisguise"); - method.setAccessible(true); - Disguise disguise = (Disguise) method.invoke(src); - obj.addProperty("entityType", disguise.getType().name()); - } catch (Exception ex) { - ex.printStackTrace(); - } + obj.addProperty("entityType", src.getDisguise().getType().name()); return obj; } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerSpawn.java b/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerSpawn.java index 627d6d7c..173ee54a 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerSpawn.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerSpawn.java @@ -24,7 +24,6 @@ import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; import org.bukkit.Art; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.block.data.BlockData; import org.bukkit.entity.Damageable; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; diff --git a/src/main/java/me/libraryaddict/disguise/utilities/params/ParamInfoManager.java b/src/main/java/me/libraryaddict/disguise/utilities/params/ParamInfoManager.java index 97546645..0cf30340 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/params/ParamInfoManager.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/params/ParamInfoManager.java @@ -1,32 +1,26 @@ package me.libraryaddict.disguise.utilities.params; import lombok.Getter; -import me.libraryaddict.disguise.DisguiseConfig; -import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.DisguiseType; import me.libraryaddict.disguise.disguisetypes.FlagWatcher; -import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; import me.libraryaddict.disguise.disguisetypes.watchers.FallingBlockWatcher; import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; -import me.libraryaddict.disguise.disguisetypes.watchers.PlayerWatcher; import me.libraryaddict.disguise.utilities.params.types.custom.ParamInfoItemBlock; import me.libraryaddict.disguise.utilities.params.types.custom.ParamInfoSoundGroup; import me.libraryaddict.disguise.utilities.parser.DisguisePerm; +import me.libraryaddict.disguise.utilities.parser.WatcherMethod; import me.libraryaddict.disguise.utilities.watchers.DisguiseMethods; -import org.bukkit.ChatColor; import org.bukkit.Material; -import org.bukkit.boss.BarColor; -import org.bukkit.boss.BarStyle; import org.bukkit.inventory.ItemStack; import javax.annotation.Nullable; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.Locale; public class ParamInfoManager { private static List paramList; + @Getter private static DisguiseMethods disguiseMethods; @Getter private static ParamInfoItemBlock paramInfoItemBlock; @@ -51,17 +45,16 @@ public class ParamInfoManager { return info.toString(object); } - public static ParamInfo getParamInfo(Method method) { + public static ParamInfo getParamInfo(WatcherMethod method) { if (method.getName().equals("setSoundGroup")) { return getParamInfoSoundGroup(); } - if (method.getDeclaringClass() == FallingBlockWatcher.class && - (method.getParameterTypes()[0] == Material.class || method.getParameterTypes()[0] == ItemStack.class)) { + if (method.getWatcherClass() == FallingBlockWatcher.class && (method.getParam() == Material.class || method.getParam() == ItemStack.class)) { return getParamInfoItemBlock(); } - return getParamInfo(method.getParameterTypes()[0]); + return getParamInfo(method.getParam()); } public static ParamInfo getParamInfo(Class c) { @@ -81,7 +74,7 @@ public class ParamInfoManager { } public static ParamInfo getParamInfo(DisguiseType disguiseType, String methodName) { - for (Method method : getDisguiseWatcherMethods(disguiseType.getWatcherClass())) { + for (WatcherMethod method : getDisguiseWatcherMethods(disguiseType.getWatcherClass())) { if (!method.getName().toLowerCase(Locale.ENGLISH).equals(methodName.toLowerCase(Locale.ENGLISH))) { continue; } @@ -96,22 +89,18 @@ public class ParamInfoManager { ParamInfoTypes infoTypes = new ParamInfoTypes(); paramList = infoTypes.getParamInfos(); paramInfoItemBlock = infoTypes.getParamInfoBlock(); - paramInfoSoundGroup = - (ParamInfoSoundGroup) paramList.stream().filter(p -> p instanceof ParamInfoSoundGroup).findAny() - .orElse(null); + paramInfoSoundGroup = (ParamInfoSoundGroup) paramList.stream().filter(p -> p instanceof ParamInfoSoundGroup).findAny().orElse(null); disguiseMethods = new DisguiseMethods(); //paramList.sort((o1, o2) -> String.CASE_INSENSITIVE_ORDER.compare(o1.getName(), o2.getName())); } - public static Method[] getDisguiseWatcherMethods( - @Nullable - Class watcherClass) { + public static WatcherMethod[] getDisguiseWatcherMethods(@Nullable Class watcherClass) { if (watcherClass == null) { - return new Method[0]; + return new WatcherMethod[0]; } - ArrayList methods = new ArrayList<>(disguiseMethods.getMethods(watcherClass)); + ArrayList methods = new ArrayList<>(disguiseMethods.getMethods(watcherClass)); // Order first by their declaring class, the top class (SheepWatcher) goes before (FlagWatcher) // Order methods in the same watcher by their name from A to Z @@ -126,59 +115,16 @@ public class ParamInfoManager { return String.CASE_INSENSITIVE_ORDER.compare(m1.getName(), m2.getName()); }); - // Add these last as it's what we want to present to be called the least - for (String methodName : new String[]{"setSelfDisguiseVisible", "setHideHeldItemFromSelf", - "setHideArmorFromSelf", "setHearSelfDisguise", "setHidePlayer", "setExpires", "setNotifyBar", - "setBossBarColor", "setBossBarStyle", "setTallDisguisesVisible", "setDynamicName", "setSoundGroup", - "setDisguiseName", "setDeadmau5Ears"}) { - try { - Class cl = boolean.class; - Class disguiseClass = Disguise.class; - switch (methodName) { - case "setExpires": - cl = long.class; - break; - case "setNotifyBar": - cl = DisguiseConfig.NotifyBar.class; - break; - case "setBossBarColor": - cl = BarColor.class; - break; - case "setBossBarStyle": - cl = BarStyle.class; - break; - case "setSoundGroup": - case "setDisguiseName": - cl = String.class; - break; - case "setDeadmau5Ears": - if (watcherClass != PlayerWatcher.class) { - continue; - } - disguiseClass = PlayerDisguise.class; - break; - default: - break; - } - - methods.add(disguiseClass.getMethod(methodName, cl)); - } catch (Exception ex) { - ex.printStackTrace(); - } - } - - return methods.toArray(new Method[0]); + return methods.toArray(new WatcherMethod[0]); } /** * Value of the method, used namely for ordering the more unique methods to a disguise */ - public static int getValue(Method method) { - ChatColor methodColor = ChatColor.YELLOW; - - Class declaring = method.getDeclaringClass(); + public static int getValue(WatcherMethod method) { + Class declaring = method.getWatcherClass(); if (declaring == LivingWatcher.class) { return 1; diff --git a/src/main/java/me/libraryaddict/disguise/utilities/parser/DisguiseParser.java b/src/main/java/me/libraryaddict/disguise/utilities/parser/DisguiseParser.java index dd0fbdff..ee10d745 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/parser/DisguiseParser.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/parser/DisguiseParser.java @@ -14,7 +14,6 @@ import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; import me.libraryaddict.disguise.utilities.translations.LibsMsg; import me.libraryaddict.disguise.utilities.translations.TranslateType; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.block.data.BlockData; import org.bukkit.command.CommandSender; @@ -26,8 +25,10 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.permissions.PermissionAttachmentInfo; import org.bukkit.potion.PotionEffectType; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.util.*; import java.util.Map.Entry; import java.util.concurrent.ThreadLocalRandom; @@ -37,10 +38,12 @@ public class DisguiseParser { /** * > */ - private static HashMap> defaultWatcherValues = new HashMap<>(); + private static HashMap> defaultWatcherValues = new HashMap<>(); public static void createDefaultMethods() { try { + ArrayList allMethods = ParamInfoManager.getDisguiseMethods().getMethods(); + for (DisguiseType type : DisguiseType.values()) { if (type.getEntityType() == null) { continue; @@ -60,19 +63,19 @@ public class DisguiseParser { FlagWatcher watcher = type.getWatcherClass().getConstructor(Disguise.class).newInstance(disguise); - Method[] methods = ParamInfoManager.getDisguiseWatcherMethods(watcher.getClass()); + WatcherMethod[] methods = ParamInfoManager.getDisguiseWatcherMethods(watcher.getClass()); - for (Method setMethod : methods) { + for (WatcherMethod setMethod : methods) { // Invalidate methods that can't be handled normally if (setMethod.getName().equals("addPotionEffect")) { continue; - } else if (setMethod.getName().equals("setSkin") && setMethod.getParameterTypes()[0] == String.class) { + } else if (setMethod.getName().equals("setSkin") && setMethod.getParam() == String.class) { continue; - } else if (setMethod.getName().equals("setTarget") && setMethod.getParameterTypes()[0] != int.class) { + } else if (setMethod.getName().equals("setTarget") && setMethod.getParam() != int.class) { continue; - } else if (setMethod.getName().equals("setItemInMainHand") && setMethod.getParameterTypes()[0] == Material.class) { + } else if (setMethod.getName().equals("setItemInMainHand") && setMethod.getParam() == Material.class) { continue; - } else if (setMethod.getName().matches("setArmor") && setMethod.getParameterTypes()[0] == ItemStack[].class) { + } else if (setMethod.getName().matches("setArmor") && setMethod.getParam() == ItemStack[].class) { continue; } @@ -82,37 +85,50 @@ public class DisguiseParser { getName = "hasNectar"; } else if (getName.equals("HasStung")) { getName = "hasStung"; - } else if (setMethod.getParameterTypes()[0].isAssignableFrom(boolean.class)) { + } else if (setMethod.getParam().isAssignableFrom(boolean.class)) { getName = "is" + getName; } else { getName = "get" + getName; } - Method getMethod = setMethod.getDeclaringClass().getMethod(getName); + WatcherMethod getMethod = null; + + for (WatcherMethod m : allMethods) { + if (m.getWatcherClass() != setMethod.getWatcherClass() || m.getParam() != null) { + continue; + } + + if (!m.getName().equals(getName)) { + continue; + } + + getMethod = m; + break; + } if (getMethod == null) { DisguiseUtilities.getLogger().severe(String .format("No such method '%s' when looking for the companion of '%s' in '%s'", getName, setMethod.getName(), - setMethod.getDeclaringClass().getSimpleName())); + setMethod.getWatcherClass().getSimpleName())); continue; - } else if (getMethod.getReturnType() != setMethod.getParameterTypes()[0]) { + } else if (getMethod.getReturnType() != setMethod.getParam()) { DisguiseUtilities.getLogger().severe(String .format("Invalid return type of '%s' when looking for the companion of '%s' in '%s'", getName, setMethod.getName(), - setMethod.getDeclaringClass().getSimpleName())); + setMethod.getWatcherClass().getSimpleName())); continue; } Object defaultValue = null; // Value is randomish so shouldn't be checked, should always specify value when setting - if (!setMethod.isAnnotationPresent(RandomDefaultValue.class)) { + if (!setMethod.isRandomDefault()) { Object invokeWith = watcher; - if (!FlagWatcher.class.isAssignableFrom(getMethod.getDeclaringClass())) { + if (!FlagWatcher.class.isAssignableFrom(getMethod.getWatcherClass())) { invokeWith = disguise; } - defaultValue = getMethod.invoke(invokeWith); + defaultValue = getMethod.getMethod().bindTo(invokeWith).invoke(); } addWatcherDefault(setMethod, getMethod, defaultValue); @@ -120,10 +136,12 @@ public class DisguiseParser { } } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { e.printStackTrace(); + } catch (Throwable throwable) { + throwable.printStackTrace(); } } - public static HashMap> getMethodDefaults() { + public static HashMap> getMethodDefaults() { return defaultWatcherValues; } @@ -144,14 +162,16 @@ public class DisguiseParser { stringBuilder.append(" ").append(DisguiseUtilities.quote(((PlayerDisguise) disguise).getName())); } - Method[] methods = ParamInfoManager.getDisguiseWatcherMethods(disguise.getType().getWatcherClass()); + WatcherMethod[] methods = ParamInfoManager.getDisguiseWatcherMethods(disguise.getType().getWatcherClass()); for (int i = methods.length - 1; i >= 0; i--) { - Method m = methods[i]; + WatcherMethod m = methods[i]; // Special handling for this method if (m.getName().equals("addPotionEffect")) { - PotionEffectType[] types = (PotionEffectType[]) m.getDeclaringClass().getMethod("getPotionEffects").invoke(disguise.getWatcher()); + MethodHandle getPotion = + MethodHandles.publicLookup().bind(disguise.getWatcher(), "getPotionEffects", MethodType.methodType(PotionEffectType[].class)); + PotionEffectType[] types = (PotionEffectType[]) getPotion.invoke(); for (PotionEffectType type : types) { if (type == null) { @@ -169,15 +189,15 @@ public class DisguiseParser { continue; } - Entry entry = defaultWatcherValues.get(m); + Entry entry = defaultWatcherValues.get(m); if (entry == null) { continue; } - Object invokeWith = m.getDeclaringClass().isInstance(disguise) ? disguise : disguise.getWatcher(); + Object invokeWith = m.getWatcherClass().isInstance(disguise) ? disguise : disguise.getWatcher(); - Object ourValue = entry.getKey().invoke(invokeWith); + Object ourValue = entry.getKey().getMethod().bindTo(invokeWith).invoke(); // Escape a hacky fix for custom names, disguised players with custom names don't want to show it // so it was set to an empty string. @@ -200,7 +220,7 @@ public class DisguiseParser { } } else { // If its the same as default, continue - if (!m.isAnnotationPresent(RandomDefaultValue.class) && Objects.deepEquals(entry.getValue(), ourValue)) { + if (!m.isRandomDefault() && Objects.deepEquals(entry.getValue(), ourValue)) { continue; } } @@ -225,28 +245,28 @@ public class DisguiseParser { } return stringBuilder.toString(); - } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { + } catch (Throwable e) { e.printStackTrace(); } return null; } - private static void addWatcherDefault(Method setMethod, Method getMethod, Object object) { + private static void addWatcherDefault(WatcherMethod setMethod, WatcherMethod getMethod, Object object) { if (defaultWatcherValues.containsKey(setMethod)) { Object dObj = defaultWatcherValues.get(setMethod).getValue(); if (!Objects.deepEquals(dObj, object)) { throw new IllegalStateException(String.format( "%s has conflicting values in class %s! This means it expected the same value again but " + "received a " + - "different value on a different disguise! %s is not the same as %s!", setMethod.getName(), - setMethod.getDeclaringClass().getName(), object, dObj)); + "different value on a different disguise! %s is not the same as %s!", setMethod.toString(), setMethod.toString(), object, + dObj)); } return; } - Map.Entry entry = new HashMap.SimpleEntry<>(getMethod, object); + Map.Entry entry = new HashMap.SimpleEntry<>(getMethod, object); defaultWatcherValues.put(setMethod, entry); } @@ -569,8 +589,7 @@ public class DisguiseParser { * @throws IllegalAccessException * @throws InvocationTargetException */ - public static Disguise parseTestDisguise(CommandSender sender, String permNode, String[] args, DisguisePermissions permissions) - throws DisguiseParseException, IllegalAccessException, InvocationTargetException { + public static Disguise parseTestDisguise(CommandSender sender, String permNode, String[] args, DisguisePermissions permissions) throws Throwable { // Clone array so original array isn't modified args = Arrays.copyOf(args, args.length); @@ -583,8 +602,7 @@ public class DisguiseParser { return parseDisguise(sender, null, permNode, args, permissions); } - public static void modifyDisguise(Disguise disguise, Entity target, String[] params) - throws IllegalAccessException, DisguiseParseException, InvocationTargetException { + public static void modifyDisguise(Disguise disguise, Entity target, String[] params) throws Throwable { if (target != null) { params = DisguiseParser.parsePlaceholders(params, target, target); } @@ -593,25 +611,23 @@ public class DisguiseParser { new DisguisePerm(disguise.getType()), new ArrayList<>(), params, "Disguise"); } - public static void modifyDisguise(Disguise disguise, String[] params) throws IllegalAccessException, InvocationTargetException, DisguiseParseException { + public static void modifyDisguise(Disguise disguise, String[] params) throws Throwable { modifyDisguise(disguise, null, params); } - public static void modifyDisguise(Disguise disguise, String params) throws IllegalAccessException, DisguiseParseException, InvocationTargetException { + public static void modifyDisguise(Disguise disguise, String params) throws Throwable { modifyDisguise(disguise, DisguiseUtilities.split(params)); } - public static void modifyDisguise(Disguise disguise, Entity target, String params) - throws IllegalAccessException, InvocationTargetException, DisguiseParseException { + public static void modifyDisguise(Disguise disguise, Entity target, String params) throws Throwable { modifyDisguise(disguise, target, DisguiseUtilities.split(params)); } - public static Disguise parseDisguise(String disguise) throws IllegalAccessException, InvocationTargetException, DisguiseParseException { + public static Disguise parseDisguise(String disguise) throws Throwable { return parseDisguise(Bukkit.getConsoleSender(), null, disguise); } - public static Disguise parseDisguise(CommandSender sender, Entity target, String disguise) - throws IllegalAccessException, InvocationTargetException, DisguiseParseException { + public static Disguise parseDisguise(CommandSender sender, Entity target, String disguise) throws Throwable { return parseDisguise(sender, target, "disguise", DisguiseUtilities.split(disguise), new DisguisePermissions(Bukkit.getConsoleSender(), "disguise")); } @@ -622,7 +638,7 @@ public class DisguiseParser { * disguise has been feed a proper disguisetype. */ public static Disguise parseDisguise(CommandSender sender, Entity target, String permNode, String[] args, DisguisePermissions permissions) - throws DisguiseParseException, IllegalAccessException, InvocationTargetException { + throws Throwable { if (!Bukkit.isPrimaryThread()) { throw new IllegalStateException("DisguiseParser should not be called async!"); } @@ -883,9 +899,8 @@ public class DisguiseParser { } public static void callMethods(CommandSender sender, Disguise disguise, DisguisePermissions disguisePermission, DisguisePerm disguisePerm, - Collection usedOptions, String[] args, String permNode) - throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, DisguiseParseException { - Method[] methods = ParamInfoManager.getDisguiseWatcherMethods(disguise.getWatcher().getClass()); + Collection usedOptions, String[] args, String permNode) throws Throwable { + WatcherMethod[] methods = ParamInfoManager.getDisguiseWatcherMethods(disguise.getWatcher().getClass()); List list = new ArrayList<>(Arrays.asList(args)); HashMap> disguiseOptions = getDisguiseOptions(sender, permNode, disguisePerm); @@ -895,11 +910,11 @@ public class DisguiseParser { // Translate the name they provided, to a name we recognize String methodNameJava = TranslateType.DISGUISE_OPTIONS.reverseGet(methodNameProvided); // The method we'll use - Method methodToUse = null; + WatcherMethod methodToUse = null; Object valueToSet = null; DisguiseParseException parseException = null; - for (Method method : methods) { + for (WatcherMethod method : methods) { if (!method.getName().equalsIgnoreCase(methodNameJava)) { continue; } @@ -963,11 +978,15 @@ public class DisguiseParser { valueToSet = DisguiseUtilities.quoteNewLine((String) valueToSet); } - if (FlagWatcher.class.isAssignableFrom(methodToUse.getDeclaringClass())) { - methodToUse.invoke(disguise.getWatcher(), valueToSet); + MethodHandle handle = methodToUse.getMethod(); + + if (FlagWatcher.class.isAssignableFrom(methodToUse.getWatcherClass())) { + handle = handle.bindTo(disguise.getWatcher()); } else { - methodToUse.invoke(disguise, valueToSet); + handle = handle.bindTo(disguise); } + + handle.invoke(valueToSet); } } } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/parser/WatcherMethod.java b/src/main/java/me/libraryaddict/disguise/utilities/parser/WatcherMethod.java new file mode 100644 index 00000000..6db52170 --- /dev/null +++ b/src/main/java/me/libraryaddict/disguise/utilities/parser/WatcherMethod.java @@ -0,0 +1,21 @@ +package me.libraryaddict.disguise.utilities.parser; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import me.libraryaddict.disguise.disguisetypes.FlagWatcher; + +import java.lang.invoke.MethodHandle; + +/** + * Created by libraryaddict on 21/05/2021. + */ +@RequiredArgsConstructor +@Getter +public class WatcherMethod { + private final Class watcherClass; + private final MethodHandle method; + private final String name; + private final Class returnType; + private final Class param; + private final boolean randomDefault; +} diff --git a/src/main/java/me/libraryaddict/disguise/utilities/reflection/ReflectionManager.java b/src/main/java/me/libraryaddict/disguise/utilities/reflection/ReflectionManager.java index 85e8fcf7..36e32b14 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/reflection/ReflectionManager.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/reflection/ReflectionManager.java @@ -26,7 +26,6 @@ import org.bukkit.entity.*; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.material.MaterialData; import org.bukkit.plugin.SimplePluginManager; import org.bukkit.potion.PotionEffect; import org.bukkit.scheduler.BukkitRunnable; diff --git a/src/main/java/me/libraryaddict/disguise/utilities/reflection/asm/WatcherInfo.java b/src/main/java/me/libraryaddict/disguise/utilities/reflection/WatcherInfo.java similarity index 51% rename from src/main/java/me/libraryaddict/disguise/utilities/reflection/asm/WatcherInfo.java rename to src/main/java/me/libraryaddict/disguise/utilities/reflection/WatcherInfo.java index abf90ccb..88e45587 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/reflection/asm/WatcherInfo.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/reflection/WatcherInfo.java @@ -1,34 +1,24 @@ -package me.libraryaddict.disguise.utilities.reflection.asm; +package me.libraryaddict.disguise.utilities.reflection; import lombok.Getter; -import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; +import lombok.Setter; /** * Created by libraryaddict on 17/02/2020. */ @Getter +@Setter public class WatcherInfo { private int added = -1; private int removed = -1; + private boolean deprecated; + private String returnType; + private boolean randomDefault; private String watcher; private String method; private String param; String descriptor; - public WatcherInfo(String string) { - String[] split = string.split(":", -1); - - if (split.length > 3) { - descriptor = split[3]; - added = Integer.parseInt(split[4]); - removed = Integer.parseInt(split[5]); - } - - watcher = split[0]; - method = split[1]; - param = split[2]; - } - public boolean isSupported() { if (getAdded() >= 0 && added > ReflectionManager.getVersion().ordinal()) { return false; diff --git a/src/main/java/me/libraryaddict/disguise/utilities/reflection/asm/Asm13.java b/src/main/java/me/libraryaddict/disguise/utilities/reflection/asm/Asm13.java deleted file mode 100644 index 8b10e02f..00000000 --- a/src/main/java/me/libraryaddict/disguise/utilities/reflection/asm/Asm13.java +++ /dev/null @@ -1,34 +0,0 @@ -package me.libraryaddict.disguise.utilities.reflection.asm; - -import org.objectweb.asm.*; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Map; - -/** - * Created by libraryaddict on 17/02/2020. - */ -public class Asm13 { - public byte[] createClassWithoutMethods(String className, ArrayList> illegalMethods) throws IOException { - className = className.replace(".", "/") + ".class"; - - ClassReader cr = new ClassReader(getClass().getClassLoader().getResourceAsStream(className)); - ClassWriter writer = new ClassWriter(cr, 0); - - cr.accept(new ClassVisitor(Opcodes.ASM5, writer) { - public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { - Map.Entry entry = - illegalMethods.stream().filter(e -> e.getKey().equals(name) && e.getValue().equals(desc)).findFirst().orElse(null); - - if (entry != null) { - return null; - } - - return super.visitMethod(access, name, desc, signature, exceptions); - } - }, 0); - - return writer.toByteArray(); - } -} diff --git a/src/main/java/me/libraryaddict/disguise/utilities/reflection/asm/AsmLoader.java b/src/main/java/me/libraryaddict/disguise/utilities/reflection/asm/AsmLoader.java deleted file mode 100644 index 404dffa1..00000000 --- a/src/main/java/me/libraryaddict/disguise/utilities/reflection/asm/AsmLoader.java +++ /dev/null @@ -1,83 +0,0 @@ -package me.libraryaddict.disguise.utilities.reflection.asm; - -import lombok.Getter; -import me.libraryaddict.disguise.LibsDisguises; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; - -/** - * Created by libraryaddict on 20/02/2020. - */ -@Getter -public class AsmLoader { - // private String urlToGrab = "https://repository.ow2.org/nexus/content/repositories/releases/org/ow2/asm/asm/7 - // .3" + - // ".1/asm-7.3.1.jar"; - /** - * Using maven - */ - private final String urlToGrab = "https://search.maven.org/remotecontent?filepath=org/ow2/asm/asm/9.1/asm-9.1.jar"; - private final File filePath = new File(LibsDisguises.getInstance().getDataFolder(), "libs/org-ow2-asm-9.1.jar"); - private boolean asmExists; - private URLClassLoader classLoader; - - public AsmLoader() { - try { - Class.forName("org.objectweb.asm.ClassReader"); - asmExists = true; - } catch (NoClassDefFoundError | ClassNotFoundException ex) { - // It doesn't exist, good! Lets load it! - } - } - - public void loadClassloader() { - try { - classLoader = URLClassLoader.newInstance(new URL[]{filePath.toURI().toURL(), LibsDisguises.getInstance().getFile().toURI().toURL()}); - } catch (MalformedURLException e) { - e.printStackTrace(); - } - } - - public void unload() { - try { - classLoader.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - public void doDownloadIfRequired() { - if (!hasASM()) { - LibsDisguises.getInstance().getLogger().info("Downloading required library for asm!"); - - downloadASM(); - - LibsDisguises.getInstance().getLogger().info("Downloaded!"); - } - } - - private boolean hasASM() { - return filePath.exists(); - } - - private void downloadASM() { - filePath.getParentFile().mkdirs(); - - try (BufferedInputStream in = new BufferedInputStream(new URL(getUrlToGrab()).openStream()); - FileOutputStream fileOutputStream = new FileOutputStream(getFilePath())) { - byte[] dataBuffer = new byte[1024]; - int bytesRead; - while ((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) { - fileOutputStream.write(dataBuffer, 0, bytesRead); - } - } catch (IOException e) { - e.printStackTrace(); - } - } -} diff --git a/src/main/java/me/libraryaddict/disguise/utilities/reflection/asm/FakePluginCreator.java b/src/main/java/me/libraryaddict/disguise/utilities/reflection/asm/FakePluginCreator.java deleted file mode 100644 index 96416a24..00000000 --- a/src/main/java/me/libraryaddict/disguise/utilities/reflection/asm/FakePluginCreator.java +++ /dev/null @@ -1,120 +0,0 @@ -package me.libraryaddict.disguise.utilities.reflection.asm; - -import me.libraryaddict.disguise.LibsDisguises; -import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; -import org.apache.commons.lang.StringUtils; -import org.bukkit.configuration.file.YamlConfiguration; - -import java.io.*; -import java.nio.charset.StandardCharsets; -import java.util.Enumeration; -import java.util.Map; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; -import java.util.jar.JarOutputStream; -import java.util.stream.Collectors; -import java.util.zip.ZipEntry; - -/** - * Created by libraryaddict on 20/05/2021. - */ -public class FakePluginCreator { - public String getPluginYAML() { - return "name: LibsDisguisesVersioning\nmain: " + getPluginClassPath().replace(".class", "").replace("/", ".") + - "\ndescription: Plugin created by Libs Disguises for " + - "compatibility with different versions\nversion: 1.0.0\nauthor: libraryaddict\napi-version: '1.13'\nsoftdepend: [ProtocolLib, LibsDisguises]"; - } - - public File getDestination() { - return new File(LibsDisguises.getInstance().getDataFolder(), "libs/LibsDisguisesCompat.jar"); - } - - public String getPluginClassPath() { - return "me/libraryaddict/disguise/utilities/reflection/asm/LibsDisguisesCompat.class"; - } - - public String getVersion() throws Exception { - File dest = getDestination(); - - if (!dest.exists()) { - return null; - } - - JarFile jarFile = new JarFile(dest); - - try (InputStream stream = jarFile.getInputStream(jarFile.getEntry("version.txt"))) { - return new BufferedReader(new InputStreamReader(stream)).lines().collect(Collectors.joining("\n")); - } - } - - public String getOurVersion() { - YamlConfiguration pluginYml = ReflectionManager.getPluginYAML(LibsDisguises.getInstance().getFile()); - - String buildNo = StringUtils.stripToNull(pluginYml.getString("build-number")); - - return buildNo != null && buildNo.matches("[0-9]+") ? ReflectionManager.getBukkitVersion() + " " + Integer.parseInt(buildNo) : - ReflectionManager.getBukkitVersion() + " CUSTOM"; - } - - public void createJar(String ourVersion, Map classes) throws Exception { - File dest = getDestination(); - - if (!dest.getParentFile().exists()) { - dest.getParentFile().mkdirs(); - } - - if (dest.exists()) { - dest.delete(); - } - - JarOutputStream out = new JarOutputStream(new FileOutputStream(dest)); - - out.putNextEntry(new ZipEntry("plugin.yml")); - out.write(getPluginYAML().getBytes(StandardCharsets.UTF_8)); - out.closeEntry(); - - // Write our main plugin class - try (JarFile jar = new JarFile(LibsDisguises.getInstance().getFile())) { - Enumeration entries = jar.entries(); - String mainPath = getPluginClassPath().replace(".class", ""); - - while (entries.hasMoreElements()) { - JarEntry entry = entries.nextElement(); - - if (!entry.getName().equals(mainPath) && !entry.getName().startsWith("me/libraryaddict/disguise/disguisetypes/")) { - continue; - } - - if (classes.containsKey(entry.getName())) { - continue; - } - - out.putNextEntry(new ZipEntry(entry.getName().equals(mainPath) ? getPluginClassPath() : entry.getName())); - - try (InputStream stream = jar.getInputStream(entry)) { - int nRead; - byte[] data = new byte[1024]; - while ((nRead = stream.read(data, 0, data.length)) != -1) { - out.write(data, 0, nRead); - } - } - - out.closeEntry(); - } - } catch (Exception ex) { - ex.printStackTrace(); - } - - for (Map.Entry entry : classes.entrySet()) { - out.putNextEntry(new ZipEntry(entry.getKey())); - out.write(entry.getValue()); - out.closeEntry(); - } - - out.putNextEntry(new ZipEntry("version.txt")); - out.write(ourVersion.getBytes(StandardCharsets.UTF_8)); - out.closeEntry(); - - out.close(); - } -} diff --git a/src/main/java/me/libraryaddict/disguise/utilities/reflection/asm/LibsDisguisesCompat.java b/src/main/java/me/libraryaddict/disguise/utilities/reflection/asm/LibsDisguisesCompat.java deleted file mode 100644 index 24a0af8f..00000000 --- a/src/main/java/me/libraryaddict/disguise/utilities/reflection/asm/LibsDisguisesCompat.java +++ /dev/null @@ -1,16 +0,0 @@ -package me.libraryaddict.disguise.utilities.reflection.asm; - -import me.libraryaddict.disguise.utilities.reflection.ClassGetter; -import org.bukkit.plugin.java.JavaPlugin; - -import java.util.ArrayList; - -/** - * Created by libraryaddict on 20/05/2021. - */ -public class LibsDisguisesCompat extends JavaPlugin { - @Override - public void onLoad() { - ClassGetter.getClassesForPackage("me.libraryaddict.disguise.disguisetypes"); - } -} diff --git a/src/main/java/me/libraryaddict/disguise/utilities/reflection/asm/WatcherSanitizer.java b/src/main/java/me/libraryaddict/disguise/utilities/reflection/asm/WatcherSanitizer.java deleted file mode 100644 index 66eb0ed2..00000000 --- a/src/main/java/me/libraryaddict/disguise/utilities/reflection/asm/WatcherSanitizer.java +++ /dev/null @@ -1,185 +0,0 @@ -package me.libraryaddict.disguise.utilities.reflection.asm; - -import com.google.gson.Gson; -import me.libraryaddict.disguise.LibsDisguises; -import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; -import org.bukkit.Bukkit; -import org.bukkit.plugin.Plugin; -import org.bukkit.plugin.PluginDescriptionFile; -import org.bukkit.plugin.java.JavaPluginLoader; - -import java.io.File; -import java.io.InputStream; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.nio.charset.StandardCharsets; -import java.util.*; - -/** - * Created by libraryaddict on 17/02/2020. - */ -public class WatcherSanitizer { - public static void checkPreLoaded() throws NoSuchFieldException, IllegalAccessException { - JavaPluginLoader javaLoader = (JavaPluginLoader) LibsDisguises.getInstance().getPluginLoader(); - - Field lM = JavaPluginLoader.class.getDeclaredField("loaders"); - lM.setAccessible(true); - List loaders = (List) lM.get(javaLoader); - - Field lF = WatcherSanitizer.class.getClassLoader().getClass().getDeclaredField("classes"); - lF.setAccessible(true); - Field dF = WatcherSanitizer.class.getClassLoader().getClass().getDeclaredField("description"); - dF.setAccessible(true); - - for (Object loader : loaders) { - Map> lClasses = (Map>) lF.get(loader); - PluginDescriptionFile desc = (PluginDescriptionFile) dF.get(loader); - - if (hasWatcher(lClasses)) { - LibsDisguises.getInstance().getLogger() - .severe(desc.getFullName() + " has been a naughty plugin, they're declaring access to the disguise watchers before Lib's " + - "Disguises can properly load them! They should add 'LibsDisguises' to the 'depend' section of" + " their plugin.yml!"); - break; - } - } - - Field cM = JavaPluginLoader.class.getDeclaredField("classes"); - cM.setAccessible(true); - Map> classes = (Map>) cM.get(javaLoader); - - if (hasWatcher(classes)) { - LibsDisguises.getInstance().getLogger() - .severe("Somehow the main server has a Watcher instance! Hopefully there was a plugin mentioned " + "above! This is a bug!"); - } - } - - private static boolean hasWatcher(Map> classes) { - for (Class c : classes.values()) { - if (!c.getName().startsWith("me.libraryaddict.disguise.disguisetypes.watchers.") && - !c.getName().equals("me.libraryaddict.disguise.disguisetypes.FlagWatcher")) { - continue; - } - - return true; - } - - return false; - } - - public static void init() { - try { - checkPreLoaded(); - } catch (NoSuchFieldException | IllegalAccessException e) { - LibsDisguises.getInstance().getLogger().info("Failed to check for early class access, this shouldn't be an issue"); - } - - if (Bukkit.getPluginManager().getPlugin("LibsDisguisesVersioning") != null) { - throw new IllegalStateException("Why is LibsDisguisesVersioning already active? Did the server owner do something.. Weird?"); - } - - LibsDisguises.getInstance().getLogger() - .info("Due to issues with Java 16, you may notice harmless errors saying plugin loaded another plugin that isnt a soft depend or so on"); - - FakePluginCreator fakePluginCreator = new FakePluginCreator(); - - String ourVers = fakePluginCreator.getOurVersion(); - - try { - if (ourVers != null && ourVers.equals(fakePluginCreator.getVersion()) && !ourVers.contains(" CUSTOM")) { - loadPlugin(fakePluginCreator); - return; - } - } catch (Exception e) { - e.printStackTrace(); - } - - LibsDisguises.getInstance().getLogger().info("Creating a new version compatibility jar"); - - ArrayList mapped = new ArrayList<>(); - - try (InputStream stream = LibsDisguises.getInstance().getResource("ANTI_PIRACY_ENCRYPTION")) { - AsmLoader loader = new AsmLoader(); - - Object obj; - Method getBytes; - - if (!loader.isAsmExists()) { - loader.doDownloadIfRequired(); - loader.loadClassloader(); - - obj = Class.forName("me.libraryaddict.disguise.utilities.reflection.asm.Asm13", true, loader.getClassLoader()).newInstance(); - } else { - obj = new Asm13(); - } - - getBytes = obj.getClass().getMethod("createClassWithoutMethods", String.class, ArrayList.class); - - String[] lines = new String(ReflectionManager.readFuzzyFully(stream), StandardCharsets.UTF_8).split("\n"); - - LinkedHashMap>> toRemove = new LinkedHashMap<>(); - - for (String s : lines) { - WatcherInfo info = new WatcherInfo(s); - - if (info.isSupported()) { - continue; - } - - String path = "me.libraryaddict.disguise.disguisetypes." + (info.getWatcher().equals("FlagWatcher") ? "" : "watchers.") + info.getWatcher(); - - toRemove.putIfAbsent(path, new ArrayList<>()); - - ArrayList> list = toRemove.get(path); - - list.add(new HashMap.SimpleEntry(info.getMethod(), info.getDescriptor())); - } - - Map classes = new HashMap<>(); - - for (Map.Entry>> entry : toRemove.entrySet()) { - byte[] bytes = (byte[]) getBytes.invoke(obj, entry.getKey(), entry.getValue()); - mapped.add(entry.getKey()); - - classes.put(entry.getKey().replace(".", "/") + ".class", bytes); - } - - fakePluginCreator.createJar(ourVers, classes); - loadPlugin(fakePluginCreator); - - if (!loader.isAsmExists()) { - loader.unload(); - } - } catch (Throwable e) { - e.printStackTrace(); - LibsDisguises.getInstance().getLogger().severe("Registered: " + new Gson().toJson(mapped)); - } - } - - private static void loadPlugin(FakePluginCreator fakePluginCreator) throws Exception { - LibsDisguises.getInstance().getLogger().info("Starting version support plugin: LibsDisguisesVersioning"); - Method method = Class.forName("org.bukkit.plugin.PluginManager", false, WatcherSanitizer.class.getClassLoader().getParent()) - .getMethod("loadPlugin", File.class); - - Plugin plugin = (Plugin) method.invoke(Bukkit.getPluginManager(), fakePluginCreator.getDestination()); - - Class pluginClassLoader = Class.forName("org.bukkit.plugin.java.PluginClassLoader"); - - Field loaderField = JavaPluginLoader.class.getDeclaredField("loaders"); - loaderField.setAccessible(true); - List loaderList = (List) loaderField.get(LibsDisguises.getInstance().getPluginLoader()); - - Field pluginOwner = pluginClassLoader.getDeclaredField("plugin"); - pluginOwner.setAccessible(true); - - // Move Lib's Disguises to load its classes after the new plugin - for (Object o : loaderList) { - if (pluginOwner.get(o) != LibsDisguises.getInstance()) { - continue; - } - - loaderList.remove(o); - loaderList.add(o); - break; - } - } -} diff --git a/src/main/java/me/libraryaddict/disguise/utilities/translations/TranslateFiller.java b/src/main/java/me/libraryaddict/disguise/utilities/translations/TranslateFiller.java index bfea4e16..713de46f 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/translations/TranslateFiller.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/translations/TranslateFiller.java @@ -3,11 +3,11 @@ package me.libraryaddict.disguise.utilities.translations; import me.libraryaddict.disguise.disguisetypes.DisguiseType; import me.libraryaddict.disguise.utilities.params.ParamInfo; import me.libraryaddict.disguise.utilities.params.ParamInfoManager; +import me.libraryaddict.disguise.utilities.parser.WatcherMethod; import org.apache.commons.lang.StringUtils; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Locale; @@ -58,9 +58,9 @@ public class TranslateFiller { continue; } - for (Method method : ParamInfoManager.getDisguiseWatcherMethods(type.getWatcherClass())) { - Class para = method.getParameterTypes()[0]; - String className = method.getDeclaringClass().getSimpleName().replace("Watcher", ""); + for (WatcherMethod method : ParamInfoManager.getDisguiseWatcherMethods(type.getWatcherClass())) { + Class para = method.getParam(); + String className = method.getWatcherClass().getSimpleName().replace("Watcher", ""); if (className.equals("Flag") || className.equals("Disguise")) className = "Entity"; diff --git a/src/main/java/me/libraryaddict/disguise/utilities/watchers/CompileMethods.java b/src/main/java/me/libraryaddict/disguise/utilities/watchers/CompileMethods.java index cfa82812..325ee62e 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/watchers/CompileMethods.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/watchers/CompileMethods.java @@ -1,11 +1,13 @@ package me.libraryaddict.disguise.utilities.watchers; +import com.google.gson.Gson; import me.libraryaddict.disguise.disguisetypes.FlagWatcher; import me.libraryaddict.disguise.utilities.LibsPremium; +import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue; import me.libraryaddict.disguise.utilities.reflection.ClassGetter; import me.libraryaddict.disguise.utilities.reflection.NmsAddedIn; import me.libraryaddict.disguise.utilities.reflection.NmsRemovedIn; -import me.libraryaddict.disguise.utilities.reflection.asm.FakePluginCreator; +import me.libraryaddict.disguise.utilities.reflection.WatcherInfo; import me.libraryaddict.disguise.utilities.sounds.DisguiseSoundEnums; import me.libraryaddict.disguise.utilities.sounds.SoundGroup; import org.apache.commons.lang.StringUtils; @@ -35,14 +37,6 @@ public class CompileMethods { public static void main(String[] args) { doMethods(); doSounds(); - moveCompat(); - } - - private static void moveCompat() { - FakePluginCreator creator = new FakePluginCreator(); - - File compatFile = new File("target/classes/" + creator.getPluginClassPath()); - compatFile.renameTo(new File(compatFile.getParentFile(), compatFile.getName().replace(".class", ""))); } private static void doSounds() { @@ -140,14 +134,20 @@ public class CompileMethods { removed = method.getDeclaringClass().getAnnotation(NmsRemovedIn.class).value().ordinal(); } - String param = method.getParameterCount() == 1 ? method.getParameterTypes()[0].getName() : ""; - String descriptor = ""; + String param = method.getParameterCount() == 1 ? method.getParameterTypes()[0].getName() : null; - if (added >= 0 || removed >= 0) { - descriptor = ":" + getMethodDescriptor(method) + ":" + added + ":" + removed; - } + WatcherInfo info = new WatcherInfo(); + info.setMethod(method.getName()); + info.setAdded(added); + info.setRemoved(removed); + info.setDeprecated(method.isAnnotationPresent(Deprecated.class)); + info.setParam(param); + info.setDescriptor(getMethodDescriptor(method)); + info.setWatcher(method.getDeclaringClass().getSimpleName()); + info.setReturnType(method.getReturnType().getName()); + info.setRandomDefault(method.isAnnotationPresent(RandomDefaultValue.class)); - String s = method.getDeclaringClass().getSimpleName() + ":" + method.getName() + ":" + param + descriptor; + String s = new Gson().toJson(info); if (methods.contains(s)) { continue; diff --git a/src/main/java/me/libraryaddict/disguise/utilities/watchers/DisguiseMethods.java b/src/main/java/me/libraryaddict/disguise/utilities/watchers/DisguiseMethods.java index 10ef0351..b3f81437 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/watchers/DisguiseMethods.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/watchers/DisguiseMethods.java @@ -1,16 +1,24 @@ package me.libraryaddict.disguise.utilities.watchers; +import com.google.gson.Gson; +import lombok.Getter; +import me.libraryaddict.disguise.DisguiseConfig; import me.libraryaddict.disguise.LibsDisguises; +import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.DisguiseType; import me.libraryaddict.disguise.disguisetypes.FlagWatcher; +import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; import me.libraryaddict.disguise.utilities.params.ParamInfoManager; -import me.libraryaddict.disguise.utilities.reflection.NmsRemovedIn; +import me.libraryaddict.disguise.utilities.parser.WatcherMethod; import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; -import me.libraryaddict.disguise.utilities.reflection.asm.WatcherInfo; +import me.libraryaddict.disguise.utilities.reflection.WatcherInfo; +import org.bukkit.boss.BarColor; +import org.bukkit.boss.BarStyle; -import java.io.IOException; import java.io.InputStream; -import java.lang.reflect.Method; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; @@ -20,10 +28,13 @@ import java.util.List; * Created by libraryaddict on 13/02/2020. */ public class DisguiseMethods { - private HashMap, List> watcherMethods = new HashMap<>(); + private HashMap, List> watcherMethods = new HashMap<>(); + private HashMap, List> disguiseMethods = new HashMap<>(); + @Getter + private ArrayList methods = new ArrayList<>(); - public ArrayList getMethods(Class c) { - ArrayList methods = new ArrayList<>(); + public ArrayList getMethods(Class c) { + ArrayList methods = new ArrayList<>(); if (watcherMethods.containsKey(c)) { methods.addAll(watcherMethods.get(c)); @@ -36,14 +47,6 @@ public class DisguiseMethods { return methods; } - public ArrayList getMethods() { - ArrayList methods = new ArrayList<>(); - - this.watcherMethods.values().forEach(methods::addAll); - - return methods; - } - public DisguiseMethods() { loadMethods(); } @@ -74,9 +77,13 @@ public class DisguiseMethods { } for (String line : lines) { - WatcherInfo info = new WatcherInfo(line); + WatcherInfo info = new Gson().fromJson(line, WatcherInfo.class); - if (!info.isSupported() || info.getParam().isEmpty()) { + if (!info.isSupported()) { + continue; + } + + if (info.isDeprecated() && info.getRemoved() < 0) { continue; } @@ -86,33 +93,79 @@ public class DisguiseMethods { continue; } + Class param = parseType(info.getParam()); + Class returnType = parseType(info.getReturnType()); + String paramName = info.getParam(); - Class param; - if (!paramName.contains(".")) { - param = parseType(paramName); - } else { - param = Class.forName(paramName); - } + MethodType type = param == null || param == Void.TYPE ? MethodType.methodType(returnType) : MethodType.methodType(returnType, param); - Method method = watcher.getMethod(info.getMethod(), param); + MethodHandle method = MethodHandles.publicLookup().findVirtual(watcher, info.getMethod(), type); - if (method.getParameterCount() != 1) { - continue; - } else if (method.getName().startsWith("get")) { - continue; - } else if (method.isAnnotationPresent(Deprecated.class) && - !method.isAnnotationPresent(NmsRemovedIn.class)) { - continue; - } else if (!method.getReturnType().equals(Void.TYPE)) { - continue; - } else if (ParamInfoManager.getParamInfo(method) == null) { + WatcherMethod m = new WatcherMethod(watcher, method, info.getMethod(), returnType, param, info.isRandomDefault()); + + methods.add(m); + + if (m.getName().startsWith("get") || m.getName().startsWith("has") || param == null || param == Void.TYPE || ParamInfoManager.getParamInfo(m) == null) { continue; } - watcherMethods.computeIfAbsent(watcher, (a) -> new ArrayList<>()).add(method); + watcherMethods.computeIfAbsent(watcher, (a) -> new ArrayList<>()).add(m); } - } catch (IOException | ClassNotFoundException | NoClassDefFoundError | NoSuchMethodException e) { + + PlayerDisguise disguise = new PlayerDisguise(""); + + // Add these last as it's what we want to present to be called the least + for (String methodName : new String[]{"setSelfDisguiseVisible", "setHideHeldItemFromSelf", "setHideArmorFromSelf", "setHearSelfDisguise", + "setHidePlayer", "setExpires", "setNotifyBar", "setBossBarColor", "setBossBarStyle", "setTallDisguisesVisible", "setDynamicName", + "setSoundGroup", "setDisguiseName", "setDeadmau5Ears"}) { + try { + Class cl = boolean.class; + Class disguiseClass = Disguise.class; + + switch (methodName) { + case "setExpires": + cl = long.class; + break; + case "setNotifyBar": + cl = DisguiseConfig.NotifyBar.class; + break; + case "setBossBarColor": + cl = BarColor.class; + break; + case "setBossBarStyle": + cl = BarStyle.class; + break; + case "setSoundGroup": + case "setDisguiseName": + cl = String.class; + break; + case "setDeadmau5Ears": + disguiseClass = PlayerDisguise.class; + break; + default: + break; + } + + for (Class returnType : new Class[]{Void.TYPE, disguiseClass}) { + try { + WatcherMethod method = new WatcherMethod(disguiseClass, + MethodHandles.publicLookup().findVirtual(disguiseClass, methodName, MethodType.methodType(returnType, cl)), methodName, + null, cl, false); + + methods.add(method); + break; + } catch (NoSuchMethodException ex) { + if (returnType == disguiseClass) { + ex.printStackTrace(); + } + } + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } catch (Throwable e) { e.printStackTrace(); } } @@ -129,8 +182,18 @@ public class DisguiseMethods { * @param className The class name, never `null` * @throws IllegalArgumentException if no class can be loaded */ - private Class parseType(final String className) { + private Class parseType(final String className) throws ClassNotFoundException { + if (className == null) { + return null; + } + + if (className.contains(".")) { + return Class.forName(className); + } + switch (className) { + case "void": + return Void.TYPE; case "boolean": return boolean.class; case "byte": @@ -149,6 +212,8 @@ public class DisguiseMethods { return char.class; case "[I": return int[].class; + case "[Z": + return boolean[].class; default: throw new IllegalArgumentException("Class not found: " + className); } diff --git a/src/test/java/me/libraryaddict/disguise/disguisetypes/DisguiseCloneTest.java b/src/test/java/me/libraryaddict/disguise/disguisetypes/DisguiseCloneTest.java index 1792116c..91447a4b 100644 --- a/src/test/java/me/libraryaddict/disguise/disguisetypes/DisguiseCloneTest.java +++ b/src/test/java/me/libraryaddict/disguise/disguisetypes/DisguiseCloneTest.java @@ -2,13 +2,13 @@ package me.libraryaddict.disguise.disguisetypes; import me.libraryaddict.disguise.utilities.DisguiseUtilities; import me.libraryaddict.disguise.utilities.parser.DisguiseParser; +import me.libraryaddict.disguise.utilities.parser.WatcherMethod; import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import org.junit.Assert; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; +import java.lang.invoke.MethodHandle; import java.util.Map; /** @@ -37,8 +37,7 @@ public class DisguiseCloneTest { disguise = new MiscDisguise(type); } - for (Map.Entry> entry : DisguiseParser.getMethodDefaults() - .entrySet()) { + for (Map.Entry> entry : DisguiseParser.getMethodDefaults().entrySet()) { Object dValue = entry.getValue().getValue(); if (dValue instanceof String) { @@ -74,21 +73,19 @@ public class DisguiseCloneTest { continue; } - Method m = entry.getKey(); + WatcherMethod m = entry.getKey(); Object invokeWith = disguise; - if (FlagWatcher.class.isAssignableFrom(entry.getKey().getDeclaringClass())) { + if (FlagWatcher.class.isAssignableFrom(entry.getKey().getWatcherClass())) { invokeWith = disguise.getWatcher(); } try { - entry.getKey().invoke(invokeWith, dValue); - } - catch (IllegalAccessException e) { - e.printStackTrace(); - } - catch (InvocationTargetException e) { + MethodHandle handle = entry.getKey().getMethod(); + handle.bindTo(invokeWith); + handle.invoke(dValue); + } catch (Throwable e) { e.printStackTrace(); } } @@ -103,8 +100,7 @@ public class DisguiseCloneTest { Assert.fail("Cloned disguise is not the same!"); } } - } - catch (Exception ex) { + } catch (Exception ex) { ex.printStackTrace(); if (ex.getCause() != null) {