From 1c2ea6a54d076ba65b80763dfda0727490b3cd09 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Sat, 22 May 2021 02:42:56 +1200 Subject: [PATCH] Should be private --- .../utilities/parser/DisguiseParser.java | 63 ++++++++++++++++++- .../utilities/reflection/WatcherInfo.java | 2 +- 2 files changed, 63 insertions(+), 2 deletions(-) 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 ee10d745..1c50124a 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/parser/DisguiseParser.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/parser/DisguiseParser.java @@ -13,6 +13,7 @@ import me.libraryaddict.disguise.utilities.reflection.NmsVersion; import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; import me.libraryaddict.disguise.utilities.translations.LibsMsg; import me.libraryaddict.disguise.utilities.translations.TranslateType; +import me.libraryaddict.disguise.utilities.watchers.DisguiseMethods; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.data.BlockData; @@ -149,10 +150,14 @@ public class DisguiseParser { return parseToString(disguise, true); } + public static String parseToString(Disguise disguise, boolean outputSkinData) { + return parseToString(disguise, outputSkinData, false); + } + /** * Not outputting skin information is not garanteed to display the correct player name */ - public static String parseToString(Disguise disguise, boolean outputSkinData) { + public static String parseToString(Disguise disguise, boolean outputSkinData, boolean includeCustomData) { try { StringBuilder stringBuilder = new StringBuilder(); @@ -244,6 +249,40 @@ public class DisguiseParser { stringBuilder.append(" ").append(valueString); } + if (includeCustomData) { + LinkedHashMap meta = disguise.getCustomData(); + LinkedHashMap serializedMeta = new LinkedHashMap<>(); + + for (Entry entry : meta.entrySet()) { + Object val = entry.getValue(); + + try { + if (val == null) { + serializedMeta.put(entry.getKey(), "null"); + continue; + } + + String serialized = DisguiseUtilities.getGson().toJson(val); + + serializedMeta.put(entry.getKey(), val.getClass().getName() + ":" + serialized); + } catch (Throwable throwable) { + DisguiseUtilities.getLogger() + .warning("Unable to properly serialize the metadata on a disguise, the metadata was saved under name '" + entry.getKey() + "'"); + + if (!(throwable instanceof StackOverflowError)) { + throwable.printStackTrace(); + } + continue; + } + } + + if (!serializedMeta.isEmpty()) { + String serialized = DisguiseUtilities.getGson().toJson(serializedMeta); + + stringBuilder.append(" ").append("setCustomData").append(" ").append(DisguiseUtilities.quote(serialized)); + } + } + return stringBuilder.toString(); } catch (Throwable e) { e.printStackTrace(); @@ -914,6 +953,28 @@ public class DisguiseParser { Object valueToSet = null; DisguiseParseException parseException = null; + if (!list.isEmpty() && methodNameProvided.equalsIgnoreCase("setCustomData") && (sender == null || sender.isOp())) { + argIndex++; + String data = list.remove(0); + Map deserial = DisguiseUtilities.getGson().fromJson(data, LinkedHashMap.class); + + for (Entry entry : deserial.entrySet()) { + String val = entry.getValue(); + + if (!val.contains(":")) { + disguise.addCustomData(entry.getKey(), null); + continue; + } + + String className = val.substring(0, val.indexOf(":")); + val = val.substring(className.length() + 1); + + disguise.addCustomData(entry.getKey(), DisguiseUtilities.getGson().fromJson(val, DisguiseMethods.parseType(className))); + } + + continue; + } + for (WatcherMethod method : methods) { if (!method.getName().equalsIgnoreCase(methodNameJava)) { continue; diff --git a/src/main/java/me/libraryaddict/disguise/utilities/reflection/WatcherInfo.java b/src/main/java/me/libraryaddict/disguise/utilities/reflection/WatcherInfo.java index 88e45587..7c502172 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/reflection/WatcherInfo.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/reflection/WatcherInfo.java @@ -17,7 +17,7 @@ public class WatcherInfo { private String watcher; private String method; private String param; - String descriptor; + private String descriptor; public boolean isSupported() { if (getAdded() >= 0 && added > ReflectionManager.getVersion().ordinal()) {