Fixed enchantment registration on 1.21.4
This commit is contained in:
@@ -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")
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user