From 0e03c46652e6cb87f3f1358807fddc83d0c37d6c Mon Sep 17 00:00:00 2001 From: hyper Date: Tue, 17 Jun 2025 19:51:11 -0400 Subject: [PATCH 01/12] Components :o - Added support for the `item_model`, `max_durability`, `food`, `max_stack_size`, and `rarity` item components. - Additionally made sure that the paper `ItemTag.rarity` didn't conflict with the new >1.20 rarity component mech. --- .../paper/properties/PaperItemExtensions.java | 26 ++++--- .../objects/properties/PropertyRegistry.java | 11 +++ .../properties/item/ItemDurability.java | 16 +---- .../objects/properties/item/ItemFood.java | 67 +++++++++++++++++++ .../properties/item/ItemMaxDurability.java | 51 ++++++++++++++ .../properties/item/ItemMaxStackSize.java | 44 ++++++++++++ .../objects/properties/item/ItemModel.java | 45 +++++++++++++ .../objects/properties/item/ItemRarity.java | 48 +++++++++++++ 8 files changed, 282 insertions(+), 26 deletions(-) create mode 100644 plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFood.java create mode 100644 plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxDurability.java create mode 100644 plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxStackSize.java create mode 100644 plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemModel.java create mode 100644 plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRarity.java diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperItemExtensions.java b/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperItemExtensions.java index f2829a34fe..fe2afe8d3b 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperItemExtensions.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperItemExtensions.java @@ -1,5 +1,7 @@ package com.denizenscript.denizen.paper.properties; +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizencore.objects.core.ElementTag; @@ -7,16 +9,18 @@ public class PaperItemExtensions { public static void register() { - // <--[tag] - // @attribute - // @returns ElementTag - // @group paper - // @Plugin Paper - // @description - // Returns the rarity of an item, as "common", "uncommon", "rare", or "epic". - // --> - ItemTag.tagProcessor.registerTag(ElementTag.class, "rarity", (attribute, item) -> { - return new ElementTag(item.getItemStack().getRarity()); - }); + if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_19)) { + // <--[tag] + // @attribute + // @returns ElementTag + // @group paper + // @Plugin Paper + // @description + // Returns the rarity of an item, as "common", "uncommon", "rare", or "epic". + // --> + ItemTag.tagProcessor.registerTag(ElementTag.class, "rarity", (attribute, item) -> { + return new ElementTag(item.getItemStack().getRarity()); + }); + } } } 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 477c8bb129..e9161be14e 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 @@ -239,6 +239,9 @@ public static void registerMainProperties() { registerItemProperty(ItemFireworkPower.class, "fireworks"); registerItemProperty(ItemFirework.class, "fireworks", "firework_explosion"); PropertyParser.registerProperty(ItemFlags.class, ItemTag.class); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { + registerItemProperty(ItemFood.class, "food"); + } PropertyParser.registerProperty(ItemFrameInvisible.class, ItemTag.class); // Special case handling in ItemComponentsPatch PropertyParser.registerProperty(ItemHidden.class, ItemTag.class); // Relevant components control their own hiding internally if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { @@ -251,10 +254,18 @@ public static void registerMainProperties() { registerItemProperty(ItemLodestoneTracked.class, "lodestone_tracker"); registerItemProperty(ItemLore.class, "lore"); registerItemProperty(ItemMap.class, "map_id"); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { + registerItemProperty(ItemMaxDurability.class, "max_damage"); + registerItemProperty(ItemMaxStackSize.class, "max_stack_size"); + registerItemProperty(ItemModel.class, "item_model"); + } PropertyParser.registerProperty(ItemNBT.class, ItemTag.class); registerItemProperty(ItemPatterns.class, "banner_patterns"); registerItemProperty(ItemPotion.class, "potion_contents"); PropertyParser.registerProperty(ItemQuantity.class, ItemTag.class); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { + registerItemProperty(ItemRarity.class, "rarity"); + } PropertyParser.registerProperty(ItemRawNBT.class, ItemTag.class); registerItemProperty(ItemRepairCost.class, "repair_cost"); PropertyParser.registerProperty(ItemScript.class, ItemTag.class); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemDurability.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemDurability.java index ddd46aa1fb..267a094055 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemDurability.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemDurability.java @@ -25,7 +25,7 @@ public static ItemDurability getFrom(ObjectTag _item) { } public static final String[] handledTags = new String[] { - "durability", "max_durability" + "durability" }; public static final String[] handledMechs = new String[] { @@ -58,19 +58,6 @@ public ObjectTag getObjectAttribute(Attribute attribute) { .getObjectAttribute(attribute.fulfill(1)); } - // <--[tag] - // @attribute - // @returns ElementTag(Number) - // @group properties - // @description - // Returns the maximum durability (number of uses) of this item. - // For use with <@link tag ItemTag.durability> and <@link mechanism ItemTag.durability>. - // --> - if (attribute.startsWith("max_durability")) { - return new ElementTag(item.getMaterial().getMaterial().getMaxDurability()) - .getObjectAttribute(attribute.fulfill(1)); - } - return null; } @@ -101,7 +88,6 @@ public void adjust(Mechanism mechanism) { // Changes the durability of damageable items. // @tags // - // // // --> if (mechanism.matches("durability") && mechanism.requireInteger()) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFood.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFood.java new file mode 100644 index 0000000000..88bb79766f --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFood.java @@ -0,0 +1,67 @@ +package com.denizenscript.denizen.objects.properties.item; + +import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.objects.core.MapTag; +import org.bukkit.Material; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.components.FoodComponent; + +public class ItemFood extends ItemProperty { + + // <--[property] + // @object ItemTag + // @name food + // @input MapTag + // @description + // Controls the food properties of the item. + // A food item has the 'nutrition', 'saturation', and 'can_always_eat' properties. + // The 'nutrition' is the amount of hunger points the food restores. + // The 'saturation' is the amount of saturation points the food restores. + // The 'can_always_eat' is a boolean indicating if the food can be eaten even when the player is not hungry. + // --> + + public static boolean describes(ItemTag item) { + return item.getBukkitMaterial() != Material.AIR; + } + + @Override + public MapTag getPropertyValue() { + if (getItemMeta().hasFood()) { + FoodComponent food = getItemMeta().getFood(); + MapTag map = new MapTag(); + map.putObject("nutrition", new ElementTag(food.getNutrition())); + map.putObject("saturation", new ElementTag(food.getSaturation())); + map.putObject("can_always_eat", new ElementTag(food.canAlwaysEat())); + return map; + } + return null; + } + + @Override + public void setPropertyValue(MapTag element, Mechanism mechanism) { + FoodComponent food = getItemMeta().getFood(); + editMeta(ItemMeta.class, meta -> { + if (element.getElement("nutrition") != null) { + food.setNutrition(element.getElement("nutrition").asInt()); + } + if (element.getElement("saturation") != null) { + food.setSaturation(element.getElement("saturation").asFloat()); + } + if (element.getElement("can_always_eat") != null) { + food.setCanAlwaysEat(element.getElement("can_always_eat").asBoolean()); + } + meta.setFood(food); + }); + } + + @Override + public String getPropertyId() { + return "food"; + } + + public static void register() { + autoRegisterNullable("food", ItemFood.class, MapTag.class, false); + } +} diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxDurability.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxDurability.java new file mode 100644 index 0000000000..5e0afac997 --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxDurability.java @@ -0,0 +1,51 @@ +package com.denizenscript.denizen.objects.properties.item; + +import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.core.ElementTag; +import org.bukkit.Material; +import org.bukkit.inventory.meta.Damageable; +import org.bukkit.inventory.meta.ItemMeta; + +public class ItemMaxDurability extends ItemProperty { + + // <--[property] + // @object ItemTag + // @name max_durability + // @input ElementTag + // @description + // Controls the maximum durability of an item. + // --> + + public static boolean describes(ItemTag item) { + return item.getBukkitMaterial() != Material.AIR + && item.getItemMeta() instanceof Damageable; + } + + @Override + public ElementTag getPropertyValue() { + if (getItemMeta() instanceof Damageable damageable + && damageable.hasMaxDamage()) { + damageable.getMaxDamage(); + } + return null; + } + + @Override + public void setPropertyValue(ElementTag element, Mechanism mechanism) { + editMeta(ItemMeta.class, meta -> { + if (meta instanceof Damageable damageable) { + damageable.setMaxDamage(element.asInt()); + } + }); + } + + @Override + public String getPropertyId() { + return "max_durability"; + } + + public static void register() { + autoRegisterNullable("max_durability", ItemMaxDurability.class, ElementTag.class, false); + } +} diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxStackSize.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxStackSize.java new file mode 100644 index 0000000000..79045de9a4 --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxStackSize.java @@ -0,0 +1,44 @@ +package com.denizenscript.denizen.objects.properties.item; + +import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.core.ElementTag; +import org.bukkit.Material; +import org.bukkit.inventory.meta.ItemMeta; + +public class ItemMaxStackSize extends ItemProperty { + + // <--[property] + // @object ItemTag + // @name max_stack_size + // @input ElementTag + // @description + // Controls the maximum stack size of the item. + // --> + + public static boolean describes(ItemTag item) { + return item.getBukkitMaterial() != Material.AIR; + } + + @Override + public ElementTag getPropertyValue() { + if (getItemMeta().hasMaxStackSize()) { + return new ElementTag(getItemMeta().getMaxStackSize()); + } + return null; + } + + @Override + public void setPropertyValue(ElementTag element, Mechanism mechanism) { + editMeta(ItemMeta.class, meta -> meta.setMaxStackSize(element.asInt())); + } + + @Override + public String getPropertyId() { + return "max_stack_size"; + } + + public static void register() { + autoRegisterNullable("max_stack_size", ItemMaxDurability.class, ElementTag.class, false); + } +} diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemModel.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemModel.java new file mode 100644 index 0000000000..6e03b24a4a --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemModel.java @@ -0,0 +1,45 @@ +package com.denizenscript.denizen.objects.properties.item; + +import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizen.utilities.Utilities; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.core.ElementTag; +import org.bukkit.Material; +import org.bukkit.inventory.meta.ItemMeta; + +public class ItemModel extends ItemProperty { + + // <--[property] + // @object ItemTag + // @name item_model + // @input ElementTag + // @description + // Controls the item model of the item in namespaced key format. + // --> + + public static boolean describes(ItemTag item) { + return item.getBukkitMaterial() != Material.AIR; + } + + @Override + public ElementTag getPropertyValue() { + if (getItemMeta().hasItemModel()) { + return new ElementTag(Utilities.namespacedKeyToString(getItemMeta().getItemModel())); + } + return null; + } + + @Override + public void setPropertyValue(ElementTag element, Mechanism mechanism) { + editMeta(ItemMeta.class, meta -> meta.setItemModel(Utilities.parseNamespacedKey(element.toString()))); + } + + @Override + public String getPropertyId() { + return "item_model"; + } + + public static void register() { + autoRegisterNullable("item_model", ItemModel.class, ElementTag.class, false); + } +} diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRarity.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRarity.java new file mode 100644 index 0000000000..ca25feaf16 --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRarity.java @@ -0,0 +1,48 @@ +package com.denizenscript.denizen.objects.properties.item; + +import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizen.utilities.Utilities; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.core.ElementTag; +import org.bukkit.Material; +import org.bukkit.inventory.meta.ItemMeta; + +public class ItemRarity extends ItemProperty { + + // <--[property] + // @object ItemTag + // @name rarity + // @input ElementTag + // @description + // Controls the rarity of the item. + // Valid rarities are: 'COMMON', 'UNCOMMON', 'RARE', and 'EPIC'. + // --> + + public static boolean describes(ItemTag item) { + return item.getBukkitMaterial() != Material.AIR; + } + + @Override + public ElementTag getPropertyValue() { + if (getItemMeta().hasRarity()) { + return Utilities.enumlikeToElement(getItemMeta().getRarity()); + } + return null; + } + + @Override + public void setPropertyValue(ElementTag element, Mechanism mechanism) { + if (mechanism.requireEnum(org.bukkit.inventory.ItemRarity.class)) { + editMeta(ItemMeta.class, meta -> meta.setRarity(element.asEnum(org.bukkit.inventory.ItemRarity.class))); + } + } + + @Override + public String getPropertyId() { + return "rarity"; + } + + public static void register() { + autoRegisterNullable("rarity", ItemRarity.class, ElementTag.class, false); + } +} From 3b843b574a4cc33a5613b4b5438a49c71c693ce8 Mon Sep 17 00:00:00 2001 From: hyper Date: Tue, 17 Jun 2025 21:23:36 -0400 Subject: [PATCH 02/12] Updated name + corrected registration --- .../denizen/objects/properties/item/ItemFood.java | 14 +++++++------- .../objects/properties/item/ItemMaxStackSize.java | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFood.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFood.java index 88bb79766f..86ffbd8c5c 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFood.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFood.java @@ -40,17 +40,17 @@ public MapTag getPropertyValue() { } @Override - public void setPropertyValue(MapTag element, Mechanism mechanism) { + public void setPropertyValue(MapTag map, Mechanism mechanism) { FoodComponent food = getItemMeta().getFood(); editMeta(ItemMeta.class, meta -> { - if (element.getElement("nutrition") != null) { - food.setNutrition(element.getElement("nutrition").asInt()); + if (map.getElement("nutrition") != null) { + food.setNutrition(map.getElement("nutrition").asInt()); } - if (element.getElement("saturation") != null) { - food.setSaturation(element.getElement("saturation").asFloat()); + if (map.getElement("saturation") != null) { + food.setSaturation(map.getElement("saturation").asFloat()); } - if (element.getElement("can_always_eat") != null) { - food.setCanAlwaysEat(element.getElement("can_always_eat").asBoolean()); + if (map.getElement("can_always_eat") != null) { + food.setCanAlwaysEat(map.getElement("can_always_eat").asBoolean()); } meta.setFood(food); }); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxStackSize.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxStackSize.java index 79045de9a4..aded503bf8 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxStackSize.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxStackSize.java @@ -39,6 +39,6 @@ public String getPropertyId() { } public static void register() { - autoRegisterNullable("max_stack_size", ItemMaxDurability.class, ElementTag.class, false); + autoRegisterNullable("max_stack_size", ItemMaxStackSize.class, ElementTag.class, false); } } From 7041ca60a4746809dbcfc5225fbf19bf688127e0 Mon Sep 17 00:00:00 2001 From: hyper Date: Sat, 5 Jul 2025 18:06:44 -0400 Subject: [PATCH 03/12] Addressed comments --- .../paper/properties/PaperItemExtensions.java | 8 ------- .../properties/item/ItemMaxDurability.java | 21 ++++++++++++++----- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperItemExtensions.java b/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperItemExtensions.java index fe2afe8d3b..b5b28a29dd 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperItemExtensions.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperItemExtensions.java @@ -10,14 +10,6 @@ public class PaperItemExtensions { public static void register() { if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_19)) { - // <--[tag] - // @attribute - // @returns ElementTag - // @group paper - // @Plugin Paper - // @description - // Returns the rarity of an item, as "common", "uncommon", "rare", or "epic". - // --> ItemTag.tagProcessor.registerTag(ElementTag.class, "rarity", (attribute, item) -> { return new ElementTag(item.getItemStack().getRarity()); }); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxDurability.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxDurability.java index 5e0afac997..1ef247d38f 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxDurability.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxDurability.java @@ -14,7 +14,9 @@ public class ItemMaxDurability extends ItemProperty { // @name max_durability // @input ElementTag // @description - // Controls the maximum durability of an item. + // Controls the maximum durability of an item, if it can have durability. + // If the item cannot have durability (e.g. is not a tool or armor), this will return null. + // If the item does not have a max durability item component set, this will return the default max durability for the item type. // --> public static boolean describes(ItemTag item) { @@ -24,9 +26,13 @@ public static boolean describes(ItemTag item) { @Override public ElementTag getPropertyValue() { - if (getItemMeta() instanceof Damageable damageable - && damageable.hasMaxDamage()) { - damageable.getMaxDamage(); + if (getItemMeta() instanceof Damageable damageable) { + if (damageable.hasMaxDamage()) { + return new ElementTag(damageable.getMaxDamage()); + } + else { + return new ElementTag(getItemStack().getType().getMaxDurability()); + } } return null; } @@ -35,7 +41,12 @@ public ElementTag getPropertyValue() { public void setPropertyValue(ElementTag element, Mechanism mechanism) { editMeta(ItemMeta.class, meta -> { if (meta instanceof Damageable damageable) { - damageable.setMaxDamage(element.asInt()); + if (element == null) { + damageable.setMaxDamage((int) getItemStack().getType().getMaxDurability()); + } + if (mechanism.requireInteger()) { + damageable.setMaxDamage(element.asInt()); + } } }); } From da0349de07a2c2414b47c3fbcb2fe77e3da46158 Mon Sep 17 00:00:00 2001 From: hyper Date: Thu, 25 Dec 2025 13:53:37 -0500 Subject: [PATCH 04/12] Addressed comments. --- .../objects/properties/item/ItemFood.java | 25 +++++++++++++------ .../properties/item/ItemMaxDurability.java | 3 ++- .../properties/item/ItemMaxStackSize.java | 11 +++++++- .../objects/properties/item/ItemModel.java | 13 ++++++++-- .../objects/properties/item/ItemRarity.java | 7 +++++- 5 files changed, 47 insertions(+), 12 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFood.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFood.java index 86ffbd8c5c..9bbfb2221a 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFood.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFood.java @@ -20,6 +20,10 @@ public class ItemFood extends ItemProperty { // The 'nutrition' is the amount of hunger points the food restores. // The 'saturation' is the amount of saturation points the food restores. // The 'can_always_eat' is a boolean indicating if the food can be eaten even when the player is not hungry. + // @tag + // If the item does not have food properties, this will return null. + // @mechanism + // Provide no input to entirely remove the food component from the item. // --> public static boolean describes(ItemTag item) { @@ -41,16 +45,23 @@ public MapTag getPropertyValue() { @Override public void setPropertyValue(MapTag map, Mechanism mechanism) { - FoodComponent food = getItemMeta().getFood(); editMeta(ItemMeta.class, meta -> { - if (map.getElement("nutrition") != null) { - food.setNutrition(map.getElement("nutrition").asInt()); + if (map == null) { + meta.setFood(null); + return; } - if (map.getElement("saturation") != null) { - food.setSaturation(map.getElement("saturation").asFloat()); + FoodComponent food = meta.getFood(); + ElementTag nutrition = map.getElement("nutrition"); + if (nutrition != null) { + food.setNutrition(nutrition.asInt()); } - if (map.getElement("can_always_eat") != null) { - food.setCanAlwaysEat(map.getElement("can_always_eat").asBoolean()); + ElementTag saturation = map.getElement("saturation"); + if (saturation != null) { + food.setSaturation(saturation.asFloat()); + } + ElementTag canAlwaysEat = map.getElement("can_always_eat"); + if (canAlwaysEat != null) { + food.setCanAlwaysEat(canAlwaysEat.asBoolean()); } meta.setFood(food); }); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxDurability.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxDurability.java index 1ef247d38f..c814e238cd 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxDurability.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxDurability.java @@ -16,6 +16,7 @@ public class ItemMaxDurability extends ItemProperty { // @description // Controls the maximum durability of an item, if it can have durability. // If the item cannot have durability (e.g. is not a tool or armor), this will return null. + // @tag // If the item does not have a max durability item component set, this will return the default max durability for the item type. // --> @@ -44,7 +45,7 @@ public void setPropertyValue(ElementTag element, Mechanism mechanism) { if (element == null) { damageable.setMaxDamage((int) getItemStack().getType().getMaxDurability()); } - if (mechanism.requireInteger()) { + else if (mechanism.requireInteger()) { damageable.setMaxDamage(element.asInt()); } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxStackSize.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxStackSize.java index aded503bf8..f350662d56 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxStackSize.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxStackSize.java @@ -14,6 +14,8 @@ public class ItemMaxStackSize extends ItemProperty { // @input ElementTag // @description // Controls the maximum stack size of the item. + // @mechanism + // Provide no input to reset the max stack size to the default for the item type. // --> public static boolean describes(ItemTag item) { @@ -30,7 +32,14 @@ public ElementTag getPropertyValue() { @Override public void setPropertyValue(ElementTag element, Mechanism mechanism) { - editMeta(ItemMeta.class, meta -> meta.setMaxStackSize(element.asInt())); + editMeta(ItemMeta.class, meta -> { + if (element == null) { + meta.setMaxStackSize(getItemStack().getType().getMaxStackSize()); + } + else { + meta.setMaxStackSize(element.asInt()); + } + }); } @Override diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemModel.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemModel.java index 6e03b24a4a..1266007165 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemModel.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemModel.java @@ -14,7 +14,9 @@ public class ItemModel extends ItemProperty { // @name item_model // @input ElementTag // @description - // Controls the item model of the item in namespaced key format. + // Controls the item model of the item in namespaced key format, if any. + // @mechanism + // Provide no input to remove the item model component from the item. // --> public static boolean describes(ItemTag item) { @@ -31,7 +33,14 @@ public ElementTag getPropertyValue() { @Override public void setPropertyValue(ElementTag element, Mechanism mechanism) { - editMeta(ItemMeta.class, meta -> meta.setItemModel(Utilities.parseNamespacedKey(element.toString()))); + editMeta(ItemMeta.class, meta -> { + if (element == null) { + meta.setItemModel(null); + } + else { + meta.setItemModel(Utilities.parseNamespacedKey(element.toString())); + } + }); } @Override diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRarity.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRarity.java index ca25feaf16..847f714c48 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRarity.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRarity.java @@ -16,6 +16,8 @@ public class ItemRarity extends ItemProperty { // @description // Controls the rarity of the item. // Valid rarities are: 'COMMON', 'UNCOMMON', 'RARE', and 'EPIC'. + // @mechanism + // Provide no input to reset the rarity to the default for the item type. // --> public static boolean describes(ItemTag item) { @@ -32,7 +34,10 @@ public ElementTag getPropertyValue() { @Override public void setPropertyValue(ElementTag element, Mechanism mechanism) { - if (mechanism.requireEnum(org.bukkit.inventory.ItemRarity.class)) { + if (element == null) { + editMeta(ItemMeta.class, meta -> meta.setRarity(getItemMeta().getRarity())); + } + else if (mechanism.requireEnum(org.bukkit.inventory.ItemRarity.class)) { editMeta(ItemMeta.class, meta -> meta.setRarity(element.asEnum(org.bukkit.inventory.ItemRarity.class))); } } From aeba5f670bcd5a133c1f0935b16abfe003d84126 Mon Sep 17 00:00:00 2001 From: hyper Date: Thu, 25 Dec 2025 14:02:20 -0500 Subject: [PATCH 05/12] Max durability tag for <=1.19 --- .../properties/item/ItemDurability.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemDurability.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemDurability.java index 267a094055..b4e25ef3ba 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemDurability.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemDurability.java @@ -1,9 +1,11 @@ package com.denizenscript.denizen.objects.properties.item; +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.objects.ItemTag; -import com.denizenscript.denizencore.objects.core.ElementTag; 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.inventory.meta.Damageable; @@ -58,6 +60,20 @@ public ObjectTag getObjectAttribute(Attribute attribute) { .getObjectAttribute(attribute.fulfill(1)); } + if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_19)) { + // <--[tag] + // @attribute + // @returns ElementTag(Number) + // @group properties + // @description + // Returns the maximum durability (number of uses) of this item. + // For use with <@link tag ItemTag.durability> and <@link mechanism ItemTag.durability>. + // --> + if (attribute.startsWith("max_durability")) { + return new ElementTag(item.getMaterial().getMaterial().getMaxDurability()) + .getObjectAttribute(attribute.fulfill(1)); + } + } return null; } From 90ccdd2944f21f04c11f19ec69ff284fcba46f29 Mon Sep 17 00:00:00 2001 From: hyper Date: Thu, 25 Dec 2025 14:07:00 -0500 Subject: [PATCH 06/12] Update ItemDurability.java --- .../denizen/objects/properties/item/ItemDurability.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemDurability.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemDurability.java index b4e25ef3ba..92ed86a511 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemDurability.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemDurability.java @@ -27,7 +27,7 @@ public static ItemDurability getFrom(ObjectTag _item) { } public static final String[] handledTags = new String[] { - "durability" + "durability", "max_durability" }; public static final String[] handledMechs = new String[] { From 2e0b4fe3d3f41a2cb910db9af7aef6316c667dcc Mon Sep 17 00:00:00 2001 From: hyper Date: Sun, 22 Feb 2026 10:57:37 -0500 Subject: [PATCH 07/12] Reverted changes. --- .../objects/properties/PropertyRegistry.java | 11 --- .../properties/item/ItemDurability.java | 30 ++++--- .../objects/properties/item/ItemFood.java | 78 ------------------- .../properties/item/ItemMaxDurability.java | 63 --------------- .../properties/item/ItemMaxStackSize.java | 53 ------------- .../objects/properties/item/ItemModel.java | 54 ------------- .../objects/properties/item/ItemRarity.java | 53 ------------- 7 files changed, 14 insertions(+), 328 deletions(-) delete mode 100644 plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFood.java delete mode 100644 plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxDurability.java delete mode 100644 plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxStackSize.java delete mode 100644 plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemModel.java delete mode 100644 plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRarity.java 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 3b4530060e..abfdd8ef35 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 @@ -242,9 +242,6 @@ public static void registerMainProperties() { registerItemProperty(ItemFireworkPower.class, "fireworks"); registerItemProperty(ItemFirework.class, "fireworks", "firework_explosion"); PropertyParser.registerProperty(ItemFlags.class, ItemTag.class); - if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { - registerItemProperty(ItemFood.class, "food"); - } PropertyParser.registerProperty(ItemFrameInvisible.class, ItemTag.class); // Special case handling in ItemComponentsPatch PropertyParser.registerProperty(ItemHidden.class, ItemTag.class); // Relevant components control their own hiding internally if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { @@ -257,18 +254,10 @@ public static void registerMainProperties() { registerItemProperty(ItemLodestoneTracked.class, "lodestone_tracker"); registerItemProperty(ItemLore.class, "lore"); registerItemProperty(ItemMap.class, "map_id"); - if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { - registerItemProperty(ItemMaxDurability.class, "max_damage"); - registerItemProperty(ItemMaxStackSize.class, "max_stack_size"); - registerItemProperty(ItemModel.class, "item_model"); - } PropertyParser.registerProperty(ItemNBT.class, ItemTag.class); registerItemProperty(ItemPatterns.class, "banner_patterns"); registerItemProperty(ItemPotion.class, "potion_contents"); PropertyParser.registerProperty(ItemQuantity.class, ItemTag.class); - if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { - registerItemProperty(ItemRarity.class, "rarity"); - } PropertyParser.registerProperty(ItemRawNBT.class, ItemTag.class); registerItemProperty(ItemRepairCost.class, "repair_cost"); PropertyParser.registerProperty(ItemScript.class, ItemTag.class); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemDurability.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemDurability.java index 92ed86a511..ddd46aa1fb 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemDurability.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemDurability.java @@ -1,11 +1,9 @@ package com.denizenscript.denizen.objects.properties.item; -import com.denizenscript.denizen.nms.NMSHandler; -import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizencore.objects.core.ElementTag; 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.inventory.meta.Damageable; @@ -60,20 +58,19 @@ public ObjectTag getObjectAttribute(Attribute attribute) { .getObjectAttribute(attribute.fulfill(1)); } - if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_19)) { - // <--[tag] - // @attribute - // @returns ElementTag(Number) - // @group properties - // @description - // Returns the maximum durability (number of uses) of this item. - // For use with <@link tag ItemTag.durability> and <@link mechanism ItemTag.durability>. - // --> - if (attribute.startsWith("max_durability")) { - return new ElementTag(item.getMaterial().getMaterial().getMaxDurability()) - .getObjectAttribute(attribute.fulfill(1)); - } + // <--[tag] + // @attribute + // @returns ElementTag(Number) + // @group properties + // @description + // Returns the maximum durability (number of uses) of this item. + // For use with <@link tag ItemTag.durability> and <@link mechanism ItemTag.durability>. + // --> + if (attribute.startsWith("max_durability")) { + return new ElementTag(item.getMaterial().getMaterial().getMaxDurability()) + .getObjectAttribute(attribute.fulfill(1)); } + return null; } @@ -104,6 +101,7 @@ public void adjust(Mechanism mechanism) { // Changes the durability of damageable items. // @tags // + // // // --> if (mechanism.matches("durability") && mechanism.requireInteger()) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFood.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFood.java deleted file mode 100644 index 9bbfb2221a..0000000000 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFood.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.denizenscript.denizen.objects.properties.item; - -import com.denizenscript.denizen.objects.ItemTag; -import com.denizenscript.denizencore.objects.Mechanism; -import com.denizenscript.denizencore.objects.core.ElementTag; -import com.denizenscript.denizencore.objects.core.MapTag; -import org.bukkit.Material; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.inventory.meta.components.FoodComponent; - -public class ItemFood extends ItemProperty { - - // <--[property] - // @object ItemTag - // @name food - // @input MapTag - // @description - // Controls the food properties of the item. - // A food item has the 'nutrition', 'saturation', and 'can_always_eat' properties. - // The 'nutrition' is the amount of hunger points the food restores. - // The 'saturation' is the amount of saturation points the food restores. - // The 'can_always_eat' is a boolean indicating if the food can be eaten even when the player is not hungry. - // @tag - // If the item does not have food properties, this will return null. - // @mechanism - // Provide no input to entirely remove the food component from the item. - // --> - - public static boolean describes(ItemTag item) { - return item.getBukkitMaterial() != Material.AIR; - } - - @Override - public MapTag getPropertyValue() { - if (getItemMeta().hasFood()) { - FoodComponent food = getItemMeta().getFood(); - MapTag map = new MapTag(); - map.putObject("nutrition", new ElementTag(food.getNutrition())); - map.putObject("saturation", new ElementTag(food.getSaturation())); - map.putObject("can_always_eat", new ElementTag(food.canAlwaysEat())); - return map; - } - return null; - } - - @Override - public void setPropertyValue(MapTag map, Mechanism mechanism) { - editMeta(ItemMeta.class, meta -> { - if (map == null) { - meta.setFood(null); - return; - } - FoodComponent food = meta.getFood(); - ElementTag nutrition = map.getElement("nutrition"); - if (nutrition != null) { - food.setNutrition(nutrition.asInt()); - } - ElementTag saturation = map.getElement("saturation"); - if (saturation != null) { - food.setSaturation(saturation.asFloat()); - } - ElementTag canAlwaysEat = map.getElement("can_always_eat"); - if (canAlwaysEat != null) { - food.setCanAlwaysEat(canAlwaysEat.asBoolean()); - } - meta.setFood(food); - }); - } - - @Override - public String getPropertyId() { - return "food"; - } - - public static void register() { - autoRegisterNullable("food", ItemFood.class, MapTag.class, false); - } -} diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxDurability.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxDurability.java deleted file mode 100644 index c814e238cd..0000000000 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxDurability.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.denizenscript.denizen.objects.properties.item; - -import com.denizenscript.denizen.objects.ItemTag; -import com.denizenscript.denizencore.objects.Mechanism; -import com.denizenscript.denizencore.objects.core.ElementTag; -import org.bukkit.Material; -import org.bukkit.inventory.meta.Damageable; -import org.bukkit.inventory.meta.ItemMeta; - -public class ItemMaxDurability extends ItemProperty { - - // <--[property] - // @object ItemTag - // @name max_durability - // @input ElementTag - // @description - // Controls the maximum durability of an item, if it can have durability. - // If the item cannot have durability (e.g. is not a tool or armor), this will return null. - // @tag - // If the item does not have a max durability item component set, this will return the default max durability for the item type. - // --> - - public static boolean describes(ItemTag item) { - return item.getBukkitMaterial() != Material.AIR - && item.getItemMeta() instanceof Damageable; - } - - @Override - public ElementTag getPropertyValue() { - if (getItemMeta() instanceof Damageable damageable) { - if (damageable.hasMaxDamage()) { - return new ElementTag(damageable.getMaxDamage()); - } - else { - return new ElementTag(getItemStack().getType().getMaxDurability()); - } - } - return null; - } - - @Override - public void setPropertyValue(ElementTag element, Mechanism mechanism) { - editMeta(ItemMeta.class, meta -> { - if (meta instanceof Damageable damageable) { - if (element == null) { - damageable.setMaxDamage((int) getItemStack().getType().getMaxDurability()); - } - else if (mechanism.requireInteger()) { - damageable.setMaxDamage(element.asInt()); - } - } - }); - } - - @Override - public String getPropertyId() { - return "max_durability"; - } - - public static void register() { - autoRegisterNullable("max_durability", ItemMaxDurability.class, ElementTag.class, false); - } -} diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxStackSize.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxStackSize.java deleted file mode 100644 index f350662d56..0000000000 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemMaxStackSize.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.denizenscript.denizen.objects.properties.item; - -import com.denizenscript.denizen.objects.ItemTag; -import com.denizenscript.denizencore.objects.Mechanism; -import com.denizenscript.denizencore.objects.core.ElementTag; -import org.bukkit.Material; -import org.bukkit.inventory.meta.ItemMeta; - -public class ItemMaxStackSize extends ItemProperty { - - // <--[property] - // @object ItemTag - // @name max_stack_size - // @input ElementTag - // @description - // Controls the maximum stack size of the item. - // @mechanism - // Provide no input to reset the max stack size to the default for the item type. - // --> - - public static boolean describes(ItemTag item) { - return item.getBukkitMaterial() != Material.AIR; - } - - @Override - public ElementTag getPropertyValue() { - if (getItemMeta().hasMaxStackSize()) { - return new ElementTag(getItemMeta().getMaxStackSize()); - } - return null; - } - - @Override - public void setPropertyValue(ElementTag element, Mechanism mechanism) { - editMeta(ItemMeta.class, meta -> { - if (element == null) { - meta.setMaxStackSize(getItemStack().getType().getMaxStackSize()); - } - else { - meta.setMaxStackSize(element.asInt()); - } - }); - } - - @Override - public String getPropertyId() { - return "max_stack_size"; - } - - public static void register() { - autoRegisterNullable("max_stack_size", ItemMaxStackSize.class, ElementTag.class, false); - } -} diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemModel.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemModel.java deleted file mode 100644 index 1266007165..0000000000 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemModel.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.denizenscript.denizen.objects.properties.item; - -import com.denizenscript.denizen.objects.ItemTag; -import com.denizenscript.denizen.utilities.Utilities; -import com.denizenscript.denizencore.objects.Mechanism; -import com.denizenscript.denizencore.objects.core.ElementTag; -import org.bukkit.Material; -import org.bukkit.inventory.meta.ItemMeta; - -public class ItemModel extends ItemProperty { - - // <--[property] - // @object ItemTag - // @name item_model - // @input ElementTag - // @description - // Controls the item model of the item in namespaced key format, if any. - // @mechanism - // Provide no input to remove the item model component from the item. - // --> - - public static boolean describes(ItemTag item) { - return item.getBukkitMaterial() != Material.AIR; - } - - @Override - public ElementTag getPropertyValue() { - if (getItemMeta().hasItemModel()) { - return new ElementTag(Utilities.namespacedKeyToString(getItemMeta().getItemModel())); - } - return null; - } - - @Override - public void setPropertyValue(ElementTag element, Mechanism mechanism) { - editMeta(ItemMeta.class, meta -> { - if (element == null) { - meta.setItemModel(null); - } - else { - meta.setItemModel(Utilities.parseNamespacedKey(element.toString())); - } - }); - } - - @Override - public String getPropertyId() { - return "item_model"; - } - - public static void register() { - autoRegisterNullable("item_model", ItemModel.class, ElementTag.class, false); - } -} diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRarity.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRarity.java deleted file mode 100644 index 847f714c48..0000000000 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRarity.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.denizenscript.denizen.objects.properties.item; - -import com.denizenscript.denizen.objects.ItemTag; -import com.denizenscript.denizen.utilities.Utilities; -import com.denizenscript.denizencore.objects.Mechanism; -import com.denizenscript.denizencore.objects.core.ElementTag; -import org.bukkit.Material; -import org.bukkit.inventory.meta.ItemMeta; - -public class ItemRarity extends ItemProperty { - - // <--[property] - // @object ItemTag - // @name rarity - // @input ElementTag - // @description - // Controls the rarity of the item. - // Valid rarities are: 'COMMON', 'UNCOMMON', 'RARE', and 'EPIC'. - // @mechanism - // Provide no input to reset the rarity to the default for the item type. - // --> - - public static boolean describes(ItemTag item) { - return item.getBukkitMaterial() != Material.AIR; - } - - @Override - public ElementTag getPropertyValue() { - if (getItemMeta().hasRarity()) { - return Utilities.enumlikeToElement(getItemMeta().getRarity()); - } - return null; - } - - @Override - public void setPropertyValue(ElementTag element, Mechanism mechanism) { - if (element == null) { - editMeta(ItemMeta.class, meta -> meta.setRarity(getItemMeta().getRarity())); - } - else if (mechanism.requireEnum(org.bukkit.inventory.ItemRarity.class)) { - editMeta(ItemMeta.class, meta -> meta.setRarity(element.asEnum(org.bukkit.inventory.ItemRarity.class))); - } - } - - @Override - public String getPropertyId() { - return "rarity"; - } - - public static void register() { - autoRegisterNullable("rarity", ItemRarity.class, ElementTag.class, false); - } -} From ce49c3a43cf2bad6f25f70d5c7b0656f28f5f380 Mon Sep 17 00:00:00 2001 From: hyper Date: Sun, 22 Feb 2026 12:02:23 -0500 Subject: [PATCH 08/12] Forgot to revert item extensions file. --- .../paper/properties/PaperItemExtensions.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperItemExtensions.java b/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperItemExtensions.java index b5b28a29dd..f2829a34fe 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperItemExtensions.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperItemExtensions.java @@ -1,7 +1,5 @@ package com.denizenscript.denizen.paper.properties; -import com.denizenscript.denizen.nms.NMSHandler; -import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizencore.objects.core.ElementTag; @@ -9,10 +7,16 @@ public class PaperItemExtensions { public static void register() { - if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_19)) { - ItemTag.tagProcessor.registerTag(ElementTag.class, "rarity", (attribute, item) -> { - return new ElementTag(item.getItemStack().getRarity()); - }); - } + // <--[tag] + // @attribute + // @returns ElementTag + // @group paper + // @Plugin Paper + // @description + // Returns the rarity of an item, as "common", "uncommon", "rare", or "epic". + // --> + ItemTag.tagProcessor.registerTag(ElementTag.class, "rarity", (attribute, item) -> { + return new ElementTag(item.getItemStack().getRarity()); + }); } } From 4323e7d16f088ff8bcb5ab98a9f914e6912e0fc6 Mon Sep 17 00:00:00 2001 From: hyper Date: Sun, 22 Feb 2026 12:02:49 -0500 Subject: [PATCH 09/12] New item component registry system --- .../ComponentAdaptersRegistry.java | 4 +++ .../datacomponents/ItemModelAdapter.java | 35 +++++++++++++++++++ .../datacomponents/MaxDurabilityAdapter.java | 32 +++++++++++++++++ .../datacomponents/MaxStackSizeAdapter.java | 32 +++++++++++++++++ .../paper/datacomponents/RarityAdapter.java | 34 ++++++++++++++++++ 5 files changed, 137 insertions(+) create mode 100644 paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/ItemModelAdapter.java create mode 100644 paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/MaxDurabilityAdapter.java create mode 100644 paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/MaxStackSizeAdapter.java create mode 100644 paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/RarityAdapter.java diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/ComponentAdaptersRegistry.java b/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/ComponentAdaptersRegistry.java index ad691abf2b..2029b783e1 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/ComponentAdaptersRegistry.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/ComponentAdaptersRegistry.java @@ -5,5 +5,9 @@ public class ComponentAdaptersRegistry { public static void register() { DataComponentAdapter.register(new FoodAdapter()); DataComponentAdapter.register(new GliderAdapter()); + DataComponentAdapter.register(new ItemModelAdapter()); + DataComponentAdapter.register(new MaxDurabilityAdapter()); + DataComponentAdapter.register(new MaxStackSizeAdapter()); + DataComponentAdapter.register(new RarityAdapter()); } } diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/ItemModelAdapter.java b/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/ItemModelAdapter.java new file mode 100644 index 0000000000..9b1050b77e --- /dev/null +++ b/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/ItemModelAdapter.java @@ -0,0 +1,35 @@ +package com.denizenscript.denizen.paper.datacomponents; + +import com.denizenscript.denizen.utilities.Utilities; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.core.ElementTag; +import io.papermc.paper.datacomponent.DataComponentTypes; +import net.kyori.adventure.key.Key; + +public class ItemModelAdapter extends DataComponentAdapter.Valued { + + // <--[property] + // @object ItemTag + // @name item_model + // @input ElementTag + // @description + // Controls an item's model <@link language Item Components> in namespaced key format. + // The default namespace is "minecraft", so for example an input of "stone" becomes "minecraft:stone", and will set the item model to a stone block. + // @mechanism + // Provide no input to reset the item to its default value. + // --> + + public ItemModelAdapter() { + super(ElementTag.class, DataComponentTypes.ITEM_MODEL, "item_model"); + } + + @Override + public ElementTag toDenizen(Key value) { + return new ElementTag(value.toString()); + } + + @Override + public Key fromDenizen(ElementTag value, Mechanism mechanism) { + return Utilities.parseNamespacedKey(value.asString()); + } +} diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/MaxDurabilityAdapter.java b/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/MaxDurabilityAdapter.java new file mode 100644 index 0000000000..5fde674193 --- /dev/null +++ b/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/MaxDurabilityAdapter.java @@ -0,0 +1,32 @@ +package com.denizenscript.denizen.paper.datacomponents; + +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.core.ElementTag; +import io.papermc.paper.datacomponent.DataComponentTypes; + +public class MaxDurabilityAdapter extends DataComponentAdapter.Valued { + + // <--[property] + // @object ItemTag + // @name max_durability + // @input ElementTag(Number) + // @description + // Controls an item's max durability <@link language Item Components>. + // @mechanism + // Provide no input to reset the item to its default value. + // --> + + public MaxDurabilityAdapter() { + super(ElementTag.class, DataComponentTypes.MAX_DAMAGE, "max_durability"); + } + + @Override + public ElementTag toDenizen(Integer value) { + return new ElementTag(value); + } + + @Override + public Integer fromDenizen(ElementTag value, Mechanism mechanism) { + return value.asInt(); + } +} diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/MaxStackSizeAdapter.java b/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/MaxStackSizeAdapter.java new file mode 100644 index 0000000000..5d56d8a185 --- /dev/null +++ b/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/MaxStackSizeAdapter.java @@ -0,0 +1,32 @@ +package com.denizenscript.denizen.paper.datacomponents; + +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.core.ElementTag; +import io.papermc.paper.datacomponent.DataComponentTypes; + +public class MaxStackSizeAdapter extends DataComponentAdapter.Valued { + + // <--[property] + // @object ItemTag + // @name max_stack_size + // @input ElementTag(Number) + // @description + // Controls an item's max stack size <@link language Item Components>. + // @mechanism + // Provide no input to reset the item to its default value. + // --> + + public MaxStackSizeAdapter() { + super(ElementTag.class, DataComponentTypes.MAX_STACK_SIZE, "max_stack_size"); + } + + @Override + public ElementTag toDenizen(Integer value) { + return new ElementTag(value); + } + + @Override + public Integer fromDenizen(ElementTag value, Mechanism mechanism) { + return value.asInt(); + } +} diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/RarityAdapter.java b/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/RarityAdapter.java new file mode 100644 index 0000000000..a80841b3da --- /dev/null +++ b/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/RarityAdapter.java @@ -0,0 +1,34 @@ +package com.denizenscript.denizen.paper.datacomponents; + +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.core.ElementTag; +import io.papermc.paper.datacomponent.DataComponentTypes; +import org.bukkit.inventory.ItemRarity; + +public class RarityAdapter extends DataComponentAdapter.Valued { + + // <--[property] + // @object ItemTag + // @name rarity + // @input ElementTag + // @description + // Controls an item's rarity <@link language Item Components>. + // See https://jd.papermc.io/paper/1.21.11/org/bukkit/inventory/ItemRarity.html for valid rarity values. + // @mechanism + // Provide no input to reset the item to its default value. + // --> + + public RarityAdapter() { + super(ElementTag.class, DataComponentTypes.RARITY, "rarity"); + } + + @Override + public ElementTag toDenizen(ItemRarity value) { + return new ElementTag(value); + } + + @Override + public ItemRarity fromDenizen(ElementTag value, Mechanism mechanism) { + return value.asEnum(ItemRarity.class); + } +} From eb4b36a8da07ca7c09a8e59e67cc3b6847c0425a Mon Sep 17 00:00:00 2001 From: hyper Date: Sun, 22 Feb 2026 18:30:49 -0500 Subject: [PATCH 10/12] toString --> asMinimalString --- .../denizen/paper/datacomponents/ItemModelAdapter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/ItemModelAdapter.java b/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/ItemModelAdapter.java index 9b1050b77e..6a8320581a 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/ItemModelAdapter.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/ItemModelAdapter.java @@ -25,7 +25,7 @@ public ItemModelAdapter() { @Override public ElementTag toDenizen(Key value) { - return new ElementTag(value.toString()); + return new ElementTag(value.asMinimalString()); } @Override From fe6a2aa7e732d28e7f39d3ea77c695cea78d4140 Mon Sep 17 00:00:00 2001 From: hyper Date: Mon, 23 Feb 2026 10:31:36 -0500 Subject: [PATCH 11/12] Addressed comments --- .../denizen/paper/datacomponents/ItemModelAdapter.java | 3 ++- .../denizen/paper/datacomponents/MaxDurabilityAdapter.java | 2 +- .../denizen/paper/datacomponents/RarityAdapter.java | 2 +- .../denizen/objects/properties/item/ItemCustomModel.java | 2 ++ 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/ItemModelAdapter.java b/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/ItemModelAdapter.java index 6a8320581a..f9eb15acbd 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/ItemModelAdapter.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/ItemModelAdapter.java @@ -15,6 +15,7 @@ public class ItemModelAdapter extends DataComponentAdapter.Valued in namespaced key format. // The default namespace is "minecraft", so for example an input of "stone" becomes "minecraft:stone", and will set the item model to a stone block. + // This can also be used to display item models from your own custom resource packs. // @mechanism // Provide no input to reset the item to its default value. // --> @@ -25,7 +26,7 @@ public ItemModelAdapter() { @Override public ElementTag toDenizen(Key value) { - return new ElementTag(value.asMinimalString()); + return new ElementTag(value.asMinimalString(), true); } @Override diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/MaxDurabilityAdapter.java b/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/MaxDurabilityAdapter.java index 5fde674193..6a9967d95f 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/MaxDurabilityAdapter.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/MaxDurabilityAdapter.java @@ -27,6 +27,6 @@ public ElementTag toDenizen(Integer value) { @Override public Integer fromDenizen(ElementTag value, Mechanism mechanism) { - return value.asInt(); + return mechanism.requireInteger() ? value.asInt() : null; } } diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/RarityAdapter.java b/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/RarityAdapter.java index a80841b3da..c12b42f211 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/RarityAdapter.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/RarityAdapter.java @@ -13,7 +13,7 @@ public class RarityAdapter extends DataComponentAdapter.Valued. - // See https://jd.papermc.io/paper/1.21.11/org/bukkit/inventory/ItemRarity.html for valid rarity values. + // See <@link url https://jd.papermc.io/paper/org/bukkit/inventory/ItemRarity.html> for valid rarity values. // @mechanism // Provide no input to reset the item to its default value. // --> diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemCustomModel.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemCustomModel.java index c47897271e..e97bea7df7 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemCustomModel.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemCustomModel.java @@ -15,6 +15,7 @@ public class ItemCustomModel extends ItemProperty { // @description // Controls the custom model data ID number of the item. // Use with no input to remove the custom model data. + // Prefer <@link property ItemTag.item_model> on MC 1.21+. // See also <@link tag ItemTag.has_custom_model_data> // --> public static boolean describes(ItemTag item) { @@ -56,6 +57,7 @@ public static void register() { // @group properties // @description // Returns whether the item has a custom model data ID number set on it. + // Prefer <@link property ItemTag.item_model> on MC 1.21+. // See also <@link tag ItemTag.custom_model_data>. // --> PropertyParser.registerTag(ItemCustomModel.class, ElementTag.class, "has_custom_model_data", (attribute, prop) -> { From 555b24970cbd7bd2624dd135d10909e471d071bd Mon Sep 17 00:00:00 2001 From: hyper Date: Mon, 23 Feb 2026 11:22:25 -0500 Subject: [PATCH 12/12] tern --- .../denizen/paper/datacomponents/MaxStackSizeAdapter.java | 2 +- .../denizen/paper/datacomponents/RarityAdapter.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/MaxStackSizeAdapter.java b/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/MaxStackSizeAdapter.java index 5d56d8a185..c9365207dd 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/MaxStackSizeAdapter.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/MaxStackSizeAdapter.java @@ -27,6 +27,6 @@ public ElementTag toDenizen(Integer value) { @Override public Integer fromDenizen(ElementTag value, Mechanism mechanism) { - return value.asInt(); + return mechanism.requireInteger() ? value.asInt() : null; } } diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/RarityAdapter.java b/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/RarityAdapter.java index c12b42f211..9772fd51bf 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/RarityAdapter.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/datacomponents/RarityAdapter.java @@ -29,6 +29,6 @@ public ElementTag toDenizen(ItemRarity value) { @Override public ItemRarity fromDenizen(ElementTag value, Mechanism mechanism) { - return value.asEnum(ItemRarity.class); + return mechanism.requireEnum(ItemRarity.class) ? value.asEnum(ItemRarity.class) : null; } }