diff --git a/src/main/java/ch/njol/skript/bukkitutil/ItemUtils.java b/src/main/java/ch/njol/skript/bukkitutil/ItemUtils.java index 3e50c7cca8b..31bf99c2d56 100644 --- a/src/main/java/ch/njol/skript/bukkitutil/ItemUtils.java +++ b/src/main/java/ch/njol/skript/bukkitutil/ItemUtils.java @@ -34,6 +34,8 @@ */ public class ItemUtils { + public static final boolean HAS_MAX_DAMAGE = Skript.methodExists(Damageable.class, "getMaxDamage"); + /** * Gets damage/durability of an item, or 0 if it does not have damage. * @param itemStack Item. @@ -46,6 +48,18 @@ public static int getDamage(ItemStack itemStack) { return 0; // Non damageable item } + /** Gets the max damage/durability of an item + *

NOTE: Will account for custom damageable items in MC 1.20.5+

+ * @param itemStack Item to grab durability from + * @return Max amount of damage this item can take + */ + public static int getMaxDamage(ItemStack itemStack) { + ItemMeta meta = itemStack.getItemMeta(); + if (HAS_MAX_DAMAGE && meta instanceof Damageable && ((Damageable) meta).hasMaxDamage()) + return ((Damageable) meta).getMaxDamage(); + return itemStack.getType().getMaxDurability(); + } + /** * Sets damage/durability of an item if possible. * @param itemStack Item to modify. @@ -72,6 +86,18 @@ public static int getDamage(ItemType itemType) { return 0; // Non damageable item } + /** Gets the max damage/durability of an item + *

NOTE: Will account for custom damageable items in MC 1.20.5+

+ * @param itemType Item to grab durability from + * @return Max amount of damage this item can take + */ + public static int getMaxDamage(ItemType itemType) { + ItemMeta meta = itemType.getItemMeta(); + if (HAS_MAX_DAMAGE && meta instanceof Damageable && ((Damageable) meta).hasMaxDamage()) + return ((Damageable) meta).getMaxDamage(); + return itemType.getMaterial().getMaxDurability(); + } + /** * Sets damage/durability of an item if possible. * @param itemType Item to modify. diff --git a/src/main/java/ch/njol/skript/effects/EffHealth.java b/src/main/java/ch/njol/skript/effects/EffHealth.java index 25715349c19..2cd392e8810 100644 --- a/src/main/java/ch/njol/skript/effects/EffHealth.java +++ b/src/main/java/ch/njol/skript/effects/EffHealth.java @@ -90,7 +90,7 @@ protected void execute(Event event) { if (this.amount == null) { ItemUtils.setDamage(itemType, 0); } else { - ItemUtils.setDamage(itemType, (int) Math2.fit(0, (ItemUtils.getDamage(itemType) + (isHealing ? -amount : amount)), itemType.getMaterial().getMaxDurability())); + ItemUtils.setDamage(itemType, (int) Math2.fit(0, (ItemUtils.getDamage(itemType) + (isHealing ? -amount : amount)), ItemUtils.getMaxDamage(itemType))); } } else if (obj instanceof Slot) { @@ -103,7 +103,7 @@ protected void execute(Event event) { if (this.amount == null) { ItemUtils.setDamage(itemStack, 0); } else { - int damageAmt = (int) Math2.fit(0, (isHealing ? -amount : amount), itemStack.getType().getMaxDurability()); + int damageAmt = (int) Math2.fit(0, (ItemUtils.getDamage(itemStack) + (isHealing ? -amount : amount)), ItemUtils.getMaxDamage(itemStack)); ItemUtils.setDamage(itemStack, damageAmt); }