From 9c841c7253fd955e30e7517d52340428d49cc0f6 Mon Sep 17 00:00:00 2001 From: TauCubed <35522873+TauCubed@users.noreply.github.com> Date: Sun, 14 Jul 2024 00:36:08 +1000 Subject: [PATCH] Fix price restrictions not detecting enchantments in enchanted books (#1650) --- .../SimpleEnchantmentExpressionHandler.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/quickshop-bukkit/src/main/java/com/ghostchu/quickshop/registry/builtin/itemexpression/handlers/SimpleEnchantmentExpressionHandler.java b/quickshop-bukkit/src/main/java/com/ghostchu/quickshop/registry/builtin/itemexpression/handlers/SimpleEnchantmentExpressionHandler.java index 45a403a9f7..05fe7bd4fc 100644 --- a/quickshop-bukkit/src/main/java/com/ghostchu/quickshop/registry/builtin/itemexpression/handlers/SimpleEnchantmentExpressionHandler.java +++ b/quickshop-bukkit/src/main/java/com/ghostchu/quickshop/registry/builtin/itemexpression/handlers/SimpleEnchantmentExpressionHandler.java @@ -6,6 +6,7 @@ import org.bukkit.NamespacedKey; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.EnchantmentStorageMeta; import org.bukkit.plugin.Plugin; import org.jetbrains.annotations.NotNull; @@ -62,12 +63,23 @@ public boolean match(ItemStack stack, String expression) { return false; } - int finalMinLevel = minLevel; - int level = stack.getEnchantmentLevel(enchantment); + int level = 0; + // This is required for enchantment books as they store enchantments differently for some reason. + // We'll check both stored enchantments and regular enchantments, as it is possible to "enchant" + // an enchanted book with an enchantment, rather than adding a stored enchantment. + // Some plugins may do this by accident. + if (stack.getItemMeta() instanceof EnchantmentStorageMeta meta) { + level = meta.getStoredEnchantLevel(enchantment); + } + if (level == 0) { + level = stack.getEnchantmentLevel(enchantment); + } + if (level == 0) { return false; } - if (finalMinLevel != -1 && level < finalMinLevel) { + + if (minLevel != -1 && level < minLevel) { return false; } //noinspection RedundantIfStatement