mirror of
https://github.com/alexcrea/CustomAnvil.git
synced 2026-06-23 16:16:17 +02:00
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:
parent
7c283dc7f8
commit
13b7e73d8c
8 changed files with 177 additions and 4 deletions
|
|
@ -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")
|
||||||
|
|
||||||
|
|
|
||||||
BIN
libs/ExcellentEnchants-4.2.2.jar
Normal file
BIN
libs/ExcellentEnchants-4.2.2.jar
Normal file
Binary file not shown.
BIN
libs/nightcore-2.6.4.jar
Normal file
BIN
libs/nightcore-2.6.4.jar
Normal file
Binary file not shown.
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue