Excellent enchants compatibility (#34)

Add compatibility with
[ExcellentEnchants](https://www.spigotmc.org/resources/excellentenchants-%E2%AD%90-75-vanilla-like-enchantments.61693/)
This commit is contained in:
alexcrea 2024-10-15 08:27:26 +02:00 committed by GitHub
parent 7c283dc7f8
commit 13b7e73d8c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 177 additions and 4 deletions

View file

@ -36,6 +36,10 @@ dependencies {
compileOnly("com.willfp:EcoEnchants:12.5.1") compileOnly("com.willfp:EcoEnchants:12.5.1")
compileOnly("com.willfp:eco:6.70.1") compileOnly("com.willfp:eco:6.70.1")
// ExcellentEnchants
compileOnly(files("libs/nightcore-2.6.4.jar"))
compileOnly(files("libs/ExcellentEnchants-4.2.2.jar"))
// Disenchantment // Disenchantment
compileOnly("cz.kominekjan:Disenchantment:v5.4.0") compileOnly("cz.kominekjan:Disenchantment:v5.4.0")

Binary file not shown.

BIN
libs/nightcore-2.6.4.jar Normal file

Binary file not shown.

View file

@ -0,0 +1,46 @@
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.CustomEnchantment;
import su.nightexpress.excellentenchants.api.enchantment.Definition;
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 CAEEEnchantment extends CABukkitEnchantment implements AdditionalTestEnchantment {
@NotNull CustomEnchantment eeenchantment;
@NotNull Definition definition;
public CAEEEnchantment(@NotNull CustomEnchantment enchantment) {
super(enchantment.getBukkitEnchantment(), EnchantmentRarity.getRarity(enchantment.getDefinition().getAnvilCost()));
this.eeenchantment = enchantment;
this.definition = enchantment.getDefinition();
}
@Override
public boolean isEnchantConflict(@NotNull Map<CAEnchantment, Integer> enchantments, @NotNull Material itemMat) {
if(!definition.hasConflicts()) return false;
Set<String> conflicts = definition.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 !definition.getSupportedItems().is(item);
}
}

View file

@ -23,6 +23,8 @@ object DependencyManager {
var enchantmentSquaredCompatibility: EnchantmentSquaredDependency? = null var enchantmentSquaredCompatibility: EnchantmentSquaredDependency? = null
var ecoEnchantCompatibility: EcoEnchantDependency? = null var ecoEnchantCompatibility: EcoEnchantDependency? = null
var excellentEnchantsCompatibility: ExcellentEnchantsDependency? = null
var disenchantmentCompatibility: DisenchantmentDependency? = null var disenchantmentCompatibility: DisenchantmentDependency? = null
fun loadDependency(){ fun loadDependency(){
@ -53,6 +55,12 @@ object DependencyManager {
ecoEnchantCompatibility!!.disableAnvilListener() ecoEnchantCompatibility!!.disableAnvilListener()
} }
// Excellent Enchants dependency
if(pluginManager.isPluginEnabled("ExcellentEnchants")){
excellentEnchantsCompatibility = ExcellentEnchantsDependency()
excellentEnchantsCompatibility!!.redirectListeners()
}
// Disenchantment dependency // Disenchantment dependency
if(pluginManager.isPluginEnabled("Disenchantment")){ if(pluginManager.isPluginEnabled("Disenchantment")){
disenchantmentCompatibility = DisenchantmentDependency() disenchantmentCompatibility = DisenchantmentDependency()
@ -69,6 +77,7 @@ object DependencyManager {
fun registerEnchantments() { fun registerEnchantments() {
enchantmentSquaredCompatibility?.registerEnchantments() enchantmentSquaredCompatibility?.registerEnchantments()
ecoEnchantCompatibility?.registerEnchantments() ecoEnchantCompatibility?.registerEnchantments()
excellentEnchantsCompatibility?.registerEnchantments()
} }
@ -84,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
@ -96,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

@ -0,0 +1,107 @@
package xyz.alexcrea.cuanvil.dependency
import io.delilaheve.CustomAnvil
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 {
init {
CustomAnvil.instance.logger.info("Excellent Enchants Detected !")
}
fun registerEnchantments() {
CustomAnvil.instance.logger.info("Preparing Excellent Enchants compatibility...")
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.registerEnchantment(CAEEEnchantment(enchantment))
}
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;
}
}

View file

@ -49,8 +49,8 @@ permissions:
description: Allow player to use hexadecimal color if permission is required (toggleable) description: Allow player to use hexadecimal color if permission is required (toggleable)
# soft depend on old name, so I can disable it if it is on the same server # soft depend on old name (UnsafeEnchantsPlus), so I can disable it if it is on the same server (old name for this plugin)
# as it is the old name for this plugin # Also depend to other plugin for compatibility
softdepend: softdepend:
- UnsafeEnchantsPlus - UnsafeEnchantsPlus
- ProtocolLib - ProtocolLib
@ -58,3 +58,4 @@ softdepend:
- EnchantsSquared - EnchantsSquared
- EcoEnchants - EcoEnchants
- eco - eco
- ExcellentEnchants