From f5343440e43be7dba26703fd98796b657718c5ce Mon Sep 17 00:00:00 2001 From: alexcrea Date: Thu, 14 May 2026 06:30:46 +0200 Subject: [PATCH] add super enchant compatibility --- .../wrapped/CASuperEnchantEnchantment.java | 73 ++++++++++++++++ .../cuanvil/dependency/DependencyManager.kt | 7 ++ .../plugins/GenericPluginDependency.kt | 6 +- .../plugins/SuperEnchantDependency.kt | 86 +++++++++++++++++++ 4 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CASuperEnchantEnchantment.java create mode 100644 src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/SuperEnchantDependency.kt diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CASuperEnchantEnchantment.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CASuperEnchantEnchantment.java new file mode 100644 index 0000000..669c1fa --- /dev/null +++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CASuperEnchantEnchantment.java @@ -0,0 +1,73 @@ +package xyz.alexcrea.cuanvil.enchant.wrapped; + +import com.maddoxh.superEnchants.enchants.CustomEnchant; +import com.maddoxh.superEnchants.enchants.EnchantManager; +import com.maddoxh.superEnchants.items.EnchantApplicator; +import com.maddoxh.superEnchants.items.EnchantReader; +import com.maddoxh.superEnchants.util.ConflictChecker; +import org.bukkit.NamespacedKey; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; +import xyz.alexcrea.cuanvil.enchant.AdditionalTestEnchantment; +import xyz.alexcrea.cuanvil.enchant.CAEnchantment; +import xyz.alexcrea.cuanvil.enchant.CAEnchantmentBase; +import xyz.alexcrea.cuanvil.enchant.EnchantmentRarity; + +import java.util.HashMap; +import java.util.Map; + +public class CASuperEnchantEnchantment extends CAEnchantmentBase implements AdditionalTestEnchantment { + + private @NotNull CustomEnchant enchant; + private @NotNull EnchantManager enchantManager; + + public CASuperEnchantEnchantment(@NotNull CustomEnchant enchant, @NotNull Plugin plugin, @NotNull EnchantManager enchantManager) { + super(NamespacedKey.fromString(enchant.getId(), plugin), EnchantmentRarity.NO_RARITY, enchant.getMaxLevel()); + + this.enchant = enchant; + this.enchantManager = enchantManager; + } + + @Override + public int getLevel(@NotNull ItemStack item, @NotNull ItemMeta meta) { + return EnchantReader.INSTANCE.getEnchantLevel(item, enchant.getId()); + } + + @Override + public boolean isEnchantmentPresent(@NotNull ItemStack item, @NotNull ItemMeta meta) { + return EnchantReader.INSTANCE.hasEnchant(item, enchant.getId()); + } + + @Override + public void addEnchantmentUnsafe(@NotNull ItemStack item, int level) { + EnchantApplicator.INSTANCE.applyEnchant(item, enchant.getId(), level); + } + + @Override + public void removeFrom(@NotNull ItemStack item) { + EnchantApplicator.INSTANCE.removeEnchant(item, enchant.getId()); + } + + @Override + public boolean isEnchantConflict(@NotNull Map enchantments, @NotNull NamespacedKey itemType) { + var idMap = new HashMap(); + + enchantments.forEach((enchant, level) -> { + if(!(enchant instanceof CASuperEnchantEnchantment superEnch)) return; + idMap.put(superEnch.enchant.getId(), level); + }); + + return ConflictChecker.INSTANCE.hasConflict( + idMap, + enchant.getId(), + enchantManager + ) != null; + } + + @Override + public boolean isItemConflict(@NotNull Map enchantments, @NotNull NamespacedKey itemType, @NotNull ItemStack item) { + return !enchant.canApplyTo(item.getType()); + } +} diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt index 6794af0..df2fbce 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt @@ -1,5 +1,6 @@ package xyz.alexcrea.cuanvil.dependency +import com.maddoxh.superEnchants.SuperEnchants import io.delilaheve.CustomAnvil import net.kyori.adventure.text.Component import org.bukkit.Bukkit @@ -104,6 +105,12 @@ object DependencyManager { if (pluginManager.isPluginEnabled("ItemsAdder")) genericDependencies.add(GenericPluginDependency(pluginManager.getPlugin("ItemsAdder")!!)) + if (pluginManager.isPluginEnabled("SuperEnchants")){ + val compatibility = SuperEnchantDependency(pluginManager.getPlugin("SuperEnchants")!! as SuperEnchants) + if(compatibility.registerEnchantments()) + genericDependencies.add(compatibility) + } + for (dependency in genericDependencies) dependency.redirectListeners() diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/GenericPluginDependency.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/GenericPluginDependency.kt index 85b66d5..5ef6926 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/GenericPluginDependency.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/GenericPluginDependency.kt @@ -5,7 +5,7 @@ import org.bukkit.event.inventory.PrepareAnvilEvent import org.bukkit.plugin.Plugin import org.bukkit.plugin.RegisteredListener -open class GenericPluginDependency(protected val plugin: Plugin) { +open class GenericPluginDependency(protected open val plugin: Plugin, private val testPrepare: Boolean = true) { private val preAnvil = ArrayList() private val postAnvil = ArrayList() @@ -40,6 +40,8 @@ open class GenericPluginDependency(protected val plugin: Plugin) { } open fun testPrepareAnvil(event: PrepareAnvilEvent): Boolean { + if(!testPrepare) return false + val previousResult = event.result event.result = null @@ -53,6 +55,8 @@ open class GenericPluginDependency(protected val plugin: Plugin) { } open fun testAnvilResult(event: InventoryClickEvent): Boolean { + if(!testPrepare) return false + for (registeredListener in postAnvil) { registeredListener.callEvent(event) diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/SuperEnchantDependency.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/SuperEnchantDependency.kt new file mode 100644 index 0000000..2135e78 --- /dev/null +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/SuperEnchantDependency.kt @@ -0,0 +1,86 @@ +package xyz.alexcrea.cuanvil.dependency.plugins + +import com.maddoxh.superEnchants.SuperEnchants +import com.maddoxh.superEnchants.enchants.EnchantManager +import com.maddoxh.superEnchants.listeners.AnvilListener +import io.delilaheve.CustomAnvil +import org.bukkit.command.Command +import org.bukkit.command.CommandExecutor +import org.bukkit.command.CommandSender +import org.bukkit.event.inventory.InventoryClickEvent +import org.bukkit.plugin.RegisteredListener +import xyz.alexcrea.cuanvil.api.EnchantmentApi +import xyz.alexcrea.cuanvil.enchant.wrapped.CASuperEnchantEnchantment +import java.util.logging.Level + +class SuperEnchantDependency(override val plugin: SuperEnchants): GenericPluginDependency(plugin, false) { + + lateinit var enchManager: EnchantManager + val enchantments = ArrayList() + + fun registerEnchantments(): Boolean{ + CustomAnvil.instance.logger.info("Preparing Super Enchant compatibility...") + + val field = SuperEnchants::class.java.getDeclaredField("enchantManager") + if(field == null) { + CustomAnvil.instance.logger.log(Level.SEVERE, "Failed to initialize Super Enchant compatibility") + return false + } + field.setAccessible(true) + + enchManager = field.get(plugin) as EnchantManager + overrideReloadCommand() + + reload() + return true + } + + fun reload() { + for (enchantment in enchantments) { + EnchantmentApi.unregisterEnchantment(enchantment) + } + enchantments.clear() + + // Register enchantments + for (enchant in enchManager.getAll()) { + val enchantment = CASuperEnchantEnchantment(enchant, plugin, enchManager) + enchantments.add(enchantment) + + EnchantmentApi.registerEnchantment(enchantment) + } + } + + private fun overrideReloadCommand() { + val reload = CustomAnvil.instance.getCommand("sereload") + + reload?.setExecutor(ReloadInterceptor(reload.executor)) + } + + inner class ReloadInterceptor(val other: CommandExecutor): CommandExecutor { + + override fun onCommand( + sender: CommandSender, + command: Command, + label: String, + args: Array + ): Boolean { + val result = other.onCommand(sender, command, label, args) + + CustomAnvil.log("Detected SuperEnchant reload") + reload() + + return result + } + + } + + override fun fillPostAnvil(postAnvil: ArrayList, preAnvil: ArrayList) { + + for (registeredListener in InventoryClickEvent.getHandlerList().registeredListeners) { + + if (registeredListener.listener.javaClass != AnvilListener::class.java) continue + postAnvil.add(registeredListener) + } + } + +}