From 1ed3a149ea771dd28377d6dc158e38654cd38570 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Fri, 9 Oct 2020 10:09:37 +1300 Subject: [PATCH] Fix serializing of more complex items such as player heads, don't include setArmor in disguise string but instead rely on sethelmet etc --- .../disguise/utilities/DisguiseUtilities.java | 18 +++++++++++++-- .../types/custom/ParamInfoItemStack.java | 4 ++-- .../utilities/parser/DisguiseParser.java | 22 +++++++++++++------ 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index 7344ac33..77bca506 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -2735,10 +2735,24 @@ public class DisguiseUtilities { String[] str = new String[Array.getLength(base.getValue())]; for (int i = 0; i < str.length; i++) { - str[i] = Array.get(base.getValue(),i).toString();//+ getChar(base.getType()); + str[i] = Array.get(base.getValue(), i).toString();//+ getChar(base.getType()); } - return "[" + StringUtils.join(str, ",") + "]"; + String c = ""; + + switch (base.getType()) { + case TAG_BYTE_ARRAY: + c = "B;"; + break; + case TAG_INT_ARRAY: + c = "I;"; + break; + case TAG_LONG_ARRAY: + c = "L;"; + break; + } + + return "[" + c + StringUtils.join(str, ",") + "]"; case TAG_BYTE: case TAG_INT: case TAG_LONG: diff --git a/src/main/java/me/libraryaddict/disguise/utilities/params/types/custom/ParamInfoItemStack.java b/src/main/java/me/libraryaddict/disguise/utilities/params/types/custom/ParamInfoItemStack.java index 80262fad..7be9e9ec 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/params/types/custom/ParamInfoItemStack.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/params/types/custom/ParamInfoItemStack.java @@ -114,11 +114,11 @@ public class ParamInfoItemStack extends ParamInfoEnum { String[] split; // If it matches /give @p stone {data} - if (string.matches("[^{]+?[ -]\\{.+?}")) { + if (string.matches("^[^{]+?[ -]\\{[.].+?}$")) { split = string.substring(0, string.indexOf("{") - 1).split("[ -]"); split = Arrays.copyOf(split, split.length + 1); split[split.length - 1] = string.substring(string.indexOf("{")); - } else if (string.matches("[^{ ]+?\\{.+?}( [0-9]+)?")) { // /give @p stone[data] + } else if (string.matches("^[^{ -]+?\\{.+?}([ -][0-9]+)?$")) { // /give @p stone[data] split = new String[string.endsWith("}") ? 2 : 3]; split[0] = string.substring(0, string.indexOf("{")); split[string.endsWith("}") ? 1 : 2] = string 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 4fb0629e..a40edde2 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/parser/DisguiseParser.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/parser/DisguiseParser.java @@ -63,12 +63,19 @@ public class DisguiseParser { for (Method setMethod : methods) { // Invalidate methods that can't be handled normally - if (setMethod.getName().equals("addPotionEffect") || (setMethod.getName().equals("setSkin") && - setMethod.getParameterTypes()[0] == String.class) || - (setMethod.getName().equals("setTarget") && - setMethod.getParameterTypes()[0] != int.class) || - (setMethod.getName().equals("setItemInMainHand") && - setMethod.getParameterTypes()[0] == Material.class)) { + if (setMethod.getName().equals("addPotionEffect")) { + continue; + } else if (setMethod.getName().equals("setSkin") && + setMethod.getParameterTypes()[0] == String.class) { + continue; + } else if (setMethod.getName().equals("setTarget") && + setMethod.getParameterTypes()[0] != int.class) { + continue; + } else if (setMethod.getName().equals("setItemInMainHand") && + setMethod.getParameterTypes()[0] == Material.class) { + continue; + } else if (setMethod.getName().matches("setArmor") && + setMethod.getParameterTypes()[0] == ItemStack[].class) { continue; } @@ -829,7 +836,8 @@ public class DisguiseParser { usedOptions.add(optionName); doCheck(sender, permissions, disguisePerm, usedOptions); - String itemName = itemStack == null ? "null" : itemStack.getType().name().toLowerCase(Locale.ENGLISH); + String itemName = itemStack == null ? "null" : + itemStack.getType().name().toLowerCase(Locale.ENGLISH); if (!hasPermissionOption(disguiseOptions, optionName, itemName)) { throw new DisguiseParseException(LibsMsg.PARSE_NO_PERM_PARAM, itemName,