diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/DisenchantmentDependency.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/DisenchantmentDependency.kt index acccabe..554fe5a 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/DisenchantmentDependency.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/DisenchantmentDependency.kt @@ -5,14 +5,18 @@ import com.jankominek.disenchantment.events.DisenchantClickEvent import com.jankominek.disenchantment.events.DisenchantEvent import com.jankominek.disenchantment.events.ShatterClickEvent import com.jankominek.disenchantment.events.ShatterEvent +import com.jankominek.disenchantment.listeners.ShatterClickListener import io.delilaheve.CustomAnvil import org.bukkit.entity.HumanEntity +import org.bukkit.event.Listener import org.bukkit.event.inventory.InventoryClickEvent import org.bukkit.event.inventory.PrepareAnvilEvent import org.bukkit.inventory.AnvilInventory import org.bukkit.inventory.ItemStack import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener import xyz.alexcrea.cuanvil.util.AnvilXpUtil +import java.util.logging.Level +import kotlin.reflect.KClass class DisenchantmentDependency { @@ -22,7 +26,25 @@ class DisenchantmentDependency { fun redirectListeners() { PrepareAnvilEvent.getHandlerList().unregister(Disenchantment.plugin) - InventoryClickEvent.getHandlerList().unregister(Disenchantment.plugin) + + // unregister only the feature click event and not all + // This is to avoid the disenchantment gui breaking + try { + unregisterStaticDisenchantmentListener(ShatterClickListener::class) + unregisterStaticDisenchantmentListener(InventoryClickEvent::class) + } catch (e: Exception) { + CustomAnvil.instance.logger.log( + Level.SEVERE, "Could not initialize disenchantment support" + + "please report this bug to the developer", e + ) + } + } + + private fun unregisterStaticDisenchantmentListener(clazz: KClass<*>) { + val field = clazz.java.getDeclaredField("listener") + field.isAccessible = true + val listener: Listener = field.get(null) as Listener + InventoryClickEvent.getHandlerList().unregister(listener) } fun testPrepareAnvil(event: PrepareAnvilEvent, player: HumanEntity): Boolean { @@ -31,14 +53,14 @@ class DisenchantmentDependency { // Test if event change the result DisenchantEvent.onEvent(event) - if(event.result != null) { + if (event.result != null) { CustomAnvil.log("Detected pre anvil item extract bypass.") AnvilXpUtil.setAnvilInvXp(event.inventory, event.view, player, event.inventory.repairCost) return true } ShatterEvent.onEvent(event) - if(event.result != null) { + if (event.result != null) { CustomAnvil.log("Detected pre anvil split enchant bypass.") AnvilXpUtil.setAnvilInvXp(event.inventory, event.view, player, event.inventory.repairCost) return true @@ -53,13 +75,13 @@ class DisenchantmentDependency { // Test event if change the result DisenchantClickEvent.onEvent(event) - if(!testAnvilInventoryChange(inventory, previousResultSlot) || event.isCancelled) { + if (!testAnvilInventoryChange(inventory, previousResultSlot) || event.isCancelled) { CustomAnvil.log("Detected anvil click item extract bypass.") return true } ShatterClickEvent.onEvent(event) - if(!testAnvilInventoryChange(inventory, previousResultSlot) || event.isCancelled) { + if (!testAnvilInventoryChange(inventory, previousResultSlot) || event.isCancelled) { CustomAnvil.log("Detected anvil click split enchant bypass.") return true }