From 2fe20948f6d9294507b6d623caccb2cd6cd2b5d9 Mon Sep 17 00:00:00 2001 From: mcmonkey Date: Sun, 20 Jan 2019 10:14:52 -0800 Subject: [PATCH] change how item scripts identify to prevent double parsing issues --- .../java/net/aufdemrand/denizen/Denizen.java | 1 + .../denizen/events/BukkitScriptEvent.java | 7 +- .../net/aufdemrand/denizen/objects/dItem.java | 127 +++--------------- .../objects/properties/item/ItemScript.java | 112 +++++++++++++++ .../containers/core/ItemScriptContainer.java | 22 +-- 5 files changed, 138 insertions(+), 131 deletions(-) create mode 100644 plugin/src/main/java/net/aufdemrand/denizen/objects/properties/item/ItemScript.java diff --git a/plugin/src/main/java/net/aufdemrand/denizen/Denizen.java b/plugin/src/main/java/net/aufdemrand/denizen/Denizen.java index 97c0fcdacb..09d0c9de4f 100644 --- a/plugin/src/main/java/net/aufdemrand/denizen/Denizen.java +++ b/plugin/src/main/java/net/aufdemrand/denizen/Denizen.java @@ -903,6 +903,7 @@ public Property get(dObject o) { PropertyParser.registerProperty(ItemPotion.class, dItem.class); } PropertyParser.registerProperty(ItemQuantity.class, dItem.class); + PropertyParser.registerProperty(ItemScript.class, dItem.class); PropertyParser.registerProperty(ItemSignContents.class, dItem.class); PropertyParser.registerProperty(ItemSkullskin.class, dItem.class); if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_9_R2)) { diff --git a/plugin/src/main/java/net/aufdemrand/denizen/events/BukkitScriptEvent.java b/plugin/src/main/java/net/aufdemrand/denizen/events/BukkitScriptEvent.java index 72f2162beb..21b523c9c7 100644 --- a/plugin/src/main/java/net/aufdemrand/denizen/events/BukkitScriptEvent.java +++ b/plugin/src/main/java/net/aufdemrand/denizen/events/BukkitScriptEvent.java @@ -157,16 +157,13 @@ public boolean tryItem(dItem item, String comparedto) { String regexd = regexHandle(comparedto); item = new dItem(item.getItemStack().clone()); item.setAmount(1); - if (equalityCheck(item.identifyNoIdentifier(), comparedto, regexd)) { + if (equalityCheck(item.identify().substring("i@".length()), comparedto, regexd)) { return true; } else if (equalityCheck(item.identifyMaterialNoIdentifier(), comparedto, regexd)) { return true; } - else if (equalityCheck(item.identifySimpleNoIdentifier(), comparedto, regexd)) { - return true; - } - else if (equalityCheck(item.identifyNoIdentifier(), comparedto, regexd)) { + else if (equalityCheck(item.identifySimple().substring("i@".length()), comparedto, regexd)) { return true; } item.setDurability((short) 0); diff --git a/plugin/src/main/java/net/aufdemrand/denizen/objects/dItem.java b/plugin/src/main/java/net/aufdemrand/denizen/objects/dItem.java index 5acaaf7d22..d701279c6f 100644 --- a/plugin/src/main/java/net/aufdemrand/denizen/objects/dItem.java +++ b/plugin/src/main/java/net/aufdemrand/denizen/objects/dItem.java @@ -1,7 +1,9 @@ package net.aufdemrand.denizen.objects; +import net.aufdemrand.denizen.Settings; import net.aufdemrand.denizen.nms.NMSHandler; import net.aufdemrand.denizen.nms.NMSVersion; +import net.aufdemrand.denizen.nms.util.jnbt.StringTag; import net.aufdemrand.denizen.objects.notable.NotableManager; import net.aufdemrand.denizen.objects.properties.item.*; import net.aufdemrand.denizen.scripts.containers.core.BookScriptContainer; @@ -25,9 +27,12 @@ import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Item; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.material.MaterialData; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -463,6 +468,22 @@ public String getScriptName() { } } + public void setItemScript(ItemScriptContainer script) { + if (script.contains("NO_ID") && Boolean.valueOf(script.getString("NO_ID"))) { + return; + } + if (Settings.packetInterception()) { + setItemStack(NMSHandler.getInstance().getItemHelper().addNbtData(getItemStack(), "Denizen Item Script", new StringTag(script.getHashID()))); + } + else { + ItemMeta meta = item.getItemMeta(); + List lore = meta.hasLore() ? meta.getLore() : new ArrayList<>(); + lore.add(0, script.getHashID()); + meta.setLore(lore); + item.setItemMeta(meta); + } + } + public dMaterial getMaterial() { if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_13_R2)) { return dMaterial.getMaterialFrom(getItemStack().getType()); @@ -549,11 +570,6 @@ public String identify() { return "i@" + NotableManager.getSavedId(this) + PropertyParser.getPropertiesString(this); } - // If not a saved item, but is a custom item, return the script id - else if (isItemscript()) { - return "i@" + getScriptName() + PropertyParser.getPropertiesString(this); - } - // Else, return the material name else if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_12_R1) && (item.getDurability() >= 16 || item.getDurability() < 0) && item.getType() != Material.AIR) { return "i@" + getMaterial().realName() + "," + item.getDurability() + PropertyParser.getPropertiesString(this); @@ -593,56 +609,8 @@ public String identifyMaterialNoIdentifier() { return getMaterial().identifySimpleNoIdentifier(); } - public String identifyNoIdentifier() { - - if (item == null) { - return "null"; - } - - if (item.getType() != Material.AIR) { - - // If saved item, return that - if (isUnique()) { - return NotableManager.getSavedId(this) + (item.getAmount() == 1 ? "" : "[quantity=" + item.getAmount() + "]"); - } - - // If not a saved item, but is a custom item, return the script id - else if (isItemscript()) { - return getScriptName() + (item.getAmount() == 1 ? "" : "[quantity=" + item.getAmount() + "]"); - } - } - - // Else, return the material name - if (item.getDurability() >= 16 || item.getDurability() < 0) { - return getMaterial().realName() + "," + item.getDurability() + PropertyParser.getPropertiesString(this); - } - return getMaterial().identifyNoIdentifier() + PropertyParser.getPropertiesString(this); - } - - public String identifySimpleNoIdentifier() { - if (item == null) { - return "null"; - } - - if (item.getType() != Material.AIR) { - - // If saved item, return that - if (isUnique()) { - return NotableManager.getSavedId(this); - } - - // If not a saved item, but is a custom item, return the script id - else if (isItemscript()) { - return getScriptName(); - } - } - - // Else, return the material name - return identifyMaterialNoIdentifier(); - } - public String getFullString() { - return "i@" + (isItemscript() ? getScriptName() : getMaterial().realName()) + "," + item.getDurability() + PropertyParser.getPropertiesString(this); + return "i@" + getMaterial().realName() + "," + item.getDurability() + PropertyParser.getPropertiesString(this); } @@ -903,57 +871,6 @@ public String run(Attribute attribute, dObject object) { } }); - // <--[tag] - // @attribute - // @returns Element(Boolean) - // @group scripts - // @description - // Returns whether the item was created by an item script. - // --> - registerTag("has_script", new TagRunnable() { - @Override - public String run(Attribute attribute, dObject object) { - return new Element(((dItem) object).isItemscript()) - .getAttribute(attribute.fulfill(1)); - } - }); - - // <--[tag] - // @attribute - // @returns Element - // @group scripts - // @description - // Returns the script name of the item if it was created by an item script. - // --> - registerTag("scriptname", new TagRunnable() { - @Override - public String run(Attribute attribute, dObject object) { - if (((dItem) object).isItemscript()) { - return new Element(((dItem) object).getScriptName()) - .getAttribute(attribute.fulfill(1)); - } - return null; - } - }); - - // <--[tag] - // @attribute - // @returns dScript - // @group scripts - // @description - // Returns the script of the item if it was created by an item script. - // --> - registerTag("script", new TagRunnable() { - @Override - public String run(Attribute attribute, dObject object) { - if (((dItem) object).isItemscript()) { - return new dScript(((dItem) object).getScriptName()) - .getAttribute(attribute.fulfill(1)); - } - return null; - } - }); - registerTag("prefix", new TagRunnable() { @Override public String run(Attribute attribute, dObject object) { diff --git a/plugin/src/main/java/net/aufdemrand/denizen/objects/properties/item/ItemScript.java b/plugin/src/main/java/net/aufdemrand/denizen/objects/properties/item/ItemScript.java new file mode 100644 index 0000000000..8487ef3466 --- /dev/null +++ b/plugin/src/main/java/net/aufdemrand/denizen/objects/properties/item/ItemScript.java @@ -0,0 +1,112 @@ +package net.aufdemrand.denizen.objects.properties.item; + +import net.aufdemrand.denizen.objects.dItem; +import net.aufdemrand.denizen.scripts.containers.core.ItemScriptContainer; +import net.aufdemrand.denizen.utilities.debugging.dB; +import net.aufdemrand.denizencore.objects.*; +import net.aufdemrand.denizencore.objects.properties.Property; +import net.aufdemrand.denizencore.tags.Attribute; + +public class ItemScript implements Property { + + public static boolean describes(dObject item) { + // All items can have a script + return item instanceof dItem; + } + + public static ItemScript getFrom(dObject _item) { + if (!describes(_item)) { + return null; + } + else { + return new ItemScript((dItem) _item); + } + } + + private ItemScript(dItem _item) { + item = _item; + } + + dItem item; + + @Override + public String getAttribute(Attribute attribute) { + + if (attribute == null) { + return null; + } + + // <--[tag] + // @attribute + // @returns Element(Boolean) + // @group scripts + // @description + // Returns whether the item was created by an item script. + // --> + if (attribute.startsWith("has_script")) { + return new Element(item.isItemscript()) + .getAttribute(attribute.fulfill(1)); + } + + // <--[tag] + // @attribute + // @returns Element + // @group scripts + // @description + // Returns the script name of the item if it was created by an item script. + // --> + if (attribute.startsWith("scriptname")) { + if (item.isItemscript()) { + return new Element(item.getScriptName()) + .getAttribute(attribute.fulfill(1)); + } + } + + // <--[tag] + // @attribute + // @returns dScript + // @group scripts + // @description + // Returns the script of the item if it was created by an item script. + // --> + if (attribute.startsWith("script")) { + if (item.isItemscript()) { + return new dScript(item.getScriptName()) + .getAttribute(attribute.fulfill(1)); + } + } + return null; + } + + + @Override + public String getPropertyString() { + if (item.isItemscript()) { + return item.getScriptName(); + } + else { + return null; + } + } + + @Override + public String getPropertyId() { + return "script"; + } + + @Override + public void adjust(Mechanism mechanism) { + + // Undocumented as meant for internal usage. + + if (mechanism.matches("script") && mechanism.requireObject(dScript.class)) { + dScript script = mechanism.getValue().asType(dScript.class); + if (script.getContainer() instanceof ItemScriptContainer) { + item.setItemScript((ItemScriptContainer) script.getContainer()); + } + else { + dB.echoError("Script '" + script.getName() + "' is not an item script (but was specified as one)."); + } + } + } +} diff --git a/plugin/src/main/java/net/aufdemrand/denizen/scripts/containers/core/ItemScriptContainer.java b/plugin/src/main/java/net/aufdemrand/denizen/scripts/containers/core/ItemScriptContainer.java index 029d23c5ec..0041704da6 100644 --- a/plugin/src/main/java/net/aufdemrand/denizen/scripts/containers/core/ItemScriptContainer.java +++ b/plugin/src/main/java/net/aufdemrand/denizen/scripts/containers/core/ItemScriptContainer.java @@ -1,8 +1,5 @@ package net.aufdemrand.denizen.scripts.containers.core; -import net.aufdemrand.denizen.Settings; -import net.aufdemrand.denizen.nms.NMSHandler; -import net.aufdemrand.denizen.nms.util.jnbt.StringTag; import net.aufdemrand.denizen.objects.dItem; import net.aufdemrand.denizen.objects.dNPC; import net.aufdemrand.denizen.objects.dPlayer; @@ -181,21 +178,6 @@ public dItem getItemFrom(dPlayer player, dNPC npc) { ItemMeta meta = stack.getItemStack().getItemMeta(); List lore = meta.hasLore() ? meta.getLore() : new ArrayList(); - // Set Id of the first, invisible lore - boolean hideLore = false; - boolean pureNbtId = false; - if (contains("NO_ID")) { - hideLore = Boolean.valueOf(getString("NO_ID")); - } - if (!hideLore) { - if (!Settings.packetInterception()) { - lore.add(0, hash); - } - else { - pureNbtId = true; - } - } - // Set Display Name if (contains("DISPLAY NAME")) { String displayName = TagManager.tag(getString("DISPLAY NAME"), new BukkitTagContext(player, npc, false, null, debug, new dScript(this))); @@ -265,9 +247,7 @@ public dItem getItemFrom(dPlayer player, dNPC npc) { stack = book.writeBookTo(stack, player, npc); } - if (pureNbtId) { - stack.setItemStack(NMSHandler.getInstance().getItemHelper().addNbtData(stack.getItemStack(), "Denizen Item Script", new StringTag(hash))); - } + stack.setItemScript(this); } catch (Exception e) { dB.echoError("Woah! An exception has been called with this item script!");