Make some legacy version of excellent enchantment work with custom anvil
This commit is contained in:
alexcrea 2024-12-14 01:35:32 +01:00 committed by GitHub
parent fa042411ae
commit 4147f018a9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 114 additions and 25 deletions

View file

@ -16,7 +16,7 @@ plugins {
} }
group = "xyz.alexcrea" group = "xyz.alexcrea"
version = "1.6.12" version = "1.6.13"
repositories { repositories {
// EcoEnchants // EcoEnchants
@ -43,6 +43,7 @@ dependencies {
// ExcellentEnchants // ExcellentEnchants
compileOnly(files("libs/nightcore-2.6.4.jar")) compileOnly(files("libs/nightcore-2.6.4.jar"))
compileOnly(files("libs/ExcellentEnchants-4.2.2.jar")) compileOnly(files("libs/ExcellentEnchants-4.2.2.jar"))
compileOnly(files("libs/ExcellentEnchants 4.1.0-striped.jar"))
// Disenchantment // Disenchantment
compileOnly("cz.kominekjan:Disenchantment:v5.4.0") compileOnly("cz.kominekjan:Disenchantment:v5.4.0")

Binary file not shown.

View file

@ -0,0 +1,43 @@
package xyz.alexcrea.cuanvil.enchant.wrapped;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import su.nightexpress.excellentenchants.api.enchantment.EnchantmentData;
import xyz.alexcrea.cuanvil.enchant.AdditionalTestEnchantment;
import xyz.alexcrea.cuanvil.enchant.CAEnchantment;
import xyz.alexcrea.cuanvil.enchant.EnchantmentRarity;
import java.util.Map;
import java.util.Set;
public class CALegacyEEEnchantment extends CABukkitEnchantment implements AdditionalTestEnchantment {
@NotNull EnchantmentData eeenchantment;
public CALegacyEEEnchantment(@NotNull EnchantmentData enchantment) {
super(enchantment.getEnchantment(), EnchantmentRarity.getRarity(enchantment.getAnvilCost()));
this.eeenchantment = enchantment;
}
@Override
public boolean isEnchantConflict(@NotNull Map<CAEnchantment, Integer> enchantments, @NotNull Material itemMat) {
if (!eeenchantment.hasConflicts()) return false;
Set<String> conflicts = eeenchantment.getConflicts();
for (CAEnchantment caEnchantment : enchantments.keySet()) {
if (conflicts.contains(caEnchantment.getName())) return true;
}
return false;
}
@Override
public boolean isItemConflict(@NotNull Map<CAEnchantment, Integer> enchantments, @NotNull Material itemMat, @NotNull ItemStack item) {
if (Material.ENCHANTED_BOOK.equals(itemMat)) return false;
return !eeenchantment.getSupportedItems().is(item);
}
}

View file

@ -2,37 +2,62 @@ package xyz.alexcrea.cuanvil.dependency
import io.delilaheve.CustomAnvil import io.delilaheve.CustomAnvil
import org.bukkit.Material import org.bukkit.Material
import org.bukkit.event.Listener
import org.bukkit.event.inventory.InventoryClickEvent import org.bukkit.event.inventory.InventoryClickEvent
import org.bukkit.event.inventory.PrepareAnvilEvent import org.bukkit.event.inventory.PrepareAnvilEvent
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
import org.bukkit.plugin.RegisteredListener import org.bukkit.plugin.RegisteredListener
import su.nightexpress.excellentenchants.enchantment.impl.universal.CurseOfFragilityEnchant import su.nightexpress.excellentenchants.enchantment.impl.universal.CurseOfFragilityEnchant
import su.nightexpress.excellentenchants.enchantment.listener.AnvilListener import su.nightexpress.excellentenchants.enchantment.listener.AnvilListener
import su.nightexpress.excellentenchants.enchantment.listener.EnchantAnvilListener
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 xyz.alexcrea.cuanvil.enchant.wrapped.CALegacyEEEnchantment
import java.lang.reflect.Method import java.lang.reflect.Method
class ExcellentEnchantsDependency { class ExcellentEnchantsDependency {
private val isModern: Boolean
init { init {
CustomAnvil.instance.logger.info("Excellent Enchants Detected !") CustomAnvil.instance.logger.info("Excellent Enchants Detected !")
var isModern = true;
try {
Class.forName("su.nightexpress.excellentenchants.enchantment.listener.AnvilListener")
} catch (ignored: ClassNotFoundException) {
isModern = false
}
this.isModern = isModern
} }
fun registerEnchantments() { fun registerEnchantments() {
CustomAnvil.instance.logger.info("Preparing Excellent Enchants compatibility...") CustomAnvil.instance.logger.info("Preparing Excellent Enchants compatibility...")
// As excellent enchants is loaded before custom anvil and register enchantment to registry, we need to unregister old "vanilla" enchant.
if (this.isModern) {
for (enchantment in EnchantRegistry.getRegistered()) { for (enchantment in EnchantRegistry.getRegistered()) {
EnchantmentApi.unregisterEnchantment(enchantment.bukkitEnchantment.key) // As excellent enchants is loaded before custom anvil and register enchantment to registry, we need to unregister old "vanilla" enchant. EnchantmentApi.unregisterEnchantment(enchantment.bukkitEnchantment.key)
EnchantmentApi.registerEnchantment(CAEEEnchantment(enchantment)) EnchantmentApi.registerEnchantment(CAEEEnchantment(enchantment))
} }
} else {
for (enchantment in su.nightexpress.excellentenchants.enchantment.registry.EnchantRegistry.getRegistered()) {
EnchantmentApi.unregisterEnchantment(enchantment.enchantment.key)
EnchantmentApi.registerEnchantment(CALegacyEEEnchantment(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 fragilityCurse: CurseOfFragilityEnchant
private lateinit var anvilListener: AnvilListener private var modernAnvilListener: AnvilListener? = null
private var legacyAnvilListener: EnchantAnvilListener? = null
private lateinit var usedAnvilListener: Listener
private lateinit var handleRechargeMethod: Method private lateinit var handleRechargeMethod: Method
private lateinit var handleCombineMethod: Method private lateinit var handleCombineMethod: Method
@ -47,31 +72,47 @@ class ExcellentEnchantsDependency {
toUnregister.add(registeredListener) toUnregister.add(registeredListener)
} }
if (this.isModern) {
if (listener is AnvilListener) { if (listener is AnvilListener) {
this.anvilListener = listener; this.modernAnvilListener = listener;
toUnregister.add(registeredListener) toUnregister.add(registeredListener)
} }
} else {
if (listener is EnchantAnvilListener) {
this.legacyAnvilListener = listener;
toUnregister.add(registeredListener)
}
}
} }
for (listener in toUnregister) { for (listener in toUnregister) {
PrepareAnvilEvent.getHandlerList().unregister(listener) PrepareAnvilEvent.getHandlerList().unregister(listener)
}
if (this.isModern) {
this.usedAnvilListener = this.modernAnvilListener!!
} else {
this.usedAnvilListener = this.legacyAnvilListener!!
} }
// Unregister inventory click event // Unregister inventory click event
InventoryClickEvent.getHandlerList().unregister(this.anvilListener) InventoryClickEvent.getHandlerList().unregister(this.usedAnvilListener)
findAnvilFunctions() findAnvilFunctions()
} }
private fun findAnvilFunctions() { private fun findAnvilFunctions() {
this.handleRechargeMethod = AnvilListener::class.java.getDeclaredMethod("handleRecharge", this.handleRechargeMethod = this.usedAnvilListener.javaClass.getDeclaredMethod(
PrepareAnvilEvent::class.java, ItemStack::class.java, ItemStack::class.java) "handleRecharge",
PrepareAnvilEvent::class.java, ItemStack::class.java, ItemStack::class.java
)
this.handleRechargeMethod.setAccessible(true) this.handleRechargeMethod.setAccessible(true)
this.handleCombineMethod = AnvilListener::class.java.getDeclaredMethod("handleCombine", this.handleCombineMethod = this.usedAnvilListener.javaClass.getDeclaredMethod(
PrepareAnvilEvent::class.java, ItemStack::class.java, ItemStack::class.java, ItemStack::class.java) "handleCombine",
PrepareAnvilEvent::class.java, ItemStack::class.java, ItemStack::class.java, ItemStack::class.java
)
this.handleCombineMethod.setAccessible(true) this.handleCombineMethod.setAccessible(true)
} }
@ -85,26 +126,30 @@ class ExcellentEnchantsDependency {
val first: ItemStack = treatInput(event.inventory.getItem(0)) val first: ItemStack = treatInput(event.inventory.getItem(0))
val second: ItemStack = treatInput(event.inventory.getItem(1)) val second: ItemStack = treatInput(event.inventory.getItem(1))
return handleRechargeMethod.invoke(this.anvilListener, event, first, second) as Boolean return handleRechargeMethod.invoke(this.usedAnvilListener, event, first, second) as Boolean
} }
fun treatAnvilResult(event: PrepareAnvilEvent, result: ItemStack) { fun treatAnvilResult(event: PrepareAnvilEvent, result: ItemStack) {
val first: ItemStack = treatInput(event.inventory.getItem(0)) val first: ItemStack = treatInput(event.inventory.getItem(0))
val second: ItemStack = treatInput(event.inventory.getItem(1)) val second: ItemStack = treatInput(event.inventory.getItem(1))
handleCombineMethod.invoke(this.anvilListener, event, first, second, result) handleCombineMethod.invoke(this.usedAnvilListener, event, first, second, result)
} }
fun testAnvilResult(event: InventoryClickEvent): Any { fun testAnvilResult(event: InventoryClickEvent): Any {
if (event.inventory.getItem(2) != null) { if (event.inventory.getItem(2) != null) {
this.anvilListener.onClickAnvil(event) if (this.isModern) {
this.modernAnvilListener!!.onClickAnvil(event)
} else {
this.legacyAnvilListener!!.onClickAnvil(event)
}
return event.inventory.getItem(2) == null return event.inventory.getItem(2) == null
} }
return false; return false;
} }
fun treatInput(item: ItemStack?): ItemStack { private fun treatInput(item: ItemStack?): ItemStack {
if (item == null) return ItemStack(Material.AIR) if (item == null) return ItemStack(Material.AIR)
return item return item
} }