diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt index 1d50f20..694f314 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt @@ -57,7 +57,8 @@ object DependencyManager { // Excellent Enchants dependency if(pluginManager.isPluginEnabled("ExcellentEnchants")){ - excellentEnchantsCompatibility = ExcellentEnchantsDependency(pluginManager.getPlugin("ExcellentEnchants")!!) + excellentEnchantsCompatibility = ExcellentEnchantsDependency() + excellentEnchantsCompatibility!!.redirectListeners() } // Disenchantment dependency @@ -92,8 +93,11 @@ object DependencyManager { fun tryEventPreAnvilBypass(event: PrepareAnvilEvent): Boolean { var bypass = false + // Test if disenchantment used special prepare anvil if(disenchantmentCompatibility?.testPrepareAnvil(event) == true) bypass = true + // Test excellent enchantments used special prepare anvil + if(!bypass && (excellentEnchantsCompatibility?.testPrepareAnvil(event) == true)) bypass = true // Test if the inventory is a gui(version specific) if(!bypass && (externGuiTester?.testIfGui(event.view) == true)) bypass = true @@ -104,8 +108,12 @@ object DependencyManager { fun tryClickAnvilResultBypass(event: InventoryClickEvent, inventory: AnvilInventory): Boolean { var bypass = false + // Test if disenchantment used special event click if(disenchantmentCompatibility?.testAnvilResult(event, inventory) == true) bypass = true + // Test if disenchantment used special event click + if(!bypass && (excellentEnchantsCompatibility?.testAnvilResult(event) == true)) bypass = true + // Test if the inventory is a gui(version specific) if(!bypass && (externGuiTester?.testIfGui(event.view) == true)) bypass = true diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DisenchantmentDependency.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DisenchantmentDependency.kt index 92ee146..439dbb4 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DisenchantmentDependency.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DisenchantmentDependency.kt @@ -26,7 +26,6 @@ class DisenchantmentDependency { private lateinit var itemClickEvent: DisenchantClickEvent fun redirectListeners() { - val toUnregister = ArrayList() // get required PrepareAnvilEvent listener for (registeredListener in PrepareAnvilEvent.getHandlerList().registeredListeners) { diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/ExcellentEnchantsDependency.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/ExcellentEnchantsDependency.kt index 5b2ab81..437cd75 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/ExcellentEnchantsDependency.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/ExcellentEnchantsDependency.kt @@ -1,12 +1,19 @@ package xyz.alexcrea.cuanvil.dependency import io.delilaheve.CustomAnvil -import org.bukkit.plugin.Plugin +import org.bukkit.Material +import org.bukkit.event.inventory.InventoryClickEvent +import org.bukkit.event.inventory.PrepareAnvilEvent +import org.bukkit.inventory.ItemStack +import org.bukkit.plugin.RegisteredListener +import su.nightexpress.excellentenchants.enchantment.impl.universal.CurseOfFragilityEnchant +import su.nightexpress.excellentenchants.enchantment.listener.AnvilListener import su.nightexpress.excellentenchants.registry.EnchantRegistry import xyz.alexcrea.cuanvil.api.EnchantmentApi import xyz.alexcrea.cuanvil.enchant.wrapped.CAEEEnchantment +import java.lang.reflect.Method -class ExcellentEnchantsDependency(private val excellentEnchantsPlugin: Plugin){ +class ExcellentEnchantsDependency { init { CustomAnvil.instance.logger.info("Excellent Enchants Detected !") @@ -20,7 +27,81 @@ class ExcellentEnchantsDependency(private val excellentEnchantsPlugin: Plugin){ EnchantmentApi.registerEnchantment(CAEEEnchantment(enchantment)) } - CustomAnvil.instance.logger.info("\"Excellent Enchants should now work as expected !") + CustomAnvil.instance.logger.info("Excellent Enchants should now work as expected !") + } + + private lateinit var fragilityCurse: CurseOfFragilityEnchant + + private lateinit var anvilListener: AnvilListener + private lateinit var handleRechargeMethod: Method + private lateinit var handleCombineMethod: Method + + fun redirectListeners() { + val toUnregister = ArrayList() + // get required PrepareAnvilEvent listener + for (registeredListener in PrepareAnvilEvent.getHandlerList().registeredListeners) { + val listener = registeredListener.listener + + if(listener is CurseOfFragilityEnchant){ + this.fragilityCurse = listener + toUnregister.add(registeredListener) + } + + if(listener is AnvilListener){ + this.anvilListener = listener; + toUnregister.add(registeredListener) + } + + } + + for (listener in toUnregister) { + PrepareAnvilEvent.getHandlerList().unregister(listener) + + } + + // Unregister inventory click event + InventoryClickEvent.getHandlerList().unregister(this.anvilListener) + + findAnvilFunctions() + } + + private fun findAnvilFunctions() { + this.handleRechargeMethod = AnvilListener::class.java.getDeclaredMethod("handleRecharge", + PrepareAnvilEvent::class.java, ItemStack::class.java, ItemStack::class.java) + this.handleRechargeMethod.setAccessible(true) + + this.handleCombineMethod = AnvilListener::class.java.getDeclaredMethod("handleCombine", + PrepareAnvilEvent::class.java, ItemStack::class.java, ItemStack::class.java, ItemStack::class.java) + this.handleCombineMethod.setAccessible(true) + + } + + fun testPrepareAnvil(event: PrepareAnvilEvent): Boolean { + if(event.result != null){ + this.fragilityCurse.onItemAnvil(event) + if(event.result == null) return true + } + + var first: ItemStack? = event.inventory.getItem(0) + var second: ItemStack? = event.inventory.getItem(1) + var result = event.result + + if (first == null) first = ItemStack(Material.AIR) + if (second == null) second = ItemStack(Material.AIR) + if (result == null) result = ItemStack(Material.AIR) + + if(handleRechargeMethod.invoke(this.anvilListener, event, first, second) as Boolean) return true + return handleCombineMethod.invoke(this.anvilListener, event, first, second, result) as Boolean + } + + fun testAnvilResult(event: InventoryClickEvent): Any { + if(event.inventory.getItem(2) != null){ + this.anvilListener.onClickAnvil(event) + return event.inventory.getItem(2) == null + } + + + return false; } }