Fixed enchantment registration on 1.21.4

This commit is contained in:
Will FP
2025-01-20 15:05:04 +00:00
parent b3a5afc39c
commit 49e3cc02b5
5 changed files with 28 additions and 16 deletions

View File

@@ -55,7 +55,7 @@ allprojects {
} }
dependencies { dependencies {
compileOnly("com.willfp:eco:6.74.3") compileOnly("com.willfp:eco:6.75.0")
compileOnly("org.jetbrains:annotations:23.0.0") compileOnly("org.jetbrains:annotations:23.0.0")
compileOnly("org.jetbrains.kotlin:kotlin-stdlib:2.1.0") compileOnly("org.jetbrains.kotlin:kotlin-stdlib:2.1.0")
compileOnly("com.github.ben-manes.caffeine:caffeine:3.1.5") compileOnly("com.github.ben-manes.caffeine:caffeine:3.1.5")

View File

@@ -1,5 +1,5 @@
plugins { plugins {
id("io.papermc.paperweight.userdev") version "2.0.0-beta.8" apply false id("io.papermc.paperweight.userdev") version "2.0.0-beta.14" apply false
} }
group = "com.willfp" group = "com.willfp"

View File

@@ -7,8 +7,8 @@ import com.willfp.ecoenchants.enchant.registration.modern.ModernEnchantmentRegis
import com.willfp.ecoenchants.proxy.v1_21_4.registration.EcoEnchantsCraftEnchantment import com.willfp.ecoenchants.proxy.v1_21_4.registration.EcoEnchantsCraftEnchantment
import com.willfp.ecoenchants.proxy.v1_21_4.registration.ModifiedVanillaCraftEnchantment import com.willfp.ecoenchants.proxy.v1_21_4.registration.ModifiedVanillaCraftEnchantment
import com.willfp.ecoenchants.proxy.v1_21_4.registration.vanillaEcoEnchantsEnchantment import com.willfp.ecoenchants.proxy.v1_21_4.registration.vanillaEcoEnchantsEnchantment
import io.papermc.paper.registry.WritableCraftRegistry
import io.papermc.paper.registry.entry.RegistryTypeMapper import io.papermc.paper.registry.entry.RegistryTypeMapper
import io.papermc.paper.registry.legacy.DelayedRegistry
import net.minecraft.core.Holder import net.minecraft.core.Holder
import net.minecraft.core.MappedRegistry import net.minecraft.core.MappedRegistry
import net.minecraft.core.Registry import net.minecraft.core.Registry
@@ -23,13 +23,15 @@ import org.bukkit.enchantments.Enchantment
import java.lang.reflect.Modifier import java.lang.reflect.Modifier
import java.util.IdentityHashMap import java.util.IdentityHashMap
import java.util.function.BiFunction import java.util.function.BiFunction
import javax.annotation.Nullable
private val enchantmentRegistry = private val enchantmentRegistry =
(Bukkit.getServer() as CraftServer).server.registryAccess().lookupOrThrow(Registries.ENCHANTMENT) (Bukkit.getServer() as CraftServer).server.registryAccess().lookupOrThrow(Registries.ENCHANTMENT)
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
private val bukkitRegistry = private val bukkitRegistry: org.bukkit.Registry<Enchantment>
org.bukkit.Registry.ENCHANTMENT get() =
(org.bukkit.Registry.ENCHANTMENT as DelayedRegistry<Enchantment, *>).delegate()
class ModernEnchantmentRegisterer : ModernEnchantmentRegistererProxy { class ModernEnchantmentRegisterer : ModernEnchantmentRegistererProxy {
private val frozenField = MappedRegistry::class.java private val frozenField = MappedRegistry::class.java
@@ -44,7 +46,8 @@ class ModernEnchantmentRegisterer : ModernEnchantmentRegistererProxy {
private val unregisteredIntrusiveHoldersField = MappedRegistry::class.java private val unregisteredIntrusiveHoldersField = MappedRegistry::class.java
.declaredFields .declaredFields
.last { it.type == Map::class.java } .filter { it.type == Map::class.java }
.filter { it.isAnnotationPresent(Nullable::class.java) }[0]
.apply { isAccessible = true } .apply { isAccessible = true }
// 1.21.4+ only has minecraftToBukkit in CraftRegistry, removing the duplicate in WritableCraftRegistry // 1.21.4+ only has minecraftToBukkit in CraftRegistry, removing the duplicate in WritableCraftRegistry
@@ -60,12 +63,14 @@ class ModernEnchantmentRegisterer : ModernEnchantmentRegistererProxy {
val newRegistryMTB = val newRegistryMTB =
BiFunction<NamespacedKey, net.minecraft.world.item.enchantment.Enchantment, Enchantment?> { key, registry -> BiFunction<NamespacedKey, net.minecraft.world.item.enchantment.Enchantment, Enchantment?> { key, registry ->
val eco = EcoEnchants.getByID(key.key) val eco = EcoEnchants.getByID(key.key)
val registered = enchantmentRegistry.containsKey(CraftNamespacedKey.toMinecraft(key)) val isRegistered = enchantmentRegistry.containsKey(CraftNamespacedKey.toMinecraft(key))
if (eco != null) { if (eco != null) {
eco as Enchantment eco as Enchantment
} else if (registered) { } else if (isRegistered) {
ModifiedVanillaCraftEnchantment(key, registry) val holder = enchantmentRegistry.get(CraftNamespacedKey.toMinecraft(key)).get()
ModifiedVanillaCraftEnchantment(key, registry, holder)
} else { } else {
null null
} }
@@ -75,7 +80,10 @@ class ModernEnchantmentRegisterer : ModernEnchantmentRegistererProxy {
// The nasty casting hack is because of some weird nullability changes, if I set the BiFunction to have a // The nasty casting hack is because of some weird nullability changes, if I set the BiFunction to have a
// non-nullable bukkit enchantment type then it refuses to build, some sort of K2 compiler change. // non-nullable bukkit enchantment type then it refuses to build, some sort of K2 compiler change.
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
minecraftToBukkit.set(bukkitRegistry, RegistryTypeMapper(newRegistryMTB as BiFunction<NamespacedKey, net.minecraft.world.item.enchantment.Enchantment, Enchantment>)) minecraftToBukkit.set(
bukkitRegistry,
RegistryTypeMapper(newRegistryMTB as BiFunction<NamespacedKey, net.minecraft.world.item.enchantment.Enchantment, Enchantment>)
)
// Clear the enchantment cache // Clear the enchantment cache
cache.set(bukkitRegistry, mutableMapOf<NamespacedKey, Enchantment>()) cache.set(bukkitRegistry, mutableMapOf<NamespacedKey, Enchantment>())
@@ -112,7 +120,7 @@ class ModernEnchantmentRegisterer : ModernEnchantmentRegistererProxy {
val nms = enchantmentRegistry[CraftNamespacedKey.toMinecraft(enchant.enchantmentKey)] val nms = enchantmentRegistry[CraftNamespacedKey.toMinecraft(enchant.enchantmentKey)]
if (nms.isPresent) { if (nms.isPresent) {
return EcoEnchantsCraftEnchantment(enchant, nms.get().value()) return EcoEnchantsCraftEnchantment(enchant, nms.get())
} else { } else {
throw IllegalStateException("Enchantment ${enchant.id} wasn't registered") throw IllegalStateException("Enchantment ${enchant.id} wasn't registered")
} }

View File

@@ -5,15 +5,17 @@ import com.willfp.ecoenchants.display.getFormattedName
import com.willfp.ecoenchants.enchant.EcoEnchant import com.willfp.ecoenchants.enchant.EcoEnchant
import com.willfp.ecoenchants.enchant.impl.EcoEnchantBase import com.willfp.ecoenchants.enchant.impl.EcoEnchantBase
import net.kyori.adventure.text.Component import net.kyori.adventure.text.Component
import net.minecraft.core.Holder
import net.minecraft.world.item.enchantment.Enchantment import net.minecraft.world.item.enchantment.Enchantment
import org.bukkit.NamespacedKey
import org.bukkit.craftbukkit.enchantments.CraftEnchantment import org.bukkit.craftbukkit.enchantments.CraftEnchantment
import org.bukkit.enchantments.EnchantmentTarget import org.bukkit.enchantments.EnchantmentTarget
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
class EcoEnchantsCraftEnchantment( class EcoEnchantsCraftEnchantment(
private val enchant: EcoEnchantBase, private val enchant: EcoEnchantBase,
nmsEnchantment: Enchantment holder: Holder<Enchantment>
) : CraftEnchantment(enchant.enchantmentKey, nmsEnchantment), EcoEnchant by enchant { ) : CraftEnchantment(holder), EcoEnchant by enchant {
init { init {
enchant.enchantment = this enchant.enchantment = this
} }

View File

@@ -1,14 +1,16 @@
package com.willfp.ecoenchants.proxy.v1_21_4.registration package com.willfp.ecoenchants.proxy.v1_21_4.registration
import com.willfp.ecoenchants.enchant.vanillaEnchantmentData import com.willfp.ecoenchants.enchant.vanillaEnchantmentData
import net.minecraft.core.Holder
import net.minecraft.world.item.enchantment.Enchantment import net.minecraft.world.item.enchantment.Enchantment
import org.bukkit.NamespacedKey import org.bukkit.NamespacedKey
import org.bukkit.craftbukkit.enchantments.CraftEnchantment import org.bukkit.craftbukkit.enchantments.CraftEnchantment
class ModifiedVanillaCraftEnchantment( class ModifiedVanillaCraftEnchantment(
key: NamespacedKey, private val key: NamespacedKey,
target: Enchantment target: Enchantment,
) : CraftEnchantment(key, target) { holder: Holder<Enchantment>
) : CraftEnchantment(holder) {
override fun getMaxLevel(): Int = this.vanillaEnchantmentData?.maxLevel ?: super.getMaxLevel() override fun getMaxLevel(): Int = this.vanillaEnchantmentData?.maxLevel ?: super.getMaxLevel()
override fun conflictsWith(other: org.bukkit.enchantments.Enchantment): Boolean { override fun conflictsWith(other: org.bukkit.enchantments.Enchantment): Boolean {