From b9ff4bdc407a5f9a83d2a5f1f8bd8a85efd1f1d2 Mon Sep 17 00:00:00 2001 From: alexcrea Date: Wed, 8 Jul 2026 14:04:26 +0200 Subject: [PATCH 1/2] add support for enchantedbook --- COMPATIBILITY.md | 2 ++ .../cuanvil/command/DiagnosticExecutor.kt | 2 +- .../cuanvil/dependency/DependencyManager.kt | 21 ++++++++++++--- .../plugins/EnchantedBookDependency.kt | 27 +++++++++++++++++++ .../plugins/ExcellentEnchantsDependency.kt | 5 ++-- src/main/resources/plugin.yml | 1 + 6 files changed, 50 insertions(+), 8 deletions(-) create mode 100644 src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/EnchantedBookDependency.kt diff --git a/COMPATIBILITY.md b/COMPATIBILITY.md index d3cfd8b3..6de29076 100644 --- a/COMPATIBILITY.md +++ b/COMPATIBILITY.md @@ -40,6 +40,8 @@ Custom Items support is considered unstable. If you find issue please report it - [Disenchantment](https://www.spigotmc.org/resources/disenchantment-1-21-1-1-20-6-new-book-splitting-mechanics.110741/) by H7KZ Partially use Custom Anvil maximum XP settings (>= 6.1.5) +- [EnchantedBook](https://modrinth.com/plugin/enchantedbook) by Minacle + - [HavenBags](https://www.spigotmc.org/resources/havenbags-shulker-like-player-bound-bags-1-17-1-21-4.110420/) by hyperdefined For bag upgrade and skin via anvil. (version >= 1.31.0) diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/command/DiagnosticExecutor.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/command/DiagnosticExecutor.kt index b095e14c..2b8b809b 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/command/DiagnosticExecutor.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/command/DiagnosticExecutor.kt @@ -267,7 +267,7 @@ class DiagnosticExecutor: CASubCommand() { try { val fakeInv = Bukkit.createInventory(player, InventoryType.ANVIL) invView = player.openInventory(fakeInv)!! - event = PrepareAnvilEvent(invView, result) + event = DependencyManager.createFakeEvent(invView, result) } catch (e: Throwable) { // Help val menuTypeClazz = Class.forName("org.bukkit.inventory.MenuType") diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt index b730a0ee..3d5b8e86 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt @@ -33,6 +33,7 @@ import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil.componentLore import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener.Companion.ANVIL_OUTPUT_SLOT import xyz.alexcrea.cuanvil.util.MetricsUtil.trackError +import java.lang.reflect.Constructor import java.util.logging.Level object DependencyManager { @@ -103,7 +104,7 @@ object DependencyManager { axPlayerWarpsCompatibility = AxPlayerWarpsDependency() } - if (pluginManager.isPluginEnabled("ItemsAdder")){ + if (pluginManager.isPluginEnabled("ItemsAdder")) { val dependency = ItemsAdderDependency(pluginManager.getPlugin("ItemsAdder")!!) itemsAdderCompatibility = dependency genericDependencies.add(dependency) @@ -116,12 +117,16 @@ object DependencyManager { if (pluginManager.isPluginEnabled("ItemsAdder")) genericDependencies.add(GenericPluginDependency(pluginManager.getPlugin("ItemsAdder")!!)) - if (pluginManager.isPluginEnabled("SuperEnchants")){ + if (pluginManager.isPluginEnabled("SuperEnchants")) { val compatibility = SuperEnchantDependency(pluginManager.getPlugin("SuperEnchants")!! as SuperEnchants) - if(compatibility.registerEnchantments()) + if (compatibility.registerEnchantments()) genericDependencies.add(compatibility) } + if (pluginManager.isPluginEnabled("EnchantedBook")) { + genericDependencies.add(EnchantedBookDependency(pluginManager.getPlugin("EnchantedBook")!!)) + } + for (dependency in genericDependencies) dependency.redirectListeners() @@ -307,7 +312,7 @@ object DependencyManager { private fun unsafeCloneItem(item: ItemStack): ItemStack { val cloned = itemsAdderCompatibility?.tryClone(item) - if(cloned != null) return cloned + if (cloned != null) return cloned return item.clone() } @@ -328,4 +333,12 @@ object DependencyManager { enchantmentSquaredCompatibility?.updateLore(item) } + + private val prepareAnvilConstructor = + PrepareAnvilEvent::class.java.constructors.first() as Constructor + + fun createFakeEvent(view: InventoryView, result: ItemStack?): PrepareAnvilEvent { + return prepareAnvilConstructor.newInstance(view, result) + } + } diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/EnchantedBookDependency.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/EnchantedBookDependency.kt new file mode 100644 index 00000000..8eda3409 --- /dev/null +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/EnchantedBookDependency.kt @@ -0,0 +1,27 @@ +package xyz.alexcrea.cuanvil.dependency.plugins + +import org.bukkit.event.inventory.InventoryClickEvent +import org.bukkit.plugin.Plugin +import xyz.alexcrea.cuanvil.dependency.DependencyManager +import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener.Companion.ANVIL_INPUT_LEFT +import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener.Companion.ANVIL_OUTPUT_SLOT + +class EnchantedBookDependency(plugin: Plugin) : GenericPluginDependency(plugin) { + + override fun testAnvilResult(event: InventoryClickEvent): Boolean { + val view = event.view + + val current = view.getItem(ANVIL_OUTPUT_SLOT) + view.setItem(ANVIL_OUTPUT_SLOT, null) + val fakeEvent = DependencyManager.createFakeEvent(event.view, null) + + if (testPrepareAnvil(fakeEvent)) { + event.isCancelled = false + return true + } + + view.setItem(ANVIL_INPUT_LEFT, current) + return false + } + +} diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/ExcellentEnchantsDependency.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/ExcellentEnchantsDependency.kt index 816a4dfe..42cf287b 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/ExcellentEnchantsDependency.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/ExcellentEnchantsDependency.kt @@ -9,6 +9,7 @@ import org.bukkit.inventory.ItemStack import org.bukkit.plugin.RegisteredListener import xyz.alexcrea.cuanvil.api.EnchantmentApi import xyz.alexcrea.cuanvil.api.event.listener.CATreatAnvilResult2Event +import xyz.alexcrea.cuanvil.dependency.DependencyManager import xyz.alexcrea.cuanvil.enchant.wrapped.CAEEPreV5Enchantment import xyz.alexcrea.cuanvil.enchant.wrapped.CAEEV5Enchantment import xyz.alexcrea.cuanvil.enchant.wrapped.CAEEV5_4Enchantment @@ -118,8 +119,6 @@ class ExcellentEnchantsDependency { private lateinit var handleRechargeMethod: Method private lateinit var handleCombineMethod: Method - private val prepareAnvilConstructor = PrepareAnvilEvent::class.java.constructors.first() as Constructor - fun redirectListeners() { val toUnregister = ArrayList() // get required PrepareAnvilEvent listener @@ -226,7 +225,7 @@ class ExcellentEnchantsDependency { val first: ItemStack = treatInput(event.leftItem) val second: ItemStack = treatInput(event.rightItem) - val fakeEvent = prepareAnvilConstructor.newInstance(event.view, result) + val fakeEvent = DependencyManager.createFakeEvent(event.view, result) handleCombineMethod.invoke(this.usedAnvilListener, fakeEvent, first, second, result) diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index d436b10a..97188e14 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -84,3 +84,4 @@ softdepend: - ExcellentEnchants - HavenBags - SuperEnchants + - EnchantedBook From d469171e4d8cb1ef6faf79ca0519a8ccd071ee1b Mon Sep 17 00:00:00 2001 From: alexcrea Date: Wed, 8 Jul 2026 14:44:20 +0200 Subject: [PATCH 2/2] fix support for enchantedbook --- .../cuanvil/command/DiagnosticExecutor.kt | 6 +++--- .../dependency/plugins/EnchantedBookDependency.kt | 15 ++++++++++----- .../plugins/ExcellentEnchantsDependency.kt | 5 ++--- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/command/DiagnosticExecutor.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/command/DiagnosticExecutor.kt index 2b8b809b..75459728 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/command/DiagnosticExecutor.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/command/DiagnosticExecutor.kt @@ -130,9 +130,9 @@ class DiagnosticExecutor: CASubCommand() { message.clickEvent = ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, stb.toString()) message.hoverEvent = HoverEvent(HoverEvent.Action.SHOW_TEXT, Text("ยง7Click to copy")) - sender.spigot().sendMessage(message); + sender.spigot().sendMessage(message) } else { - sender.sendMessage(stb.toString()); + sender.sendMessage(stb.toString()) } return true @@ -268,7 +268,7 @@ class DiagnosticExecutor: CASubCommand() { val fakeInv = Bukkit.createInventory(player, InventoryType.ANVIL) invView = player.openInventory(fakeInv)!! event = DependencyManager.createFakeEvent(invView, result) - } catch (e: Throwable) { + } catch (_: Throwable) { // Help val menuTypeClazz = Class.forName("org.bukkit.inventory.MenuType") val anvilTypeField = menuTypeClazz.getField("ANVIL") diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/EnchantedBookDependency.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/EnchantedBookDependency.kt index 8eda3409..54de4e12 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/EnchantedBookDependency.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/EnchantedBookDependency.kt @@ -1,5 +1,6 @@ package xyz.alexcrea.cuanvil.dependency.plugins +import org.bukkit.event.Event import org.bukkit.event.inventory.InventoryClickEvent import org.bukkit.plugin.Plugin import xyz.alexcrea.cuanvil.dependency.DependencyManager @@ -10,17 +11,21 @@ class EnchantedBookDependency(plugin: Plugin) : GenericPluginDependency(plugin) override fun testAnvilResult(event: InventoryClickEvent): Boolean { val view = event.view + val inv = event.inventory - val current = view.getItem(ANVIL_OUTPUT_SLOT) - view.setItem(ANVIL_OUTPUT_SLOT, null) - val fakeEvent = DependencyManager.createFakeEvent(event.view, null) + //TODO use view here (v2) + val current = inv.getItem(ANVIL_OUTPUT_SLOT) + inv.setItem(ANVIL_OUTPUT_SLOT, null) + val fakeEvent = DependencyManager.createFakeEvent(view, null) if (testPrepareAnvil(fakeEvent)) { - event.isCancelled = false + event.result = Event.Result.DEFAULT + + inv.setItem(ANVIL_INPUT_LEFT, fakeEvent.result) return true } - view.setItem(ANVIL_INPUT_LEFT, current) + inv.setItem(ANVIL_INPUT_LEFT, current) return false } diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/ExcellentEnchantsDependency.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/ExcellentEnchantsDependency.kt index 42cf287b..8ac479f1 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/ExcellentEnchantsDependency.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/ExcellentEnchantsDependency.kt @@ -14,7 +14,6 @@ import xyz.alexcrea.cuanvil.enchant.wrapped.CAEEPreV5Enchantment import xyz.alexcrea.cuanvil.enchant.wrapped.CAEEV5Enchantment import xyz.alexcrea.cuanvil.enchant.wrapped.CAEEV5_4Enchantment import xyz.alexcrea.cuanvil.enchant.wrapped.CALegacyEEEnchantment -import java.lang.reflect.Constructor import java.lang.reflect.Method import su.nightexpress.excellentenchants.api.EnchantRegistry as V5EnchantRegistry import su.nightexpress.excellentenchants.enchantment.impl.universal.CurseOfFragilityEnchant as LegacyCurseOfFragilityEnchant @@ -48,7 +47,7 @@ class ExcellentEnchantsDependency { listenerVersion = value break - } catch (ignored: ClassNotFoundException) { + } catch (_: ClassNotFoundException) { } } @@ -61,7 +60,7 @@ class ExcellentEnchantsDependency { var isModernCurseOfFragility = true try { Class.forName("su.nightexpress.excellentenchants.enchantment.universal.CurseOfFragilityEnchant") - } catch (ignored: ClassNotFoundException) { + } catch (_: ClassNotFoundException) { isModernCurseOfFragility = false }