From c7fee98d44c11a3077c5b728db6ddfdd4b496ce8 Mon Sep 17 00:00:00 2001 From: alexcrea <42614139+alexcrea@users.noreply.github.com> Date: Sun, 16 Jun 2024 04:55:23 +0200 Subject: [PATCH] Fixed strange issue related to item meta. Added more verbose debug log. --- .../cuanvil/enchant/WrappedEnchantment.java | 13 ++++--------- .../cuanvil/enchant/wrapped/VanillaEnchant.java | 15 ++++++++++----- .../kotlin/io/delilaheve/AnvilEventListener.kt | 1 + src/main/kotlin/io/delilaheve/util/ItemUtil.kt | 6 ++---- .../cuanvil/group/EnchantConflictGroup.kt | 2 ++ .../cuanvil/group/EnchantConflictManager.kt | 7 ++++--- 6 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/WrappedEnchantment.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/WrappedEnchantment.java index e5456d3..7ec3be6 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/enchant/WrappedEnchantment.java +++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/WrappedEnchantment.java @@ -90,17 +90,15 @@ public abstract class WrappedEnchantment { /** * Force add an enchantment at the provided level. * @param item The item to set the enchantment level. - * @param meta Meta of the provided item. It can be changed, but will not be set on the item. * @param level The level to set the enchantment to. */ - public abstract void addEnchantmentUnsafe(@NotNull ItemStack item, @NotNull ItemMeta meta, int level); + public abstract void addEnchantmentUnsafe(@NotNull ItemStack item, int level); /** * Remove this enchantment from the provided ItemStack. * @param item The item to remove the enchantment. - * @param meta Meta of the provided item. It can be changed, but will not be set on the item. */ - public abstract void removeFrom(@NotNull ItemStack item, @NotNull ItemMeta meta); + public abstract void removeFrom(@NotNull ItemStack item); // Static functions @@ -109,13 +107,10 @@ public abstract class WrappedEnchantment { * @param item Item to be cleared from enchantments. */ public static void clearEnchants(@NotNull ItemStack item){ //TODO faster method to clear vanilla enchantment - ItemMeta meta = item.getItemMeta(); - if(meta == null) return; - for (WrappedEnchantment enchant : getEnchants(item).keySet()) { - enchant.removeFrom(item, meta); + enchant.removeFrom(item); } - item.setItemMeta(meta); + } /** diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/VanillaEnchant.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/VanillaEnchant.java index c0db2f7..cfbde00 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/VanillaEnchant.java +++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/VanillaEnchant.java @@ -46,11 +46,13 @@ public class VanillaEnchant extends WrappedEnchantment { } @Override - public void addEnchantmentUnsafe(@NotNull ItemStack item, @NotNull ItemMeta meta, int level) { + public void addEnchantmentUnsafe(@NotNull ItemStack item, int level) { if (isEnchantedBook(item)) { - EnchantmentStorageMeta bookMeta = ((EnchantmentStorageMeta)meta); + EnchantmentStorageMeta bookMeta = ((EnchantmentStorageMeta)item.getItemMeta()); + assert bookMeta != null; bookMeta.addStoredEnchant(this.enchantment, level, true); + item.setItemMeta(bookMeta); } else { item.addUnsafeEnchantment(this.enchantment, level); } @@ -58,13 +60,16 @@ public class VanillaEnchant extends WrappedEnchantment { } @Override - public void removeFrom(@NotNull ItemStack item, @NotNull ItemMeta meta) { + public void removeFrom(@NotNull ItemStack item) { if (ItemUtil.INSTANCE.isEnchantedBook(item)) { - EnchantmentStorageMeta bookMeta = ((EnchantmentStorageMeta)meta); + EnchantmentStorageMeta bookMeta = ((EnchantmentStorageMeta)item.getItemMeta()); + assert bookMeta != null; bookMeta.removeStoredEnchant(this.enchantment); + item.setItemMeta(bookMeta); + }else{ + item.removeEnchantment(this.enchantment); } - item.removeEnchantment(this.enchantment); } diff --git a/src/main/kotlin/io/delilaheve/AnvilEventListener.kt b/src/main/kotlin/io/delilaheve/AnvilEventListener.kt index 53fedd0..ead5a1a 100644 --- a/src/main/kotlin/io/delilaheve/AnvilEventListener.kt +++ b/src/main/kotlin/io/delilaheve/AnvilEventListener.kt @@ -452,6 +452,7 @@ class AnvilEventListener(private val packetManager: PacketManager) : Listener { if (ConflictType.BIG_CONFLICT == conflictType) { illegalPenalty += ConfigOptions.sacrificeIllegalCost + CustomAnvil.verboseLog("Big conflict. Adding illegal price penalty") } continue } diff --git a/src/main/kotlin/io/delilaheve/util/ItemUtil.kt b/src/main/kotlin/io/delilaheve/util/ItemUtil.kt index 9d7d899..6c627ba 100644 --- a/src/main/kotlin/io/delilaheve/util/ItemUtil.kt +++ b/src/main/kotlin/io/delilaheve/util/ItemUtil.kt @@ -29,13 +29,11 @@ object ItemUtil { fun ItemStack.setEnchantmentsUnsafe(enchantments: Map) { WrappedEnchantment.clearEnchants(this) - val meta = this.itemMeta ?: return - + //TODO maybe faster methode to add vanilla enchantment. maybe move this function to wrapped enchantment enchantments.forEach { (enchantment, level) -> - enchantment.addEnchantmentUnsafe(this, meta, level) + enchantment.addEnchantmentUnsafe(this, level) } - this.itemMeta = meta } /** diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictGroup.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictGroup.kt index edd98f3..2885237 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictGroup.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictGroup.kt @@ -18,6 +18,7 @@ class EnchantConflictGroup( fun allowed(enchants: Set, mat: Material): Boolean { if (enchantments.size < minBeforeBlock) { + CustomAnvil.verboseLog("Conflicting bc of to many enchantments") return true } @@ -31,6 +32,7 @@ class EnchantConflictGroup( if (enchantment !in enchantments) continue CustomAnvil.verboseLog("Enchant ${enchantment.key} is in: ${enchantAmount + 1}/$minBeforeBlock ") if (++enchantAmount > minBeforeBlock) { + CustomAnvil.verboseLog("it is not allowed bc of to many enchantment in conflict") return false } diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt index 06260bf..ae3c59d 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt @@ -160,13 +160,14 @@ class EnchantConflictManager { var result = ConflictType.NO_CONFLICT for (conflict in conflictList) { CustomAnvil.verboseLog("Is against $conflict") - val conflicting = conflict.allowed(base, mat) - CustomAnvil.verboseLog("Was against $conflict and conflicting: $conflicting ") - if (!conflicting) { + val allowed = conflict.allowed(base, mat) + CustomAnvil.verboseLog("Was against $conflict and conflicting: ${!allowed} ") + if (!allowed) { if (conflict.getEnchants().size <= 1) { result = ConflictType.SMALL_CONFLICT CustomAnvil.verboseLog("Small conflict, continuing") } else { + CustomAnvil.verboseLog("Big conflict, probably stoping") return ConflictType.BIG_CONFLICT } }