From cb928e72aa94008b0a5ecd143e07a30ee347a898 Mon Sep 17 00:00:00 2001 From: mcmonkey4eva Date: Sun, 15 Dec 2013 01:27:04 -0800 Subject: [PATCH] Add ItemLore prop, add <&sc> tag, adjust symbols - Added ItemLore property - added <&sc> tag to return semicolons magically - adjusted how special/control symbols are handled to avoid errors / hack risks --- .../aufdemrand/denizen/objects/Element.java | 3 +- .../denizen/objects/ObjectFetcher.java | 3 +- .../net/aufdemrand/denizen/objects/dItem.java | 35 ++------- .../properties/Item/ItemDisplayname.java | 1 - .../objects/properties/Item/ItemLore.java | 75 +++++++++++++++++++ .../objects/properties/PropertyParser.java | 4 +- .../scripts/commands/player/ChatCommand.java | 3 +- .../commands/player/NarrateCommand.java | 3 +- .../aufdemrand/denizen/tags/TagManager.java | 26 +++++-- .../denizen/tags/core/TextTags.java | 9 +++ .../denizen/utilities/Utilities.java | 2 +- .../denizen/utilities/debugging/dB.java | 5 +- 12 files changed, 123 insertions(+), 46 deletions(-) create mode 100644 src/main/java/net/aufdemrand/denizen/objects/properties/Item/ItemLore.java diff --git a/src/main/java/net/aufdemrand/denizen/objects/Element.java b/src/main/java/net/aufdemrand/denizen/objects/Element.java index 73fa975396..e08ff58bad 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/Element.java +++ b/src/main/java/net/aufdemrand/denizen/objects/Element.java @@ -9,6 +9,7 @@ import net.aufdemrand.denizen.scripts.commands.core.*; import net.aufdemrand.denizen.scripts.commands.core.Comparable; import net.aufdemrand.denizen.tags.Attribute; +import net.aufdemrand.denizen.tags.TagManager; import net.aufdemrand.denizen.utilities.debugging.dB; import org.apache.commons.lang.StringUtils; @@ -872,7 +873,7 @@ else if (element.toLowerCase().contains(contains.toLowerCase())) return "null"; } else { dB.echoDebug(attribute.getScriptEntry(), "Filled tag <" + attribute.getOrigin() + "> with '" + - element.replace((char)0x01, '<').replace((char)0x02, '>').replace(dList.internal_escape, "|") + "'."); + element + "'."); return element; } } diff --git a/src/main/java/net/aufdemrand/denizen/objects/ObjectFetcher.java b/src/main/java/net/aufdemrand/denizen/objects/ObjectFetcher.java index 78ae0b3db8..91e61c1e60 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/ObjectFetcher.java +++ b/src/main/java/net/aufdemrand/denizen/objects/ObjectFetcher.java @@ -112,7 +112,8 @@ public static T getObjectFrom(Class dClass, String value, String[] properties = m.group(2).split(";"); for (String property: properties) { String[] data = property.split("=", 2); - ((Adjustable) gotten).adjust(new Mechanism(new Element(data[0]), new Element(data[1]))); + ((Adjustable) gotten).adjust(new Mechanism(new Element(data[0]), + new Element(data[1].replace((char)0x2011, ';')))); } } return gotten; diff --git a/src/main/java/net/aufdemrand/denizen/objects/dItem.java b/src/main/java/net/aufdemrand/denizen/objects/dItem.java index 1e924530b4..ed2884db7f 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/dItem.java +++ b/src/main/java/net/aufdemrand/denizen/objects/dItem.java @@ -3,6 +3,7 @@ import net.aufdemrand.denizen.exceptions.InvalidArgumentsException; import net.aufdemrand.denizen.objects.notable.Notable; import net.aufdemrand.denizen.objects.notable.NotableManager; +import net.aufdemrand.denizen.objects.properties.Item.ItemDisplayname; import net.aufdemrand.denizen.objects.properties.Property; import net.aufdemrand.denizen.objects.properties.PropertyParser; import net.aufdemrand.denizen.scripts.ScriptRegistry; @@ -662,14 +663,10 @@ public String getAttribute(Attribute attribute) { // Returns whether the item has a custom set display name. // --> if (attribute.startsWith("has_display")) { - if (getItemStack().hasItemMeta() && getItemStack().getItemMeta().hasDisplayName()) { - return Element.TRUE - .getAttribute(attribute.fulfill(1)); - } - else { - return Element.FALSE - .getAttribute(attribute.fulfill(1)); - } + if (ItemDisplayname.describes(this)) + return Element.TRUE.getAttribute(attribute.fulfill(1)); + else + return Element.FALSE.getAttribute(attribute.fulfill(1)); } // <--[tag] @@ -763,28 +760,6 @@ public String getAttribute(Attribute attribute) { .getAttribute(attribute.fulfill(1)); } - // <--[tag] - // @attribute - // @returns dList - // @description - // Returns lore as a dList. Excludes the custom-script-id lore. - // To get that information, use . - // --> - if (attribute.startsWith("lore")) { - if (getItemStack().hasItemMeta() && getItemStack().getItemMeta().hasLore()) { - - List loreList = new ArrayList(); - - for (String itemLore : getItemStack().getItemMeta().getLore()) { - if (!itemLore.startsWith(itemscriptIdentifier)) { - loreList.add(itemLore); - } - } - return new dList(loreList).getAttribute(attribute.fulfill(1)); - } - else return new dList("").getAttribute(attribute.fulfill(1)); - } - if (attribute.startsWith("prefix")) return new Element(prefix) .getAttribute(attribute.fulfill(1)); diff --git a/src/main/java/net/aufdemrand/denizen/objects/properties/Item/ItemDisplayname.java b/src/main/java/net/aufdemrand/denizen/objects/properties/Item/ItemDisplayname.java index ebbdf3692a..993b15dbfe 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/properties/Item/ItemDisplayname.java +++ b/src/main/java/net/aufdemrand/denizen/objects/properties/Item/ItemDisplayname.java @@ -42,7 +42,6 @@ public String getAttribute(Attribute attribute) { return new Element(item.getItemStack().getItemMeta().getDisplayName()) .getAttribute(attribute.fulfill(1)); - return null; } diff --git a/src/main/java/net/aufdemrand/denizen/objects/properties/Item/ItemLore.java b/src/main/java/net/aufdemrand/denizen/objects/properties/Item/ItemLore.java new file mode 100644 index 0000000000..4866e6090c --- /dev/null +++ b/src/main/java/net/aufdemrand/denizen/objects/properties/Item/ItemLore.java @@ -0,0 +1,75 @@ +package net.aufdemrand.denizen.objects.properties.Item; + + +import net.aufdemrand.denizen.objects.Element; +import net.aufdemrand.denizen.objects.dItem; +import net.aufdemrand.denizen.objects.dList; +import net.aufdemrand.denizen.objects.dObject; +import net.aufdemrand.denizen.objects.properties.Property; +import net.aufdemrand.denizen.tags.Attribute; + +import java.util.ArrayList; +import java.util.List; + +public class ItemLore implements Property { + + public static boolean describes(dObject item) { + return item instanceof dItem + && ((dItem) item).getItemStack().hasItemMeta() + && ((dItem) item).getItemStack().getItemMeta().hasLore(); + } + + public static ItemLore getFrom(dObject _item) { + if (!describes(_item)) return null; + else return new ItemLore((dItem)_item); + } + + + private ItemLore(dItem _item) { + item = _item; + } + + dItem item; + + @Override + public String getAttribute(Attribute attribute) { + + if (attribute == null) return "null"; + + // <--[tag] + // @attribute + // @returns dList + // @description + // Returns lore as a dList. Excludes the custom-script-id lore. + // To get that information, use . + // --> + if (attribute.startsWith("lore")) { + List loreList = new ArrayList(); + for (String itemLore : item.getItemStack().getItemMeta().getLore()) { + if (!itemLore.startsWith(dItem.itemscriptIdentifier)) { + loreList.add(itemLore); + } + } + return new dList(loreList).getAttribute(attribute.fulfill(1)); + } + + return null; + } + + + @Override + public String getPropertyString() { + StringBuilder output = new StringBuilder(); + for (String itemLore : item.getItemStack().getItemMeta().getLore()) { + if (!itemLore.startsWith(dItem.itemscriptIdentifier)) { + output.append(itemLore).append("|"); + } + } + return (output.length() == 0) ? "": output.substring(0, output.length() - 1); + } + + @Override + public String getPropertyId() { + return "lore"; + } +} diff --git a/src/main/java/net/aufdemrand/denizen/objects/properties/PropertyParser.java b/src/main/java/net/aufdemrand/denizen/objects/properties/PropertyParser.java index 4439c42cca..795294d5e6 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/properties/PropertyParser.java +++ b/src/main/java/net/aufdemrand/denizen/objects/properties/PropertyParser.java @@ -36,6 +36,7 @@ public PropertyParser() { // register core dItem properties registerProperty(ItemEnchantments.class, dItem.class); registerProperty(ItemDisplayname.class, dItem.class); + registerProperty(ItemLore.class, dItem.class); } @@ -73,7 +74,8 @@ public static String getPropertiesString(dObject object) { for (Property property: getProperties(object)) { String description = property.getPropertyString(); if (description != null) { - prop_string.append(property.getPropertyId()).append('=').append(description).append(';'); + prop_string.append(property.getPropertyId()).append('=') + .append(description.replace(';', (char)0x2011)).append(';'); } } diff --git a/src/main/java/net/aufdemrand/denizen/scripts/commands/player/ChatCommand.java b/src/main/java/net/aufdemrand/denizen/scripts/commands/player/ChatCommand.java index e4fa99dcd5..b63d558ab8 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/commands/player/ChatCommand.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/commands/player/ChatCommand.java @@ -5,6 +5,7 @@ import net.aufdemrand.denizen.objects.*; import net.aufdemrand.denizen.scripts.ScriptEntry; import net.aufdemrand.denizen.scripts.commands.AbstractCommand; +import net.aufdemrand.denizen.tags.TagManager; import net.aufdemrand.denizen.utilities.Utilities; import net.aufdemrand.denizen.utilities.debugging.dB; import net.citizensnpcs.api.CitizensAPI; @@ -107,7 +108,7 @@ public void execute(ScriptEntry scriptEntry) throws CommandExecutionException { dB.report(scriptEntry, getName(), talkers.debug() + targets.debug() + message.debug()); // Create new speech context - SpeechContext context = new SpeechContext(message.asString()); + SpeechContext context = new SpeechContext(TagManager.CleanOutputFully(message.asString())); if (!targets.equals(Element.FALSE)) { diff --git a/src/main/java/net/aufdemrand/denizen/scripts/commands/player/NarrateCommand.java b/src/main/java/net/aufdemrand/denizen/scripts/commands/player/NarrateCommand.java index 21863bd29d..fb7befc35c 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/commands/player/NarrateCommand.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/commands/player/NarrateCommand.java @@ -11,6 +11,7 @@ import net.aufdemrand.denizen.scripts.ScriptRegistry; import net.aufdemrand.denizen.scripts.commands.AbstractCommand; import net.aufdemrand.denizen.scripts.containers.core.FormatScriptContainer; +import net.aufdemrand.denizen.tags.TagManager; import net.aufdemrand.denizen.utilities.debugging.dB; /** @@ -50,7 +51,7 @@ else if ((arg.matchesPrefix("target") || arg.matchesPrefix(TARGET_ARG))) { // Use raw_value as to not accidentally strip a value before any :'s. else { if (!scriptEntry.hasObject("text")) - scriptEntry.addObject("text", new Element(arg.raw_value)); + scriptEntry.addObject("text", new Element(TagManager.CleanOutputFully(arg.raw_value))); } } diff --git a/src/main/java/net/aufdemrand/denizen/tags/TagManager.java b/src/main/java/net/aufdemrand/denizen/tags/TagManager.java index 8845a4b9a1..6f82978b08 100644 --- a/src/main/java/net/aufdemrand/denizen/tags/TagManager.java +++ b/src/main/java/net/aufdemrand/denizen/tags/TagManager.java @@ -52,6 +52,23 @@ public void registerCoreTags() { denizen.getServer().getPluginManager().registerEvents(this, denizen); } + // INTERNAL MAPPING NOTE: + // 0x01: < + // 0x02: > + // 0x04: Exclusively For Utilities.talkToNPC() + // 0x05: | + // 0x2011: ; + + public static String CleanOutput(String input) { + return input.replace((char)0x01, '<').replace((char)0x02, '>') + /*.replace((char)0x2011, ';')*/.replace(dList.internal_escape_char, '|'); + } + + public static String CleanOutputFully(String input) { + return input.replace((char)0x01, '<').replace((char)0x02, '>') + .replace((char)0x2011, ';').replace(dList.internal_escape_char, '|'); + } + @EventHandler public void fetchObject(ReplaceableTagEvent event) { if (!event.getName().contains("@")) return; @@ -114,9 +131,7 @@ public static String tag(dPlayer player, dNPC npc, String arg, boolean instant, // Find location of the first tag int[] positions = locateTag(arg); if (positions == null) { - // Unescape internal escape codes. - arg = arg.replace((char)0x01, '<').replace((char)0x02, '>').replace(dList.internal_escape, "|"); - return arg; + return CleanOutput(arg); } int failsafe = 0; @@ -144,10 +159,7 @@ public static String tag(dPlayer player, dNPC npc, String arg, boolean instant, positions = locateTag(arg); } while (positions != null || failsafe < 50); - // Unescape internal escape codes. - arg = arg.replace((char)0x01, '<').replace((char)0x02, '>').replace(dList.internal_escape, "|"); - - return arg; + return CleanOutput(arg); } // Match all < > brackets that don't contain < > inside them diff --git a/src/main/java/net/aufdemrand/denizen/tags/core/TextTags.java b/src/main/java/net/aufdemrand/denizen/tags/core/TextTags.java index 229026420a..a811099e7c 100644 --- a/src/main/java/net/aufdemrand/denizen/tags/core/TextTags.java +++ b/src/main/java/net/aufdemrand/denizen/tags/core/TextTags.java @@ -468,6 +468,15 @@ else if (event.getName().equalsIgnoreCase("&dq")) else if (event.getName().equalsIgnoreCase("&co")) event.setReplaced(new Element(":").getAttribute(attribute.fulfill(1))); + // <--[tag] + // @attribute <&sc> + // @returns Element + // @description + // Returns a semicolon symbol: ; + // --> + else if (event.getName().equalsIgnoreCase("&sc")) + event.setReplaced(new Element(String.valueOf((char)0x2011)).getAttribute(attribute.fulfill(1))); + // <--[tag] // @attribute <&rb> // @returns Element diff --git a/src/main/java/net/aufdemrand/denizen/utilities/Utilities.java b/src/main/java/net/aufdemrand/denizen/utilities/Utilities.java index fdff2f3b85..53db295e5c 100644 --- a/src/main/java/net/aufdemrand/denizen/utilities/Utilities.java +++ b/src/main/java/net/aufdemrand/denizen/utilities/Utilities.java @@ -108,7 +108,7 @@ public static String[] wrapWords(String text, int width) { * */ public static void talkToNPC(String message, dPlayer player, dNPC npc, double range) { - String replacer = String.valueOf((char)0x03); + String replacer = String.valueOf((char)0x04); // Get formats from Settings, and fill in String talkFormat = Settings.ChatToNpcFormat() .replace("", replacer).replace("", replacer).replace("", replacer); diff --git a/src/main/java/net/aufdemrand/denizen/utilities/debugging/dB.java b/src/main/java/net/aufdemrand/denizen/utilities/debugging/dB.java index 8141ccb648..d0ad6f272e 100644 --- a/src/main/java/net/aufdemrand/denizen/utilities/debugging/dB.java +++ b/src/main/java/net/aufdemrand/denizen/utilities/debugging/dB.java @@ -10,6 +10,7 @@ import net.aufdemrand.denizen.Settings; +import net.aufdemrand.denizen.tags.TagManager; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @@ -297,10 +298,10 @@ public static void sendMessage(String string) { // These colors are used a lot in the debugging of commands/etc, so having a few shortcuts is nicer // than having a bunch of ChatColor.XXXX - string = string + string = TagManager.CleanOutputFully(string .replace("", ChatColor.YELLOW.toString()) .replace("", ChatColor.DARK_GRAY.toString()) - .replace("", ChatColor.AQUA.toString()); + .replace("", ChatColor.AQUA.toString())); // 'Hack-fix' for disallowing multiple 'footers' to print in a row if (string.equals(ChatColor.LIGHT_PURPLE + "+---------------------+")) {