add super enchant compatibility

This commit is contained in:
alexcrea 2026-05-14 06:30:46 +02:00
parent 55f6b94ba9
commit f5343440e4
Signed by: alexcrea
GPG key ID: E346CD16413450E3
4 changed files with 171 additions and 1 deletions

View file

@ -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<CAEnchantment, Integer> enchantments, @NotNull NamespacedKey itemType) {
var idMap = new HashMap<String, Integer>();
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<CAEnchantment, Integer> enchantments, @NotNull NamespacedKey itemType, @NotNull ItemStack item) {
return !enchant.canApplyTo(item.getType());
}
}

View file

@ -1,5 +1,6 @@
package xyz.alexcrea.cuanvil.dependency package xyz.alexcrea.cuanvil.dependency
import com.maddoxh.superEnchants.SuperEnchants
import io.delilaheve.CustomAnvil import io.delilaheve.CustomAnvil
import net.kyori.adventure.text.Component import net.kyori.adventure.text.Component
import org.bukkit.Bukkit import org.bukkit.Bukkit
@ -104,6 +105,12 @@ object DependencyManager {
if (pluginManager.isPluginEnabled("ItemsAdder")) if (pluginManager.isPluginEnabled("ItemsAdder"))
genericDependencies.add(GenericPluginDependency(pluginManager.getPlugin("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) for (dependency in genericDependencies)
dependency.redirectListeners() dependency.redirectListeners()

View file

@ -5,7 +5,7 @@ import org.bukkit.event.inventory.PrepareAnvilEvent
import org.bukkit.plugin.Plugin import org.bukkit.plugin.Plugin
import org.bukkit.plugin.RegisteredListener 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<RegisteredListener>() private val preAnvil = ArrayList<RegisteredListener>()
private val postAnvil = ArrayList<RegisteredListener>() private val postAnvil = ArrayList<RegisteredListener>()
@ -40,6 +40,8 @@ open class GenericPluginDependency(protected val plugin: Plugin) {
} }
open fun testPrepareAnvil(event: PrepareAnvilEvent): Boolean { open fun testPrepareAnvil(event: PrepareAnvilEvent): Boolean {
if(!testPrepare) return false
val previousResult = event.result val previousResult = event.result
event.result = null event.result = null
@ -53,6 +55,8 @@ open class GenericPluginDependency(protected val plugin: Plugin) {
} }
open fun testAnvilResult(event: InventoryClickEvent): Boolean { open fun testAnvilResult(event: InventoryClickEvent): Boolean {
if(!testPrepare) return false
for (registeredListener in postAnvil) { for (registeredListener in postAnvil) {
registeredListener.callEvent(event) registeredListener.callEvent(event)

View file

@ -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<CASuperEnchantEnchantment>()
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<out String?>
): Boolean {
val result = other.onCommand(sender, command, label, args)
CustomAnvil.log("Detected SuperEnchant reload")
reload()
return result
}
}
override fun fillPostAnvil(postAnvil: ArrayList<RegisteredListener>, preAnvil: ArrayList<RegisteredListener>) {
for (registeredListener in InventoryClickEvent.getHandlerList().registeredListeners) {
if (registeredListener.listener.javaClass != AnvilListener::class.java) continue
postAnvil.add(registeredListener)
}
}
}