From 0e03c46652e6cb87f3f1358807fddc83d0c37d6c Mon Sep 17 00:00:00 2001 From: hyper Date: Tue, 17 Jun 2025 19:51:11 -0400 Subject: [PATCH 1/6] 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 2/6] 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 3/6] 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 4/6] 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 5/6] 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 6/6] 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[] {