Fix some issue with ExcellentEnchants:

Fix charge not working.
Fix fatigue curse probably not working.
This commit is contained in:
alexcrea 2024-10-15 08:23:02 +02:00
parent ffb9b4d756
commit 2dac556989
No known key found for this signature in database
GPG key ID: 43FD265DB0DBF91F
3 changed files with 93 additions and 5 deletions

View file

@ -57,7 +57,8 @@ object DependencyManager {
// Excellent Enchants dependency // Excellent Enchants dependency
if(pluginManager.isPluginEnabled("ExcellentEnchants")){ if(pluginManager.isPluginEnabled("ExcellentEnchants")){
excellentEnchantsCompatibility = ExcellentEnchantsDependency(pluginManager.getPlugin("ExcellentEnchants")!!) excellentEnchantsCompatibility = ExcellentEnchantsDependency()
excellentEnchantsCompatibility!!.redirectListeners()
} }
// Disenchantment dependency // Disenchantment dependency
@ -92,8 +93,11 @@ object DependencyManager {
fun tryEventPreAnvilBypass(event: PrepareAnvilEvent): Boolean { fun tryEventPreAnvilBypass(event: PrepareAnvilEvent): Boolean {
var bypass = false var bypass = false
// Test if disenchantment used special prepare anvil
if(disenchantmentCompatibility?.testPrepareAnvil(event) == true) bypass = true 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) // Test if the inventory is a gui(version specific)
if(!bypass && (externGuiTester?.testIfGui(event.view) == true)) bypass = true if(!bypass && (externGuiTester?.testIfGui(event.view) == true)) bypass = true
@ -104,8 +108,12 @@ object DependencyManager {
fun tryClickAnvilResultBypass(event: InventoryClickEvent, inventory: AnvilInventory): Boolean { fun tryClickAnvilResultBypass(event: InventoryClickEvent, inventory: AnvilInventory): Boolean {
var bypass = false var bypass = false
// Test if disenchantment used special event click
if(disenchantmentCompatibility?.testAnvilResult(event, inventory) == true) bypass = true 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) // Test if the inventory is a gui(version specific)
if(!bypass && (externGuiTester?.testIfGui(event.view) == true)) bypass = true if(!bypass && (externGuiTester?.testIfGui(event.view) == true)) bypass = true

View file

@ -26,7 +26,6 @@ class DisenchantmentDependency {
private lateinit var itemClickEvent: DisenchantClickEvent private lateinit var itemClickEvent: DisenchantClickEvent
fun redirectListeners() { fun redirectListeners() {
val toUnregister = ArrayList<RegisteredListener>() val toUnregister = ArrayList<RegisteredListener>()
// get required PrepareAnvilEvent listener // get required PrepareAnvilEvent listener
for (registeredListener in PrepareAnvilEvent.getHandlerList().registeredListeners) { for (registeredListener in PrepareAnvilEvent.getHandlerList().registeredListeners) {

View file

@ -1,12 +1,19 @@
package xyz.alexcrea.cuanvil.dependency package xyz.alexcrea.cuanvil.dependency
import io.delilaheve.CustomAnvil 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 su.nightexpress.excellentenchants.registry.EnchantRegistry
import xyz.alexcrea.cuanvil.api.EnchantmentApi import xyz.alexcrea.cuanvil.api.EnchantmentApi
import xyz.alexcrea.cuanvil.enchant.wrapped.CAEEEnchantment import xyz.alexcrea.cuanvil.enchant.wrapped.CAEEEnchantment
import java.lang.reflect.Method
class ExcellentEnchantsDependency(private val excellentEnchantsPlugin: Plugin){ class ExcellentEnchantsDependency {
init { init {
CustomAnvil.instance.logger.info("Excellent Enchants Detected !") CustomAnvil.instance.logger.info("Excellent Enchants Detected !")
@ -20,7 +27,81 @@ class ExcellentEnchantsDependency(private val excellentEnchantsPlugin: Plugin){
EnchantmentApi.registerEnchantment(CAEEEnchantment(enchantment)) 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<RegisteredListener>()
// 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;
} }
} }