diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java index 0745e769f3..d90093cb4f 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java @@ -148,6 +148,10 @@ public static void registerMainProperties() { PropertyParser.registerProperty(ItemInventory.class, ItemTag.class); PropertyParser.registerProperty(ItemKnowledgeBookRecipes.class, ItemTag.class); PropertyParser.registerProperty(ItemLock.class, ItemTag.class); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_16)) { + PropertyParser.registerProperty(ItemLodestoneLocation.class, ItemTag.class); + PropertyParser.registerProperty(ItemLodestoneTracked.class, ItemTag.class); + } PropertyParser.registerProperty(ItemLore.class, ItemTag.class); PropertyParser.registerProperty(ItemMap.class, ItemTag.class); PropertyParser.registerProperty(ItemNBT.class, ItemTag.class); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemLodestoneLocation.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemLodestoneLocation.java new file mode 100644 index 0000000000..667e6c0361 --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemLodestoneLocation.java @@ -0,0 +1,116 @@ +package com.denizenscript.denizen.objects.properties.item; + +import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizen.objects.LocationTag; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.properties.Property; +import com.denizenscript.denizencore.tags.Attribute; +import org.bukkit.Material; +import org.bukkit.inventory.meta.CompassMeta; + +public class ItemLodestoneLocation implements Property { + + public static boolean describes(ObjectTag item) { + return item instanceof ItemTag + && (((ItemTag) item).getBukkitMaterial() == Material.COMPASS); + } + + public static ItemLodestoneLocation getFrom(ObjectTag _item) { + if (!describes(_item)) { + return null; + } + else { + return new ItemLodestoneLocation((ItemTag) _item); + } + } + + public static final String[] handledTags = new String[] { + "lodestone_location" + }; + + public static final String[] handledMechs = new String[] { + "lodestone_location" + }; + + private ItemLodestoneLocation(ItemTag _item) { + item = _item; + } + + ItemTag item; + + @Override + public ObjectTag getObjectAttribute(Attribute attribute) { + + if (attribute == null) { + return null; + } + + // <--[tag] + // @attribute + // @returns LocationTag + // @group properties + // @mechanism ItemTag.lodestone_location + // @description + // Returns the lodestone location this compass is pointing at (if any). + // See also <@link tag ItemTag.lodestone_tracked> + // --> + if (attribute.startsWith("lodestone_location")) { + LocationTag target = getTarget(); + if (target == null) { + return null; + } + return target.getObjectAttribute(attribute.fulfill(1)); + } + + return null; + } + + public LocationTag getTarget() { + CompassMeta meta = (CompassMeta) item.getItemMeta(); + if (meta.getLodestone() == null) { + return null; + } + return new LocationTag(meta.getLodestone()); + } + + @Override + public String getPropertyString() { + LocationTag target = getTarget(); + if (target == null) { + return null; + } + return target.identify(); + } + + @Override + public String getPropertyId() { + return "lodestone_location"; + } + + @Override + public void adjust(Mechanism mechanism) { + + // <--[mechanism] + // @object ItemTag + // @name lodestone_location + // @input LocationTag + // @description + // Changes the lodestone location this compass is pointing at. + // See also <@link mechanism ItemTag.lodestone_tracked> + // Give no input to unset. + // @tags + // + // --> + if (mechanism.matches("lodestone_location")) { + CompassMeta meta = (CompassMeta) item.getItemMeta(); + if (mechanism.hasValue() && mechanism.requireObject(LocationTag.class)) { + meta.setLodestone(mechanism.valueAsType(LocationTag.class).clone()); + } + else { + meta.setLodestone(null); + } + item.setItemMeta(meta); + } + } +} diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemLodestoneTracked.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemLodestoneTracked.java new file mode 100644 index 0000000000..fadf1aff65 --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemLodestoneTracked.java @@ -0,0 +1,97 @@ +package com.denizenscript.denizen.objects.properties.item; + +import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizen.objects.LocationTag; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.objects.properties.Property; +import com.denizenscript.denizencore.tags.Attribute; +import org.bukkit.Material; +import org.bukkit.inventory.meta.CompassMeta; + +public class ItemLodestoneTracked implements Property { + + public static boolean describes(ObjectTag item) { + return item instanceof ItemTag + && (((ItemTag) item).getBukkitMaterial() == Material.COMPASS); + } + + public static ItemLodestoneTracked getFrom(ObjectTag _item) { + if (!describes(_item)) { + return null; + } + else { + return new ItemLodestoneTracked((ItemTag) _item); + } + } + + public static final String[] handledTags = new String[] { + "lodestone_tracked" + }; + + public static final String[] handledMechs = new String[] { + "lodestone_tracked" + }; + + private ItemLodestoneTracked(ItemTag _item) { + item = _item; + } + + ItemTag item; + + @Override + public ObjectTag getObjectAttribute(Attribute attribute) { + + if (attribute == null) { + return null; + } + + // <--[tag] + // @attribute + // @returns ElementTag(Boolean) + // @group properties + // @mechanism ItemTag.lodestone_tracked + // @description + // Returns whether the compass will track a lodestone. If "true", the compass will only work if there's a lodestone at the target location. + // See also <@link tag ItemTag.lodestone_location> + // --> + if (attribute.startsWith("lodestone_tracked")) { + CompassMeta meta = (CompassMeta) item.getItemMeta(); + return new ElementTag(meta.isLodestoneTracked()).getObjectAttribute(attribute.fulfill(1)); + } + + return null; + } + + @Override + public String getPropertyString() { + CompassMeta meta = (CompassMeta) item.getItemMeta(); + return meta.isLodestoneTracked() ? "true" : "false"; + } + + @Override + public String getPropertyId() { + return "lodestone_tracked"; + } + + @Override + public void adjust(Mechanism mechanism) { + + // <--[mechanism] + // @object ItemTag + // @name lodestone_tracked + // @input ElementTag(Boolean) + // @description + // Changes whether the compass will track a lodestone. If "true", the compass will only work if there's a lodestone at the target location. + // See also <@link mechanism ItemTag.lodestone_location> + // @tags + // + // --> + if (mechanism.matches("lodestone_tracked") && mechanism.requireBoolean()) { + CompassMeta meta = (CompassMeta) item.getItemMeta(); + meta.setLodestoneTracked(mechanism.getValue().asBoolean()); + item.setItemMeta(meta); + } + } +} diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRawNBT.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRawNBT.java index b26f6240cc..0c937887e8 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRawNBT.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRawNBT.java @@ -78,7 +78,9 @@ private ItemRawNBT(ItemTag _item) { // Map specific "map", "map_scale_direction", "Decorations", // Stew specific - "Effects" + "Effects", + // Lodestone compass specific + "LodestoneDimension", "LodestonePos", "LodestoneTracked" }; defaultNbtKeys = new StringHolder[defaultNbtKeysRaw.length]; for (int i = 0; i < defaultNbtKeysRaw.length; i++) {