Superenchant compatibility (#111)

Superenchant compatibility & update kotlin to 2.3
This commit is contained in:
alexcrea 2026-05-17 17:15:38 +02:00 committed by GitHub
commit a1984ad5b9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
27 changed files with 198 additions and 24 deletions

View file

@ -8,7 +8,7 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
plugins { plugins {
kotlin("jvm") version "2.1.0" kotlin("jvm") version "2.3.0"
java java
id("org.jetbrains.dokka").version("1.9.20") id("org.jetbrains.dokka").version("1.9.20")
id("com.gradleup.shadow").version("9.3.0") id("com.gradleup.shadow").version("9.3.0")
@ -94,6 +94,9 @@ dependencies {
// AxPlayerWarps // AxPlayerWarps
compileOnly(files("libs/AxPlayerWarps-1.10.3.jar")) compileOnly(files("libs/AxPlayerWarps-1.10.3.jar"))
// SuperEnchants
compileOnly(files("libs/SuperEnchants-4.6.2-all.jar"))
// Include nms // Include nms
implementation(project(":nms:nms-common")) implementation(project(":nms:nms-common"))
implementation(project(":nms:nms-paper")) implementation(project(":nms:nms-paper"))
@ -153,7 +156,7 @@ allprojects {
kotlin { kotlin {
compilerOptions { compilerOptions {
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0) apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
jvmTarget.set(JvmTarget.JVM_16) jvmTarget.set(JvmTarget.JVM_16)
} }
} }
@ -187,7 +190,7 @@ tasks {
shadowJar { shadowJar {
configureBaseShadow("", configureBaseShadow("",
arrayOf( arrayOf(
"org.jetbrains.kotlin:kotlin-stdlib:2.1.0", "org.jetbrains.kotlin:kotlin-stdlib:2.3.0",
"net.kyori:adventure-text-minimessage:4.25.0", "net.kyori:adventure-text-minimessage:4.25.0",
"net.kyori:adventure-text-serializer-plain:4.25.0", "net.kyori:adventure-text-serializer-plain:4.25.0",
"net.kyori:adventure-text-serializer-legacy:4.25.0", "net.kyori:adventure-text-serializer-legacy:4.25.0",

View file

@ -2,7 +2,7 @@ group = rootProject.group
version = rootProject.version version = rootProject.version
plugins { plugins {
kotlin("jvm") version "2.1.0" kotlin("jvm") version "2.3.0"
} }
repositories { repositories {

View file

@ -2,7 +2,7 @@ group = rootProject.group
version = rootProject.version version = rootProject.version
plugins { plugins {
kotlin("jvm") version "2.1.0" kotlin("jvm") version "2.3.0"
} }
// Imitate needed class and method to support legacy version of EcoEnchant // Imitate needed class and method to support legacy version of EcoEnchant

Binary file not shown.

View file

@ -29,7 +29,7 @@ tasks.withType<JavaCompile>().configureEach {
kotlin { kotlin {
compilerOptions { compilerOptions {
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0) apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
jvmTarget.set(JvmTarget.JVM_16) jvmTarget.set(JvmTarget.JVM_16)
} }
} }

View file

@ -29,7 +29,7 @@ tasks.withType<JavaCompile>().configureEach {
kotlin { kotlin {
compilerOptions { compilerOptions {
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0) apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
jvmTarget.set(JvmTarget.JVM_18) jvmTarget.set(JvmTarget.JVM_18)
} }
} }

View file

@ -29,7 +29,7 @@ tasks.withType<JavaCompile>().configureEach {
kotlin { kotlin {
compilerOptions { compilerOptions {
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0) apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
jvmTarget.set(JvmTarget.JVM_16) jvmTarget.set(JvmTarget.JVM_16)
} }
} }

View file

@ -29,7 +29,7 @@ tasks.withType<JavaCompile>().configureEach {
kotlin { kotlin {
compilerOptions { compilerOptions {
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0) apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
jvmTarget.set(JvmTarget.JVM_17) jvmTarget.set(JvmTarget.JVM_17)
} }
} }

View file

@ -29,7 +29,7 @@ tasks.withType<JavaCompile>().configureEach {
kotlin { kotlin {
compilerOptions { compilerOptions {
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0) apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
jvmTarget.set(JvmTarget.JVM_17) jvmTarget.set(JvmTarget.JVM_17)
} }
} }

View file

@ -29,7 +29,7 @@ tasks.withType<JavaCompile>().configureEach {
kotlin { kotlin {
compilerOptions { compilerOptions {
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0) apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
jvmTarget.set(JvmTarget.JVM_17) jvmTarget.set(JvmTarget.JVM_17)
} }
} }

View file

@ -29,7 +29,7 @@ tasks.withType<JavaCompile>().configureEach {
kotlin { kotlin {
compilerOptions { compilerOptions {
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0) apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
jvmTarget.set(JvmTarget.JVM_17) jvmTarget.set(JvmTarget.JVM_17)
} }
} }

View file

@ -29,7 +29,7 @@ tasks.withType<JavaCompile>().configureEach {
kotlin { kotlin {
compilerOptions { compilerOptions {
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0) apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
jvmTarget.set(JvmTarget.JVM_17) jvmTarget.set(JvmTarget.JVM_17)
} }
} }

View file

@ -29,7 +29,7 @@ tasks.withType<JavaCompile>().configureEach {
kotlin { kotlin {
compilerOptions { compilerOptions {
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0) apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
jvmTarget.set(JvmTarget.JVM_18) jvmTarget.set(JvmTarget.JVM_18)
} }
} }

View file

@ -29,7 +29,7 @@ tasks.withType<JavaCompile>().configureEach {
kotlin { kotlin {
compilerOptions { compilerOptions {
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0) apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
jvmTarget.set(JvmTarget.JVM_18) jvmTarget.set(JvmTarget.JVM_18)
} }
} }

View file

@ -29,7 +29,7 @@ tasks.withType<JavaCompile>().configureEach {
kotlin { kotlin {
compilerOptions { compilerOptions {
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0) apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
jvmTarget.set(JvmTarget.JVM_18) jvmTarget.set(JvmTarget.JVM_18)
} }
} }

View file

@ -29,7 +29,7 @@ tasks.withType<JavaCompile>().configureEach {
kotlin { kotlin {
compilerOptions { compilerOptions {
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0) apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
jvmTarget.set(JvmTarget.JVM_21) jvmTarget.set(JvmTarget.JVM_21)
} }
} }

View file

@ -29,7 +29,7 @@ tasks.withType<JavaCompile>().configureEach {
kotlin { kotlin {
compilerOptions { compilerOptions {
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0) apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
jvmTarget.set(JvmTarget.JVM_21) jvmTarget.set(JvmTarget.JVM_21)
} }
} }

View file

@ -29,7 +29,7 @@ tasks.withType<JavaCompile>().configureEach {
kotlin { kotlin {
compilerOptions { compilerOptions {
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0) apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
jvmTarget.set(JvmTarget.JVM_21) jvmTarget.set(JvmTarget.JVM_21)
} }
} }

View file

@ -28,7 +28,7 @@ tasks.withType<JavaCompile>().configureEach {
kotlin { kotlin {
compilerOptions { compilerOptions {
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0) apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
jvmTarget.set(JvmTarget.JVM_21) jvmTarget.set(JvmTarget.JVM_21)
} }
} }

View file

@ -28,7 +28,7 @@ tasks.withType<JavaCompile>().configureEach {
kotlin { kotlin {
compilerOptions { compilerOptions {
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0) apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
jvmTarget.set(JvmTarget.JVM_21) jvmTarget.set(JvmTarget.JVM_21)
} }
} }

View file

@ -28,7 +28,7 @@ tasks.withType<JavaCompile>().configureEach {
kotlin { kotlin {
compilerOptions { compilerOptions {
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0) apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
jvmTarget.set(JvmTarget.JVM_21) jvmTarget.set(JvmTarget.JVM_21)
} }
} }

View file

@ -28,7 +28,7 @@ tasks.withType<JavaCompile>().configureEach {
kotlin { kotlin {
compilerOptions { compilerOptions {
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0) apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
jvmTarget.set(JvmTarget.JVM_21) jvmTarget.set(JvmTarget.JVM_21)
} }
} }

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)
}
}
}

View file

@ -75,3 +75,4 @@ softdepend:
- eco - eco
- ExcellentEnchants - ExcellentEnchants
- HavenBags - HavenBags
- SuperEnchants