From 62ae4bb5d36bfd7bcf85727dfadbf8ff2af27518 Mon Sep 17 00:00:00 2001 From: Micalhl Date: Wed, 1 Apr 2026 00:37:03 +0800 Subject: [PATCH 01/13] =?UTF-8?q?nms=20=E6=A8=A1=E5=9D=97=E5=88=9D?= =?UTF-8?q?=E6=AD=A5=E5=85=BC=E5=AE=B9=2026.1,=20=E6=9B=B4=E6=94=B9?= =?UTF-8?q?=E8=BD=AC=E8=AF=91=E9=80=BB=E8=BE=91,=20=E7=AD=89=E5=BE=85?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20bug=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle.properties | 2 +- .../module/ai/PathfinderExecutorImpl17.kt | 4 +- .../taboolib/module/nms/MeteorInjector.java | 13 ++- .../module/nms/AsmClassTranslation.kt | 13 ++- .../kotlin/taboolib/module/nms/Mapping.kt | 82 ++++++++----- .../module/nms/MinecraftServerUtil.kt | 14 ++- .../taboolib/module/nms/MinecraftVersion.kt | 52 ++++++--- .../kotlin/taboolib/module/nms/PacketImpl.kt | 4 +- .../module/nms/remap/RemapTranslation.kt | 6 +- .../nms/remap/RemapTranslationLegacy.kt | 2 + .../nms/remap/RemapTranslationTabooLib.kt | 2 + .../nms/remap/RemapTranslationUnobfsucated.kt | 16 +++ .../src/main/resources/mapping.json | 108 ++++++++++++++++++ 13 files changed, 253 insertions(+), 65 deletions(-) create mode 100644 module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslationUnobfsucated.kt diff --git a/gradle.properties b/gradle.properties index 3011ed229..f44c8b357 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ group=taboolib -version=6.2.4 +version=6.3.0 kotlin.incremental=true kotlin.incremental.java=true kotlin.caching.enabled=true diff --git a/module/bukkit-nms/bukkit-nms-ai/src/main/java/taboolib/module/ai/PathfinderExecutorImpl17.kt b/module/bukkit-nms/bukkit-nms-ai/src/main/java/taboolib/module/ai/PathfinderExecutorImpl17.kt index 552688406..3dad5f3f2 100644 --- a/module/bukkit-nms/bukkit-nms-ai/src/main/java/taboolib/module/ai/PathfinderExecutorImpl17.kt +++ b/module/bukkit-nms/bukkit-nms-ai/src/main/java/taboolib/module/ai/PathfinderExecutorImpl17.kt @@ -34,12 +34,12 @@ class PathfinderExecutorImpl17 : PathfinderExecutor() { init { pathfinderGoalSelectorSet = PathfinderGoalSelector::class.java.getDeclaredField( // Paper 1.20.5+ using mojmap - if (MinecraftVersion.isUniversalCraftBukkit) "availableGoals" else if (MinecraftVersion.majorLegacy >= 12005) "c" else "d" + if (MinecraftVersion.isMojangMapping) "availableGoals" else if (MinecraftVersion.majorLegacy >= 12005) "c" else "d" ) pathfinderGoalSelectorSet.isAccessible = true controllerJumpCurrent = ControllerJump::class.java.getDeclaredField( // Paper 1.20.5+ using mojmap - if (MinecraftVersion.isUniversalCraftBukkit) "jump" else "a" + if (MinecraftVersion.isMojangMapping) "jump" else "a" ) controllerJumpCurrent.isAccessible = true for (field in NavigationAbstract::class.java.declaredFields) { diff --git a/module/bukkit-nms/src/main/java/taboolib/module/nms/MeteorInjector.java b/module/bukkit-nms/src/main/java/taboolib/module/nms/MeteorInjector.java index e164eb4ab..85c074c91 100644 --- a/module/bukkit-nms/src/main/java/taboolib/module/nms/MeteorInjector.java +++ b/module/bukkit-nms/src/main/java/taboolib/module/nms/MeteorInjector.java @@ -32,9 +32,9 @@ @SuppressWarnings({"SameParameterValue", "unused", "StatementWithEmptyBody", "LoopConditionNotUpdatedInsideLoop", "unchecked", "JavadocBlankLines"}) public class MeteorInjector implements Closeable { - private static final Class SERVER_CLASS = getNMSClass("MinecraftServer", "server"); - private static final Class SERVER_CONNECTION_CLASS = getNMSClass("ServerConnection", "server.network"); - private static final Class PACKET_LOGIN_OUT_SUCCESS_CLASS = getNMSClass("PacketLoginOutSuccess", "network.protocol.login"); + private static final Class SERVER_CLASS = getNMSClass("MinecraftServer", "server", "MinecraftServer", "server"); + private static final Class SERVER_CONNECTION_CLASS = getNMSClass("ServerConnection", "server.network", "ServerConnectionListener", "server.network"); + private static final Class PACKET_LOGIN_OUT_SUCCESS_CLASS = getNMSClass("PacketLoginOutSuccess", "network.protocol.login", "ClientboundLoginFinishedPacket", "network.protocol.login"); private static final Field NMS_SERVER = getField(getCBClass("CraftServer"), SERVER_CLASS, 1); private static final Field NMS_SERVER_CONNECTION = getField(SERVER_CLASS, SERVER_CONNECTION_CLASS, 1); @@ -289,10 +289,13 @@ public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) // ====================================== Reflection stuff ====================================== - private static Class getNMSClass(String name, String mcPackage) { + private static Class getNMSClass(String name, String mcPackage, String mojmapName, String mojmapMcPackage) { String clazz; // NOTICE 从 1.17+ 开始, NMS 不再带有版本号 - if (MinecraftVersion.INSTANCE.isUniversal()) { + if (MinecraftVersion.INSTANCE.isMojangMapping()) { + clazz = "net.minecraft." + mojmapMcPackage + '.' + mojmapName; + } + else if (MinecraftVersion.INSTANCE.isUniversal()) { clazz = "net.minecraft." + mcPackage + '.' + name; } else { clazz = "net.minecraft.server." + MinecraftVersion.INSTANCE.getMinecraftVersion() + '.' + name; diff --git a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/AsmClassTranslation.kt b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/AsmClassTranslation.kt index e3ef912ce..4145d7650 100644 --- a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/AsmClassTranslation.kt +++ b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/AsmClassTranslation.kt @@ -15,6 +15,7 @@ import taboolib.common.util.t import taboolib.module.nms.remap.RemapTranslation import taboolib.module.nms.remap.RemapTranslationLegacy import taboolib.module.nms.remap.RemapTranslationTabooLib +import taboolib.module.nms.remap.RemapTranslationUnobfuscated /** * TabooLib 所使用的 "org.objectweb.asm" 是经过重定向后的,通常表现为 "org.objectweb.asm9"。 @@ -66,8 +67,11 @@ class AsmClassTranslation(val source: String) { val (newClass, cost2) = execution { val classReader = ClassReader(bytes) val classWriter = ClassWriter(ClassWriter.COMPUTE_MAXS) - // 若当前运行环境为 Paper 时使用新版转换器 - val remapper = if (MinecraftVersion.isUniversalCraftBukkit) { + // 若当前运行环境为非混淆服务端,则不应该进行除 dynamic、requires 外的任何转译操作 + val remapper = if (MinecraftVersion.isUnobfuscated) { + RemapTranslationUnobfuscated() + } else if (MinecraftVersion.isMojangMapping) { + // 若当前运行环境为 Paper 时使用新版转换器 // 若转译对象为 TabooLib 类,需要特殊处理 if (source.startsWith(taboolibPath)) RemapTranslationTabooLib() else RemapTranslation() } @@ -99,7 +103,8 @@ class AsmClassTranslation(val source: String) { val mcRunningVersion = MinecraftVersion.runningVersion val mcNmsVersion = MinecraftVersion.minecraftVersion val isUniversal = MinecraftVersion.isUniversal - val isUniversalCB = MinecraftVersion.isUniversalCraftBukkit - return "mcRunning:$mcRunningVersion-nms:$mcNmsVersion-universal:$isUniversal-universalCB:$isUniversalCB" + val isUniversalCB = MinecraftVersion.isMojangMapping + val isUnobfuscated = MinecraftVersion.isUnobfuscated + return "mcRunning:$mcRunningVersion-nms:$mcNmsVersion-universal:$isUniversal-universalCB:$isUniversalCB-isUnobfuscated:$isUnobfuscated" } } \ No newline at end of file diff --git a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/Mapping.kt b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/Mapping.kt index 3a6a307de..ea276a7a9 100644 --- a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/Mapping.kt +++ b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/Mapping.kt @@ -10,6 +10,7 @@ import taboolib.common.util.t import taboolib.common.util.unsafeLazy import taboolib.platform.bukkit.Exchanges import java.io.File +import java.io.FileInputStream import java.io.InputStream import java.util.* @@ -66,6 +67,36 @@ class Mapping( // region spigot/paper/exchange 读取逻辑 companion object { + const val OSS_URL = "https://skymc.oss-cn-shanghai.aliyuncs.com/taboolib/resources/" + + val mappingJson: ByteArray? by unsafeLazy { + var mappingJson = runningResources["mapping.json"] + if (mappingJson == null) { + // 从文件系统中获取 + val localCache = File("cache/mapping.json") + if (localCache.exists()) { + mappingJson = localCache.readBytes() + } else { + warning( + """ + 未能找到资源文件 "mapping.json",请重启服务器并检查插件是否正常工作。 + Resource file "mapping.json" not found, please restart the server and check if the plugin is working properly. + """.t() + ) + warning( + """ + 已检索到的资源文件: ${runningResources.keys} + Available resource files: ${runningResources.keys} + """.t() + ) + return@unsafeLazy null + } + } + // 写入文件 + newFile("cache/mapping.json").writeBytes(mappingJson) + mappingJson + } + /** * 读取 Spigot 格式的映射文件 */ @@ -117,7 +148,24 @@ class Mapping( // region val time = System.currentTimeMillis() val mapping = Mapping() - val inputStream = obcClass("CraftServer").classLoader.getResourceAsStream("META-INF/mappings/reobf.tiny") ?: return mapping + var inputStream = obcClass("CraftServer").classLoader.getResourceAsStream("META-INF/mappings/reobf.tiny") + // 如果 inputStream 为空,说明是 Spigot 服务端 + if (inputStream == null) { + var reobfFile = "" + var reobfHash = "" + // 读取 mapping.json,远程下载对应版本的 reobf.tiny + val version = if (MinecraftVersion.isUniversal) MinecraftVersion.runningVersion else "1.17" + JsonParser().parse(mappingJson!!.decodeToString()).asJsonArray.forEach { + val obj = it.asJsonObject + if (version == obj["version"].asString) { + val reobf = obj["reobf"].asJsonObject + reobfFile = reobf["file"].asString + reobfHash = reobf["hash"].asString + RuntimeEnv.ENV_ASSETS.loadAssets("", reobfHash, "${OSS_URL}$reobfFile", false) + } + } + inputStream = FileInputStream("assets/${reobfHash.substring(0, 2)}/$reobfFile") + } inputStream.use { var i = 0 var mojangName = "" @@ -181,40 +229,14 @@ class SpigotMapping(val combined: String, val fields: String) { companion object { - const val OSS_URL = "https://skymc.oss-cn-shanghai.aliyuncs.com/taboolib/resources/" - /** * 当前运行环境所对应的 Spigot Mapping 文件 */ val current: SpigotMapping? by unsafeLazy { - var mappingJson = runningResources["mapping.json"] - if (mappingJson == null) { - // 从文件系统中获取 - val localCache = File("cache/mapping.json") - if (localCache.exists()) { - mappingJson = localCache.readBytes() - } else { - warning( - """ - 未能找到资源文件 "mapping.json",请重启服务器并检查插件是否正常工作。 - Resource file "mapping.json" not found, please restart the server and check if the plugin is working properly. - """.t() - ) - warning( - """ - 已检索到的资源文件: ${runningResources.keys} - Available resource files: ${runningResources.keys} - """.t() - ) - return@unsafeLazy null - } - } - // 写入文件 - newFile("cache/mapping.json").writeBytes(mappingJson) // 获取当前运行版本 val version = if (MinecraftVersion.isUniversal) MinecraftVersion.runningVersion else "1.17" // 解析文件 - JsonParser().parse(mappingJson.decodeToString()).asJsonArray.forEach { + JsonParser().parse(Mapping.mappingJson!!.decodeToString()).asJsonArray.forEach { val obj = it.asJsonObject if (version == obj["version"].asString) { // 解析 Json @@ -223,8 +245,8 @@ class SpigotMapping(val combined: String, val fields: String) { val fields = obj["fields"].asJsonObject val fieldsHash = fields["hash"].asString // 下载资源文件 - RuntimeEnv.ENV_ASSETS.loadAssets("", combinedHash, "$OSS_URL${combined["file"].asString}", true) - RuntimeEnv.ENV_ASSETS.loadAssets("", fieldsHash, "$OSS_URL${fields["file"].asString}", true) + RuntimeEnv.ENV_ASSETS.loadAssets("", combinedHash, "${Mapping.OSS_URL}${combined["file"].asString}", true) + RuntimeEnv.ENV_ASSETS.loadAssets("", fieldsHash, "${Mapping.OSS_URL}${fields["file"].asString}", true) return@unsafeLazy SpigotMapping(combinedHash, fieldsHash) } } diff --git a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/MinecraftServerUtil.kt b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/MinecraftServerUtil.kt index 98016a84e..00815e3b8 100644 --- a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/MinecraftServerUtil.kt +++ b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/MinecraftServerUtil.kt @@ -48,7 +48,7 @@ val minecraftServerObject: Any by unsafeLazy { * 获取 OBC 类 */ fun obcClass(name: String): Class<*> { - return if (MinecraftVersion.isUniversalCraftBukkit) { + return if (MinecraftVersion.isMojangMapping) { ClassHelper.getClass("org.bukkit.craftbukkit.$name") } else { ClassHelper.getClass("org.bukkit.craftbukkit.${MinecraftVersion.minecraftVersion}.$name") @@ -59,10 +59,16 @@ fun obcClass(name: String): Class<*> { * 获取 NMS 类 */ fun nmsClass(name: String): Class<*> { - return if (MinecraftVersion.isUniversal) { - ClassHelper.getClass(MinecraftVersion.spigotMapping.classMapSpigotS2F[name]?.replace('/', '.') ?: throw ClassNotFoundException(name)) + return if (MinecraftVersion.isUnobfuscated) { + ClassHelper.getClass("net.minecraft.$name") } else { - ClassHelper.getClass("net.minecraft.server.${MinecraftVersion.minecraftVersion}.$name") + // TODO: nmsClass("net.minecraft.util.SystemUtils") SystemUtils (Spigot Deobf) 与 Util (Mojang Deobf) 互转 + val className = name.split('.').last() + if (MinecraftVersion.isUniversal) { + ClassHelper.getClass(MinecraftVersion.spigotMapping.classMapSpigotS2F[className]?.replace('/', '.') ?: throw ClassNotFoundException(className)) + } else { + ClassHelper.getClass("net.minecraft.server.${MinecraftVersion.minecraftVersion}.$className") + } } } diff --git a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/MinecraftVersion.kt b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/MinecraftVersion.kt index 85a9c1608..0aa1a3b7a 100644 --- a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/MinecraftVersion.kt +++ b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/MinecraftVersion.kt @@ -38,6 +38,7 @@ object MinecraftVersion { const val V1_19 = 11 const val V1_20 = 12 const val V1_21 = 13 + const val V26_1 = 14 /** * 当前运行的版本(字符版本),例如:v1_8_R3 @@ -57,13 +58,17 @@ object MinecraftVersion { } /** - * 是否为 universal obc 版本(一般表现为 Paper 1.10.6+ 环境) + * 是否为非混淆版本或 mojang mapping 版本(一般表现为 Paper 1.20.6+ 环境) */ + val isMojangMapping: Boolean + get() = minecraftVersion == "UNKNOWN" || isUnobfuscated + + @Deprecated("Use isMojangMapping instead.", ReplaceWith("isMojangMapping")) val isUniversalCraftBukkit: Boolean - get() = minecraftVersion == "UNKNOWN" + get() = isMojangMapping /** - * 是否为CatServer + * 是否为 CatServer * 这些服务端使用自己的重混淆系统,可能与 Taboolib 的 NMS 重映射不兼容 */ val isCatServer by unsafeLazy { @@ -94,7 +99,8 @@ object MinecraftVersion { arrayOf("1.18", "1.18.1", "1.18.2"), // 10 arrayOf("1.19", "1.19.1", "1.19.2", "1.19.3", "1.19.4"), // 11 arrayOf("1.20", "1.20.1", "1.20.2", "!1.20.3", "1.20.4", "!1.20.5", "1.20.6"), // 12 (跳过 1.20.3、1.20.5) NOTICE 从 1.20.5 开始, paper 进行了破坏性修改 - arrayOf("!1.21", "1.21.1", "!1.21.2", "1.21.3", "1.21.4", "1.21.5", "!1.21.6", "!1.21.7", "1.21.8", "!1.21.9", "1.21.10", "1.21.11") // 13 (跳过 1.21、1.21.2、1.21.6、1.21.7 和 1.21.9) + arrayOf("!1.21", "1.21.1", "!1.21.2", "1.21.3", "1.21.4", "1.21.5", "!1.21.6", "!1.21.7", "1.21.8", "!1.21.9", "1.21.10", "1.21.11"), // 13 (跳过 1.21、1.21.2、1.21.6、1.21.7 和 1.21.9) + arrayOf("26.1") // 14 NOTICE 从 26.1 开始, Minecraft 不再被混淆 // @formatter:on ) @@ -104,6 +110,7 @@ object MinecraftVersion { * + 1.8.8 -> 1 08 08 -> 10808 * + 1.12.2 -> 1 12 02 -> 11202 * + 1.21.1 -> 1 21 01 -> 12101 + * + 26.1.1 -> 26 01 01 -> 260101 */ val versionId by unsafeLazy { when (major) { @@ -121,6 +128,7 @@ object MinecraftVersion { V1_19 -> 11900 V1_20 -> 12000 V1_21 -> 12100 + V26_1 -> 260100 else -> 0 } + minor } @@ -168,6 +176,13 @@ object MinecraftVersion { major >= V1_17 } + /** + * 是否为非混淆服务端 + */ + val isUnobfuscated by unsafeLazy { + major >= V26_1 + } + /** * 是否支持 BundlePacket 数据包(1.19.4+) */ @@ -183,15 +198,19 @@ object MinecraftVersion { if (Exchanges.MAPPING_SPIGOT in Exchanges) { Mapping.exchange(Exchanges.MAPPING_SPIGOT) } else { - val current = SpigotMapping.current - if (current == null) { - disablePlugin() - throw UnsupportedVersionException() + if (isUnobfuscated) { + Mapping().exchange(Exchanges.MAPPING_SPIGOT) + } else { + val current = SpigotMapping.current + if (current == null) { + disablePlugin() + throw UnsupportedVersionException() + } + Mapping.spigot( + FileInputStream("assets/${current.combined.substring(0, 2)}/${current.combined}"), + FileInputStream("assets/${current.fields.substring(0, 2)}/${current.fields}"), + ).exchange(Exchanges.MAPPING_SPIGOT) } - Mapping.spigot( - FileInputStream("assets/${current.combined.substring(0, 2)}/${current.combined}"), - FileInputStream("assets/${current.fields.substring(0, 2)}/${current.fields}"), - ).exchange(Exchanges.MAPPING_SPIGOT) } } @@ -223,7 +242,8 @@ object MinecraftVersion { if (Exchanges.MAPPING_PAPER in Exchanges) { Mapping.exchange(Exchanges.MAPPING_PAPER) } else { - Mapping.paper().exchange(Exchanges.MAPPING_PAPER) + // 如果是非混淆服务端(26.1+),该文件不存在,不读取 + (if (isUnobfuscated) Mapping() else Mapping.paper()).exchange(Exchanges.MAPPING_PAPER) } } @@ -304,8 +324,10 @@ object MinecraftVersion { } } // 在 Bukkit 平台下,注册 Reflex 重定向实现 - if (runningPlatform == Platform.BUKKIT) { - Reflex.remapper.add(if (isUniversalCraftBukkit) RemapReflexPaper() else RemapReflexSpigot()) + // 如果是非混淆服务端(26.1+),则不注册 + // TODO: 原本版本出问题 + if (runningPlatform == Platform.BUKKIT && !isUnobfuscated) { + Reflex.remapper.add(if (isMojangMapping) RemapReflexPaper() else RemapReflexSpigot()) } } } \ No newline at end of file diff --git a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/PacketImpl.kt b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/PacketImpl.kt index 810dd5df7..2481ecdae 100644 --- a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/PacketImpl.kt +++ b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/PacketImpl.kt @@ -24,8 +24,8 @@ class PacketImpl(override var source: Any) : Packet() { /** 数据包名称(强制 Spigot 译名)*/ override val nameInSpigot: String? get() { - // 如果不是 Paper 服务器则直接返回原名称 - if (!MinecraftVersion.isUniversalCraftBukkit) return name + // 如果不是 Paper 服务器,或非混淆服务端,则直接返回原名称 + if (MinecraftVersion.isUnobfuscated || !MinecraftVersion.isMojangMapping) return name // 借助映射表获取并缓存译名 if (spigotNameCache.containsKey(fullyName)) { return spigotNameCache[fullyName]!!.orNull() diff --git a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslation.kt b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslation.kt index e3bca0972..c7f02337c 100644 --- a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslation.kt +++ b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslation.kt @@ -8,6 +8,8 @@ import taboolib.common.reflect.ClassHelper import taboolib.module.nms.MinecraftVersion /** + * 插件内部的类 + * * 对于 TabooLib 内的类, * 使用 RemapTranslationTabooLib 进行 Spigot Deobf -> Mojang Obf -> Mojang Deobf 转换。 * @@ -38,7 +40,7 @@ open class RemapTranslation : Remapper() { // obc if (key.startsWith("org/bukkit/craftbukkit")) { // 若当前使用 Universal CraftBukkit 环境,则移除版本号 - return key.replace(obc1, if (MinecraftVersion.isUniversalCraftBukkit) obc3 else obc2) + return key.replace(obc1, if (MinecraftVersion.isMojangMapping) obc3 else obc2) } // 统一版本 return if (MinecraftVersion.isUniversal) { @@ -48,7 +50,7 @@ open class RemapTranslation : Remapper() { // 先转为 Spigot.FullName var spigotName = MinecraftVersion.spigotMapping.classMapSpigotS2F[key.substringAfterLast('/')] ?: return key // 如果为 Universal CraftBukkit 环境, 则应进一步转译为 Mojang.FullName - spigotName = if (MinecraftVersion.isUniversalCraftBukkit) MinecraftVersion.paperMapping.classMapSpigotToMojang[spigotName] ?: spigotName else spigotName + spigotName = if (MinecraftVersion.isMojangMapping) MinecraftVersion.paperMapping.classMapSpigotToMojang[spigotName] ?: spigotName else spigotName spigotName.replace('.', '/') } else { key diff --git a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslationLegacy.kt b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslationLegacy.kt index 26e2ceddd..172db6df6 100644 --- a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslationLegacy.kt +++ b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslationLegacy.kt @@ -6,6 +6,8 @@ import taboolib.module.nms.MinecraftVersion import java.util.concurrent.ConcurrentHashMap /** + * 旧版本转译器 + * * TabooLib * taboolib.module.nms.remap.MinecraftRemapper * diff --git a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslationTabooLib.kt b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslationTabooLib.kt index 242472171..fa4155ba1 100644 --- a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslationTabooLib.kt +++ b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslationTabooLib.kt @@ -4,6 +4,8 @@ import taboolib.module.nms.MinecraftVersion import taboolib.module.nms.remap.RemapHelper.checkParameterType /** + * TabooLib 内部类转译器 + * * TabooLib * taboolib.module.nms.remap.RemapTranslationTabooLib * diff --git a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslationUnobfsucated.kt b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslationUnobfsucated.kt new file mode 100644 index 000000000..24968da36 --- /dev/null +++ b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslationUnobfsucated.kt @@ -0,0 +1,16 @@ +package taboolib.module.nms.remap + +/** + * TabooLib + * taboolib.module.nms.remap.RemapTranslationUnobfsucated + * + * @author mical + * @since 2026/3/31 22:53 + */ +class RemapTranslationUnobfuscated : RemapTranslation() { + + override fun map(internalName: String): String { + // 非混淆版本服务端不进行任何转译 + return internalName + } +} \ No newline at end of file diff --git a/module/bukkit-nms/src/main/resources/mapping.json b/module/bukkit-nms/src/main/resources/mapping.json index 4ebfb06a7..2dc16f3b0 100644 --- a/module/bukkit-nms/src/main/resources/mapping.json +++ b/module/bukkit-nms/src/main/resources/mapping.json @@ -8,6 +8,10 @@ "fields": { "file": "bukkit-e3c5450d-fields.csrg", "hash": "44caa1f63bd20d807bd92d13d2fe291b482c0771" + }, + "reobf": { + "file": "11700.reobf.tiny", + "hash": "80b5fa1cac1dd62820fa3ade2ae7045038b1f82c" } }, { @@ -19,6 +23,10 @@ "fields": { "file": "bukkit-00fabbe5-fields.csrg", "hash": "6e515ad1b4cd49e93e26380e4deca8b876a517a7" + }, + "reobf": { + "file": "11701.reobf.tiny", + "hash": "b95a68209c4cbddaefd662ad5730b02e4f0ce5c3" } }, { @@ -30,6 +38,10 @@ "fields": { "file": "bukkit-8e9479b6-members.csrg", "hash": "805efea073022d30cab12cd511513751af80789c" + }, + "reobf": { + "file": "11800.reobf.tiny", + "hash": "2e76b04bf6bc382ed7529eded7b6f1c8ac1ddae8" } }, { @@ -41,6 +53,10 @@ "fields": { "file": "bukkit-e0c6d16a-members.csrg", "hash": "6d0d8df7538d9e0006ff2f9c01a4125d699e857b" + }, + "reobf": { + "file": "11801.reobf.tiny", + "hash": "f7d85d7a8f4e03d8adf29a42e68bc897f7cb04a0" } }, { @@ -52,6 +68,10 @@ "fields": { "file": "bukkit-732abad1-members.csrg", "hash": "e51e094f2888a44d12d0f3d42305afc2675c6748" + }, + "reobf": { + "file": "11802.reobf.tiny", + "hash": "fa838eeac1d40faa87d31bec391e349c6ed78bf8" } }, { @@ -63,6 +83,10 @@ "fields": { "file": "bukkit-2f7944eb-members.csrg", "hash": "213f64b57f20f414309125b1f4eb7cbbcf159508" + }, + "reobf": { + "file": "11900.reobf.tiny", + "hash": "38b6307ed0fa1c289971d7bf2726566e53e8f51f" } }, { @@ -74,6 +98,10 @@ "fields": { "file": "bukkit-550f788f-members.csrg", "hash": "709b9250af770537cc8b23f734ac31dbeee6dc6e" + }, + "reobf": { + "file": "11901.reobf.tiny", + "hash": "22376c7d4d93f063d8753c00fca44a73e8599351" } }, { @@ -85,6 +113,10 @@ "fields": { "file": "bukkit-8b4db36a-members.csrg", "hash": "069e5d3e081c303231ea453ed1e56ac149917c9e" + }, + "reobf": { + "file": "11902.reobf.tiny", + "hash": "5a09343ad61557049ddc192dfa426b20c792be6f" } }, { @@ -96,6 +128,10 @@ "fields": { "file": "bukkit-c69e3af0-members.csrg", "hash": "65539f95551a967e096f916896c031c5969d2e34" + }, + "reobf": { + "file": "11903.reobf.tiny", + "hash": "57c08649735e3d9ebc986851f016bd9a2d33362c" } }, { @@ -107,6 +143,10 @@ "fields": { "file": "bukkit-0207e96c-members.csrg", "hash": "a357798e3ce7e23f857e833914b765fca3b8ca4c" + }, + "reobf": { + "file": "11904.reobf.tiny", + "hash": "2633fb70464fc6b23d46c0095b74ceab7ba07911" } }, { @@ -118,6 +158,10 @@ "fields": { "file": "bukkit-c571a01f-members.csrg", "hash": "de0d266adbbff4f7ffe4dd44ed0e36f9205b31b1" + }, + "reobf": { + "file": "12000.reobf.tiny", + "hash": "c44319650dc92d5c2fd36f3331c9205e02355391" } }, { @@ -129,6 +173,10 @@ "fields": { "file": "bukkit-8788cf22-members.csrg", "hash": "96e3ddb7a5d6378a0f7dede3f678d15994db8fc9" + }, + "reobf": { + "file": "12001.reobf.tiny", + "hash": "0105dc4c2a1f219b02ff6ec90a149621581287a5" } }, { @@ -140,6 +188,10 @@ "fields": { "file": "bukkit-afa394e9-members.csrg", "hash": "96203601dcb93b7b85021f58d8e4b99ad0b4e223" + }, + "reobf": { + "file": "12002.reobf.tiny", + "hash": "663910aafdbbe407512a4f0c759659042baddc34" } }, { @@ -151,6 +203,10 @@ "fields": { "file": "bukkit-c13d4d77-members.csrg", "hash": "5f5890b12c92f10af6d2770c0dd599ae21f7890f" + }, + "reobf": { + "file": "12004.reobf.tiny", + "hash": "f608634d733bba64bea31d3249d35c838c307702" } }, { @@ -162,6 +218,10 @@ "fields": { "file": "bukkit-4b466d94-members.csrg", "hash": "c02598ec39d18e87cc2d391a71bc53a72101d425" + }, + "reobf": { + "file": "12005.reobf.tiny", + "hash": "de076f5aebad727d90c5118f574ba2b901a6dec1" } }, { @@ -173,6 +233,10 @@ "fields": { "file": "bukkit-3600f5e0-members.csrg", "hash": "d97a3e4269981fe29833739af2398505ed8bba63" + }, + "reobf": { + "file": "12006.reobf.tiny", + "hash": "f5293e594cc09137461de6d3e696229c9a40a3fe" } }, { @@ -184,6 +248,10 @@ "fields": { "file": "bukkit-3e3bd0ca-members.csrg", "hash": "e3d4992c72783da557d3ff230d0b288e9886c0d3" + }, + "reobf": { + "file": "12100.reobf.tiny", + "hash": "16c5b040a475a3f3c97080afde2c299044cee68e" } }, { @@ -195,6 +263,10 @@ "fields": { "file": "bukkit-1eaee539-members.csrg", "hash": "a82293e05fadc0661c1ad7788e0850956ebfdbbd" + }, + "reobf": { + "file": "12101.reobf.tiny", + "hash": "ca93dbdb5bef3671314d78495ff3d26d29ae348f" } }, { @@ -206,6 +278,10 @@ "fields": { "file": "bukkit-7331f017-members.csrg", "hash": "5aa3df18ea93525036a437f0b848dba6496eddac" + }, + "reobf": { + "file": "12103.reobf.tiny", + "hash": "1e49c0a5f55dfb7d076e72c784f54f9015b14a7d" } }, { @@ -217,6 +293,10 @@ "fields": { "file": "bukkit-a0531ed8-members.csrg", "hash": "9d1ccd2b3aea2581688de1f36242e27af83d3f4b" + }, + "reobf": { + "file": "12104.reobf.tiny", + "hash": "103d74ccb06f5c9bff6c4c4cc655a71bba4b567b" } }, { @@ -228,6 +308,10 @@ "fields": { "file": "bukkit-956575d9-members.csrg", "hash": "2d4dbd77eafcd301418cc442cf6f93f60ebd2484" + }, + "reobf": { + "file": "12105.reobf.tiny", + "hash": "c7c58e80a0611cdef5c8ffec9cdf35a7de94b966" } }, { @@ -239,6 +323,10 @@ "fields": { "file": "bukkit-380678f7-members.csrg", "hash": "ca84c12a6533f52754813e8ef02f20449009402a" + }, + "reobf": { + "file": "12106.reobf.tiny", + "hash": "a72f3508544c37c5b85b7f5dde27799599963f3d" } }, { @@ -250,6 +338,10 @@ "fields": { "file": "bukkit-541d8131-members.csrg", "hash": "0555763ae246fa29d22b11096e9021f850136a3c" + }, + "reobf": { + "file": "12107.reobf.tiny", + "hash": "f24aad20858f6b66ee8114fc5e1e4d3d5dd3b143" } }, { @@ -261,6 +353,10 @@ "fields": { "file": "bukkit-7d8f8942-members.csrg", "hash": "0555763ae246fa29d22b11096e9021f850136a3c" + }, + "reobf": { + "file": "12108.reobf.tiny", + "hash": "70410649bd02036f7b4b8a73017c4950fcab8020" } }, { @@ -272,6 +368,10 @@ "fields": { "file": "bukkit-a2426d28-members.csrg", "hash": "862fd6e1c27ad26e616a8717b8f60e3c25aedd4a" + }, + "reobf": { + "file": "12109.reobf.tiny", + "hash": "bd89f149377389b0842ae7a7467360a4a0a28b63" } }, { @@ -283,6 +383,10 @@ "fields": { "file": "bukkit-75645fa6-members.csrg", "hash": "be0c1d15fd28220c024c4599025304773b4af45b" + }, + "reobf": { + "file": "12110.reobf.tiny", + "hash": "d0ecce41b9aea544618fa4d622976332a18df4ee" } }, { @@ -294,6 +398,10 @@ "fields": { "file": "bukkit-55c2bea3-members.csrg", "hash": "ecb071663a3168ba10a8916aedf0f3fd48315de1" + }, + "reobf": { + "file": "12110.reobf.tiny", + "hash": "9ce4f62c7d301b4b73df9dd69615f9fb789e28ac" } } ] \ No newline at end of file From 77911440efbe2a6ddd3a35bd40b6b3c53c60a7dc Mon Sep 17 00:00:00 2001 From: Micalhl Date: Wed, 1 Apr 2026 08:36:42 +0800 Subject: [PATCH 02/13] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit-nms/src/main/kotlin/taboolib/module/nms/Mapping.kt | 2 +- module/bukkit-nms/src/main/resources/mapping.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/Mapping.kt b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/Mapping.kt index ea276a7a9..e1cbcfdd7 100644 --- a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/Mapping.kt +++ b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/Mapping.kt @@ -161,7 +161,7 @@ class Mapping( val reobf = obj["reobf"].asJsonObject reobfFile = reobf["file"].asString reobfHash = reobf["hash"].asString - RuntimeEnv.ENV_ASSETS.loadAssets("", reobfHash, "${OSS_URL}$reobfFile", false) + RuntimeEnv.ENV_ASSETS.loadAssets(reobfHash.substring(0, 2) + File.separator + reobfFile, reobfHash, "${OSS_URL}$reobfFile", false) } } inputStream = FileInputStream("assets/${reobfHash.substring(0, 2)}/$reobfFile") diff --git a/module/bukkit-nms/src/main/resources/mapping.json b/module/bukkit-nms/src/main/resources/mapping.json index 2dc16f3b0..1803e3be4 100644 --- a/module/bukkit-nms/src/main/resources/mapping.json +++ b/module/bukkit-nms/src/main/resources/mapping.json @@ -400,7 +400,7 @@ "hash": "ecb071663a3168ba10a8916aedf0f3fd48315de1" }, "reobf": { - "file": "12110.reobf.tiny", + "file": "12111.reobf.tiny", "hash": "9ce4f62c7d301b4b73df9dd69615f9fb789e28ac" } } From 3f657a6106aaca9f5007bace6095e9ff73653d3c Mon Sep 17 00:00:00 2001 From: Micalhl Date: Wed, 1 Apr 2026 09:12:16 +0800 Subject: [PATCH 03/13] =?UTF-8?q?=E5=B0=86=20XSeries=20=E5=BC=BA=E5=88=B6?= =?UTF-8?q?=E7=BC=96=E8=AF=91=E5=88=B0=2026.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../taboolib/platform/util/ItemBuilder.kt | 2 +- .../java/taboolib/library/xseries/XBlock.java | 6 +- .../taboolib/library/xseries/XItemStack.java | 47 ++++----- .../taboolib/library/xseries/XMaterial.java | 98 ++++++++++++------- .../java/taboolib/library/xseries/XSound.java | 66 +++++++++++++ .../java/taboolib/library/xseries/XTag.java | 4 +- .../library/xseries/particles/XParticle.java | 3 + 7 files changed, 154 insertions(+), 72 deletions(-) diff --git a/module/bukkit/bukkit-util/src/main/kotlin/taboolib/platform/util/ItemBuilder.kt b/module/bukkit/bukkit-util/src/main/kotlin/taboolib/platform/util/ItemBuilder.kt index ddbb77872..68c5a195c 100644 --- a/module/bukkit/bukkit-util/src/main/kotlin/taboolib/platform/util/ItemBuilder.kt +++ b/module/bukkit/bukkit-util/src/main/kotlin/taboolib/platform/util/ItemBuilder.kt @@ -393,7 +393,7 @@ open class ItemBuilder { } constructor(material: XMaterial) : this(material.parseMaterial() ?: Material.STONE) { - if (!XMaterial.supports(13)) { + if (!XMaterial.supports(1, 13)) { this.damage = material.data.toInt() } } diff --git a/platform/platform-bukkit-impl/src/main/java/taboolib/library/xseries/XBlock.java b/platform/platform-bukkit-impl/src/main/java/taboolib/library/xseries/XBlock.java index 105a07406..0eb86671e 100644 --- a/platform/platform-bukkit-impl/src/main/java/taboolib/library/xseries/XBlock.java +++ b/platform/platform-bukkit-impl/src/main/java/taboolib/library/xseries/XBlock.java @@ -79,7 +79,7 @@ public final class XBlock { XMaterial.MAGMA_BLOCK, XMaterial.LAVA, XMaterial.CAMPFIRE, XMaterial.FIRE, XMaterial.SOUL_FIRE )); public static final byte CAKE_SLICES = 6; - private static final boolean ISFLAT = XMaterial.supports(13); + private static final boolean ISFLAT = XMaterial.supports(1, 13); private static final Map ITEM_TO_BLOCK = new EnumMap<>(XMaterial.class); static { @@ -407,7 +407,7 @@ public static XMaterial getType(Block block) { break; case BED: case BED_BLOCK: - if (!XMaterial.supports(12)) return XMaterial.RED_BED; + if (!XMaterial.supports(1, 12)) return XMaterial.RED_BED; // This doesn't work, the returned data value is incorrect. // data = (byte) (data & 0x7); // Mask to ignore head/foot, facing, occupied bits @@ -985,7 +985,7 @@ public static boolean isSimilar(Block block, XMaterial material) { Material mat = block.getType(); - if (material.name().endsWith("_BED") && !XMaterial.supports(12)) + if (material.name().endsWith("_BED") && !XMaterial.supports(1, 12)) return mat == LegacyBlockMaterial.BED_BLOCK.material || mat == LegacyBlockMaterial.BED.material; switch (material) { diff --git a/platform/platform-bukkit-impl/src/main/java/taboolib/library/xseries/XItemStack.java b/platform/platform-bukkit-impl/src/main/java/taboolib/library/xseries/XItemStack.java index 4d4166681..96ac56b03 100644 --- a/platform/platform-bukkit-impl/src/main/java/taboolib/library/xseries/XItemStack.java +++ b/platform/platform-bukkit-impl/src/main/java/taboolib/library/xseries/XItemStack.java @@ -535,7 +535,7 @@ private static Object singleOrList(List list) { @SuppressWarnings("deprecation") private void legacySpawnEgg() { - if (!supports(11)) { + if (!supports(1, 11)) { MaterialData data = item.getData(); if (data instanceof SpawnEgg) { SpawnEgg spawnEgg = (SpawnEgg) data; @@ -605,7 +605,7 @@ private void handleMapMeta(MapMeta map) { ConfigurationSection mapSection = config.createSection("map"); mapSection.set("scaling", map.isScaling()); - if (supports(11)) { + if (supports(1, 11)) { if (map.hasLocationName()) mapSection.set("location", map.getLocationName()); if (map.hasColor()) { Color color = map.getColor(); @@ -613,7 +613,7 @@ private void handleMapMeta(MapMeta map) { } } - if (supports(14)) { + if (supports(1, 14)) { if (map.hasMapView()) { MapView mapView = map.getMapView(); ConfigurationSection view = mapSection.createSection("view"); @@ -635,7 +635,7 @@ private void handleBookMeta(BookMeta book) { if (book.getTitle() != null) bookInfo.set("title", book.getTitle()); if (book.getAuthor() != null) bookInfo.set("author", book.getAuthor()); - if (supports(9)) { + if (supports(1, 9)) { BookMeta.Generation generation = book.getGeneration(); if (generation != null) { bookInfo.set("generation", book.getGeneration().toString()); @@ -680,7 +680,7 @@ private void handleFireworkMeta(FireworkMeta firework) { @SuppressWarnings({"deprecation", "StatementWithEmptyBody"}) private void handlePotionMeta(PotionMeta meta) { - if (supports(9)) { + if (supports(1, 9)) { List customEffects = meta.getCustomEffects(); List effects = new ArrayList<>(customEffects.size()); for (PotionEffect effect : customEffects) { @@ -740,7 +740,7 @@ private void handleEnchantmentStorageMeta(EnchantmentStorageMeta meta) { private void handleBlockStateMeta(BlockStateMeta meta) { BlockState state = safeBlockState(meta); - if (supports(11) && state instanceof ShulkerBox) { + if (supports(1, 11) && state instanceof ShulkerBox) { ShulkerBox box = (ShulkerBox) state; ConfigurationSection shulker = config.createSection("contents"); int i = 0; @@ -756,7 +756,7 @@ private void handleBlockStateMeta(BlockStateMeta meta) { @SuppressWarnings("deprecation") private void handleAttributes(ItemMeta meta) { - if (supports(13)) { + if (supports(1, 13)) { Multimap attributes = meta.getAttributeModifiers(); if (attributes != null) { for (Map.Entry attribute : attributes.entries()) { @@ -791,7 +791,7 @@ private void handleEnchants() { @SuppressWarnings("deprecation") private void handleDurability(ItemMeta meta) { - if (supports(13)) { + if (supports(1, 13)) { if (meta instanceof Damageable) { Damageable damageable = (Damageable) meta; if (damageable.hasDamage()) config.set("damage", damageable.getDamage()); @@ -836,7 +836,7 @@ public ItemStack parse() { private void attributes() { // Atrributes - https://minecraft.wiki/w/Attribute - if (!supports(13)) return; + if (!supports(1, 13)) return; ConfigurationSection attributes = config.getConfigurationSection("attributes"); if (attributes != null) { @@ -867,7 +867,7 @@ private void attributes() { } } - if (!meta.getItemFlags().isEmpty() && supported(1206)) { + if (!meta.getItemFlags().isEmpty() && supports(1, 20, 6)) { // Item flags will not work without an attribute modifier being present. if (!meta.hasAttributeModifiers()) { meta.addAttributeModifier( @@ -885,7 +885,7 @@ private void attributes() { @SuppressWarnings("deprecation") private void legacySpawnEgg() { - if (!supports(11)) { + if (!supports(1, 11)) { MaterialData data = item.getData(); if (data instanceof SpawnEgg) { String creatureName = config.getString("creature"); @@ -1160,14 +1160,14 @@ private void handleMapMeta(MapMeta map) { if (mapSection == null) return; map.setScaling(mapSection.getBoolean("scaling")); - if (supports(11)) { + if (supports(1, 11)) { if (mapSection.isSet("location")) map.setLocationName(mapSection.getString("location")); if (mapSection.isSet("color")) { parseColor(mapSection.getString("color")).ifPresent(map::setColor); } } - if (supports(14)) { + if (supports(1, 14)) { ConfigurationSection view = mapSection.getConfigurationSection("view"); if (view != null) { World world = Bukkit.getWorld(view.getString("world")); @@ -1199,7 +1199,7 @@ private void handleBookMeta(BookMeta book) { book.setAuthor(bookInfo.getString("author")); book.setPages(bookInfo.getStringList("pages")); - if (supports(9)) { + if (supports(1, 9)) { String generationValue = bookInfo.getString("generation"); if (generationValue != null) { BookMeta.Generation generation = Enums.getIfPresent(BookMeta.Generation.class, generationValue).orNull(); @@ -1259,7 +1259,7 @@ private void handleBlockStateMeta(BlockStateMeta bsm) { spawner.update(true); bsm.setBlockState(spawner); } - } else if (supports(11) && state instanceof ShulkerBox) { + } else if (supports(1, 11) && state instanceof ShulkerBox) { ConfigurationSection shulkerSection = config.getConfigurationSection("contents"); if (shulkerSection != null) { ShulkerBox box = (ShulkerBox) state; @@ -1274,7 +1274,7 @@ private void handleBlockStateMeta(BlockStateMeta bsm) { } else if (state instanceof Banner) { Banner banner = (Banner) state; ConfigurationSection patterns = config.getConfigurationSection("patterns"); - if (!supports(14)) { + if (!supports(1, 14)) { // https://hub.spigotmc.org/stash/projects/SPIGOT/repos/craftbukkit/diff/src/main/java/org/bukkit/craftbukkit/block/CraftBanner.java?until=b3dc236663a55450c69356e660c0c84f0abbb3aa banner.setBaseColor(DyeColor.WHITE); } @@ -1296,7 +1296,7 @@ private void handleBlockStateMeta(BlockStateMeta bsm) { @SuppressWarnings("StatementWithEmptyBody") private void handlePotionMeta(ItemMeta meta) { - if (supports(9)) { + if (supports(1, 9)) { PotionMeta potion = (PotionMeta) meta; for (String effects : config.getStringList("effects")) { @@ -1376,7 +1376,7 @@ private void handleSkullMeta(SkullMeta meta) { @SuppressWarnings("deprecation") private void handleDurability() { - if (supports(13)) { + if (supports(1, 13)) { if (meta instanceof Damageable) { int damage = config.getInt("damage"); if (damage > 0) ((Damageable) meta).setDamage(damage); @@ -1938,15 +1938,4 @@ public XMaterial getMaterial() { public enum Reason {UNSUPPORTED, NOT_DISPLAYABLE} } - - private static final String version = Bukkit.getServer().getVersion().split("MC:")[1]; - private static final String runningVersionId = version.substring(0, version.length() - 1).split(" ")[1].replace(".", "").trim(); - - public static boolean supported(final int versionId) { - try { - return Integer.parseInt(runningVersionId) >= versionId; - } catch (NumberFormatException e) { - return false; - } - } } \ No newline at end of file diff --git a/platform/platform-bukkit-impl/src/main/java/taboolib/library/xseries/XMaterial.java b/platform/platform-bukkit-impl/src/main/java/taboolib/library/xseries/XMaterial.java index 19891e123..84c10ee28 100644 --- a/platform/platform-bukkit-impl/src/main/java/taboolib/library/xseries/XMaterial.java +++ b/platform/platform-bukkit-impl/src/main/java/taboolib/library/xseries/XMaterial.java @@ -200,7 +200,7 @@ public enum XMaterial implements XBase { /** * Version 1.12+ interprets "BED" as BLACK_BED due to enum alphabetic ordering. */ - BLACK_BED(supports(12) ? 15 : 0, "BED_BLOCK", "BED"), + BLACK_BED(supports(1, 12) ? 15 : 0, "BED_BLOCK", "BED"), BLACK_BUNDLE, BLACK_CANDLE, BLACK_CANDLE_CAKE, @@ -223,7 +223,7 @@ public enum XMaterial implements XBase { BLAZE_ROD, BLAZE_SPAWN_EGG(61, "MONSTER_EGG"), BLUE_BANNER(4, "STANDING_BANNER", "BANNER"), - BLUE_BED(supports(12) ? 11 : 0, "BED_BLOCK", "BED"), + BLUE_BED(supports(1, 12) ? 11 : 0, "BED_BLOCK", "BED"), BLUE_BUNDLE, BLUE_CANDLE, BLUE_CANDLE_CAKE, @@ -269,7 +269,7 @@ public enum XMaterial implements XBase { BRICK_STAIRS, BRICK_WALL, BROWN_BANNER(3, "STANDING_BANNER", "BANNER"), - BROWN_BED(supports(12) ? 12 : 0, "BED_BLOCK", "BED"), + BROWN_BED(supports(1, 12) ? 12 : 0, "BED_BLOCK", "BED"), BROWN_BUNDLE, BROWN_CANDLE, BROWN_CANDLE_CAKE, @@ -467,7 +467,7 @@ public enum XMaterial implements XBase { @XInfo(since = "1.14") CUT_SANDSTONE, @XInfo(since = "1.14") CUT_SANDSTONE_SLAB, CYAN_BANNER(6, "STANDING_BANNER", "BANNER"), - CYAN_BED(supports(12) ? 9 : 0, "BED_BLOCK", "BED"), + CYAN_BED(supports(1, 12) ? 9 : 0, "BED_BLOCK", "BED"), CYAN_BUNDLE, CYAN_CANDLE, CYAN_CANDLE_CAKE, @@ -712,7 +712,7 @@ public enum XMaterial implements XBase { GRASS_BLOCK("GRASS"), GRAVEL, GRAY_BANNER(8, "STANDING_BANNER", "BANNER"), - GRAY_BED(supports(12) ? 7 : 0, "BED_BLOCK", "BED"), + GRAY_BED(supports(1, 12) ? 7 : 0, "BED_BLOCK", "BED"), GRAY_BUNDLE, GRAY_CANDLE, GRAY_CANDLE_CAKE, @@ -730,7 +730,7 @@ public enum XMaterial implements XBase { GRAY_WALL_BANNER(8, "WALL_BANNER"), GRAY_WOOL(7, "WOOL"), GREEN_BANNER(2, "STANDING_BANNER", "BANNER"), - GREEN_BED(supports(12) ? 13 : 0, "BED_BLOCK", "BED"), + GREEN_BED(supports(1, 12) ? 13 : 0, "BED_BLOCK", "BED"), GREEN_BUNDLE, GREEN_CANDLE, GREEN_CANDLE_CAKE, @@ -863,7 +863,7 @@ public enum XMaterial implements XBase { LIGHT, LIGHTNING_ROD, LIGHT_BLUE_BANNER(12, "STANDING_BANNER", "BANNER"), - LIGHT_BLUE_BED(supports(12) ? 3 : 0, "BED_BLOCK", "BED"), + LIGHT_BLUE_BED(supports(1, 12) ? 3 : 0, "BED_BLOCK", "BED"), LIGHT_BLUE_BUNDLE, LIGHT_BLUE_CANDLE, LIGHT_BLUE_CANDLE_CAKE, @@ -881,7 +881,7 @@ public enum XMaterial implements XBase { LIGHT_BLUE_WALL_BANNER(12, "WALL_BANNER", "STANDING_BANNER", "BANNER"), LIGHT_BLUE_WOOL(3, "WOOL"), LIGHT_GRAY_BANNER(7, "STANDING_BANNER", "BANNER"), - LIGHT_GRAY_BED(supports(12) ? 8 : 0, "BED_BLOCK", "BED"), + LIGHT_GRAY_BED(supports(1, 12) ? 8 : 0, "BED_BLOCK", "BED"), LIGHT_GRAY_BUNDLE, LIGHT_GRAY_CANDLE, LIGHT_GRAY_CANDLE_CAKE, @@ -907,7 +907,7 @@ public enum XMaterial implements XBase { LILY_OF_THE_VALLEY, LILY_PAD("WATER_LILY"), LIME_BANNER(10, "STANDING_BANNER", "BANNER"), - LIME_BED(supports(12) ? 5 : 0, "BED_BLOCK", "BED"), + LIME_BED(supports(1, 12) ? 5 : 0, "BED_BLOCK", "BED"), LIME_BUNDLE, LIME_CANDLE, LIME_CANDLE_CAKE, @@ -930,7 +930,7 @@ public enum XMaterial implements XBase { LOOM, MACE, MAGENTA_BANNER(13, "STANDING_BANNER", "BANNER"), - MAGENTA_BED(supports(12) ? 2 : 0, "BED_BLOCK", "BED"), + MAGENTA_BED(supports(1, 12) ? 2 : 0, "BED_BLOCK", "BED"), MAGENTA_BUNDLE, MAGENTA_CANDLE, MAGENTA_CANDLE_CAKE, @@ -1096,7 +1096,7 @@ public enum XMaterial implements XBase { OMINOUS_TRIAL_KEY, OPEN_EYEBLOSSOM, ORANGE_BANNER(14, "STANDING_BANNER", "BANNER"), - ORANGE_BED(supports(12) ? 1 : 0, "BED_BLOCK", "BED"), + ORANGE_BED(supports(1, 12) ? 1 : 0, "BED_BLOCK", "BED"), ORANGE_BUNDLE, ORANGE_CANDLE, ORANGE_CANDLE_CAKE, @@ -1165,7 +1165,7 @@ public enum XMaterial implements XBase { PIG_SPAWN_EGG(90, "MONSTER_EGG"), PILLAGER_SPAWN_EGG, PINK_BANNER(9, "STANDING_BANNER", "BANNER"), - PINK_BED(supports(12) ? 6 : 0, "BED_BLOCK", "BED"), + PINK_BED(supports(1, 12) ? 6 : 0, "BED_BLOCK", "BED"), PINK_BUNDLE, PINK_CANDLE, PINK_CANDLE_CAKE, @@ -1297,7 +1297,7 @@ public enum XMaterial implements XBase { PUMPKIN_SEEDS, PUMPKIN_STEM, PURPLE_BANNER(5, "STANDING_BANNER", "BANNER"), - PURPLE_BED(supports(12) ? 10 : 0, "BED_BLOCK", "BED"), + PURPLE_BED(supports(1, 12) ? 10 : 0, "BED_BLOCK", "BED"), PURPLE_BUNDLE, PURPLE_CANDLE, PURPLE_CANDLE_CAKE, @@ -1362,7 +1362,7 @@ public enum XMaterial implements XBase { /** * Data value 14 or 0 */ - RED_BED(supports(12) ? 14 : 0, "BED_BLOCK", "BED"), + RED_BED(supports(1, 12) ? 14 : 0, "BED_BLOCK", "BED"), RED_BUNDLE, RED_CANDLE, RED_CANDLE_CAKE, @@ -1768,7 +1768,7 @@ public enum XMaterial implements XBase { WRITABLE_BOOK("BOOK_AND_QUILL"), WRITTEN_BOOK, YELLOW_BANNER(11, "STANDING_BANNER", "BANNER"), - YELLOW_BED(supports(12) ? 4 : 0, "BED_BLOCK", "BED"), + YELLOW_BED(supports(1, 12) ? 4 : 0, "BED_BLOCK", "BED"), YELLOW_BUNDLE, YELLOW_CANDLE, YELLOW_CANDLE_CAKE, @@ -1894,6 +1894,9 @@ public enum XMaterial implements XBase { @XInfo(since = "1.21.11") NETHERITE_NAUTILUS_ARMOR, @XInfo(since = "1.21.11") COPPER_NAUTILUS_ARMOR, + @XInfo(since = "26.1") GOLDEN_DANDELION, + @XInfo(since = "26.1") POTTED_GOLDEN_DANDELION, + ; @@ -2030,14 +2033,33 @@ private static Optional getIfPresent(@NotNull String name) { } /** - * The current version of the server. + * The current version major of the server. + * + * @return the current server version minor number. + * @see #supports(int, int) + * @since 2.0.0 + */ + public static int getVersionMajor() { + return Data.VERSION_MAJOR; + } + + /** + * The current version minor of the server. * * @return the current server version minor number. - * @see #supports(int) + * @see #supports(int, int) * @since 2.0.0 */ + public static int getVersionMinor() { + return Data.VERSION_MINOR; + } + + public static int getVersionPatch() { + return Data.VERSION_PATCH; + } + public static int getVersion() { - return Data.VERSION; + return getVersionMinor(); } /** @@ -2152,7 +2174,7 @@ public static XMaterial matchXMaterial(@NotNull ItemStack item) { byte data = (byte) (Data.ISFLAT || material.equals("MAP") || item.getType().getMaxDurability() > 0 ? 0 : item.getDurability()); // Versions 1.9-1.12 didn't really use the items data value. - if (Data.SUPPORTS_SpawnEggMeta && !supports(13) && item.hasItemMeta() && material.equals("MONSTER_EGG")) { + if (Data.SUPPORTS_SpawnEggMeta && !supports(1, 13) && item.hasItemMeta() && material.equals("MONSTER_EGG")) { ItemMeta meta = item.getItemMeta(); if (meta instanceof SpawnEggMeta) { SpawnEggMeta egg = (SpawnEggMeta) meta; @@ -2171,7 +2193,7 @@ public static XMaterial matchXMaterial(@NotNull ItemStack item) { // Potions used the items data value to store // information about the type of potion in 1.8 - if (!supports(9) && material.equals("POTION")) { + if (!supports(1, 9) && material.equals("POTION")) { // Source: v1.8.8 org.bukkit.potion.Potion.fromDamage(int damage) int damage = item.getDurability(); return ((damage & 16384) > 0) ? SPLASH_POTION : POTION; @@ -2181,7 +2203,7 @@ public static XMaterial matchXMaterial(@NotNull ItemStack item) { // Currently, these are the only materials with a non-zero data value // that has been renamed after the flattening update. // If this happens to more materials in the future, I might have to change the system. - if (supports(13) && !supports(14)) { + if (supports(1, 13) && !supports(1, 14)) { // https://hub.spigotmc.org/stash/projects/SPIGOT/repos/bukkit/diff/src/main/java/org/bukkit/Material.java?until=67d908a9830c71267ee740f5bddd728ce9c64cc7 switch (material) { case "CACTUS_GREEN": @@ -2295,17 +2317,13 @@ protected static String format(@NotNull String name) { return new String(chs, 0, count); } - /** - * This is an internal API. - * Checks if the specified version is the same version or higher than the current server version. - * - * @param version the major version to be checked. "1." is ignored. E.g. 1.12 = 12 | 1.9 = 9 - * @return true of the version is equal or higher than the current version. - * @since 2.0.0 - */ @ApiStatus.Internal - public static boolean supports(int version) { - return Data.VERSION >= version; + public static boolean supports(int major, int minor) { + return Data.VERSION_MAJOR > major || (Data.VERSION_MAJOR == major && Data.VERSION_MINOR >= minor); + } + + public static boolean supports(int major, int minor, int patch) { + return Data.VERSION_MAJOR > major || (Data.VERSION_MAJOR == major && Data.VERSION_MINOR > minor) || (Data.VERSION_MAJOR == major && Data.VERSION_MINOR == minor && Data.VERSION_PATCH >= patch); } public String[] getLegacy() { @@ -2429,7 +2447,7 @@ public ItemStack parseItem() { if (!Data.ISFLAT && this == SPLASH_POTION) { base.setDurability((short) 16384); // Hard-coded as 'data' is only a byte. } - if (supports(9) && !supports(13) && base.hasItemMeta() && this.name().endsWith("_SPAWN_EGG")) { + if (supports(1, 9) && !supports(1, 13) && base.hasItemMeta() && this.name().endsWith("_SPAWN_EGG")) { ItemMeta meta = base.getItemMeta(); if (meta instanceof SpawnEggMeta) { SpawnEggMeta egg = (SpawnEggMeta) meta; @@ -2554,7 +2572,7 @@ private static final class Data { * * @since 1.0.0 */ - private static final int VERSION; + private static int VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH; private static final Map BUKKIT_NAME_MAPPINGS; static { // This needs to be right below VERSION because of initialization order. @@ -2562,12 +2580,18 @@ private static final class Data { // noinspection ConstantValue if (Bukkit.getServer() == null) { System.err.println("Bukkit.getServer() in null. This should not happen when running a plugin normally"); - VERSION = 21; + VERSION_MAJOR = 1; + VERSION_MINOR = 21; + VERSION_PATCH = 0; } else { String version = Bukkit.getVersion(); - Matcher matcher = Pattern.compile("MC: \\d\\.(\\d+)").matcher(version); + Matcher matcher = Pattern.compile("MC: (\\d+)\\.(\\d+)(?:\\.(\\d+))?").matcher(version); - if (matcher.find()) VERSION = Integer.parseInt(matcher.group(1)); + if (matcher.find()) { + VERSION_MAJOR = Integer.parseInt(matcher.group(1)); + VERSION_MINOR = Integer.parseInt(matcher.group(2)); + VERSION_PATCH = Integer.parseInt(Optional.ofNullable(matcher.group(3)).orElse("0")); + } else throw new IllegalArgumentException("Failed to parse server version from: " + version); } } @@ -2613,7 +2637,7 @@ private static Material getExactMaterial(String name) { * * @since 3.0.0 */ - private static final boolean ISFLAT = supports(13); + private static final boolean ISFLAT = supports(1, 13); /** * Added around Minecraft v1.11 diff --git a/platform/platform-bukkit-impl/src/main/java/taboolib/library/xseries/XSound.java b/platform/platform-bukkit-impl/src/main/java/taboolib/library/xseries/XSound.java index fffd60ddc..cce9ebd1d 100644 --- a/platform/platform-bukkit-impl/src/main/java/taboolib/library/xseries/XSound.java +++ b/platform/platform-bukkit-impl/src/main/java/taboolib/library/xseries/XSound.java @@ -1957,6 +1957,72 @@ public final class XSound extends XModule { ITEM_SPEAR_WOOD_HIT = std("item.spear_wood.hit"), ITEM_SPEAR_WOOD_USE = std("item.spear_wood.use"); + @XInfo(since = "26.1") + public static final XSound + BLOCK_NOTE_BLOCK_TRUMPET = std("block.note_block.trumpet"), + BLOCK_NOTE_BLOCK_TRUMPET_EXPOSED = std("block.note_block.trumpet_exposed"), + BLOCK_NOTE_BLOCK_TRUMPET_OXIDIZED = std("block.note_block.trumpet_oxidized"), + BLOCK_NOTE_BLOCK_TRUMPET_WEATHERED = std("block.note_block.trumpet_weathered"), + ENTITY_BABY_CAT_AMBIENT = std("entity.baby_cat.ambient"), + ENTITY_BABY_CAT_BEG_FOR_FOOD = std("entity.baby_cat.beg_for_food"), + ENTITY_BABY_CAT_DEATH = std("entity.baby_cat.death"), + ENTITY_BABY_CAT_EAT = std("entity.baby_cat.eat"), + ENTITY_BABY_CAT_HISS = std("entity.baby_cat.hiss"), + ENTITY_BABY_CAT_HURT = std("entity.baby_cat.hurt"), + ENTITY_BABY_CAT_PURR = std("entity.baby_cat.purr"), + ENTITY_BABY_CAT_PURREOW = std("entity.baby_cat.purreow"), + ENTITY_BABY_CAT_STRAY_AMBIENT = std("entity.baby_cat.stray_ambient"), + ENTITY_BABY_CHICKEN_AMBIENT = std("entity.baby_chicken.ambient"), + ENTITY_BABY_CHICKEN_DEATH = std("entity.baby_chicken.death"), + ENTITY_BABY_CHICKEN_HURT = std("entity.baby_chicken.hurt"), + ENTITY_BABY_CHICKEN_STEP = std("entity.baby_chicken.step"), + ENTITY_BABY_HORSE_AMBIENT = std("entity.baby_horse.ambient"), + ENTITY_BABY_HORSE_ANGRY = std("entity.baby_horse.angry"), + ENTITY_BABY_HORSE_BREATHE = std("entity.baby_horse.breathe"), + ENTITY_BABY_HORSE_DEATH = std("entity.baby_horse.death"), + ENTITY_BABY_HORSE_EAT = std("entity.baby_horse.eat"), + ENTITY_BABY_HORSE_HURT = std("entity.baby_horse.hurt"), + ENTITY_BABY_HORSE_LAND = std("entity.baby_horse.land"), + ENTITY_BABY_HORSE_STEP = std("entity.baby_horse.step"), + ENTITY_BABY_PIG_AMBIENT = std("entity.baby_pig.ambient"), + ENTITY_BABY_PIG_DEATH = std("entity.baby_pig.death"), + ENTITY_BABY_PIG_EAT = std("entity.baby_pig.eat"), + ENTITY_BABY_PIG_HURT = std("entity.baby_pig.hurt"), + ENTITY_BABY_PIG_STEP = std("entity.baby_pig.step"), + ENTITY_BABY_WOLF_AMBIENT = std("entity.baby_wolf.ambient"), + ENTITY_BABY_WOLF_DEATH = std("entity.baby_wolf.death"), + ENTITY_BABY_WOLF_GROWL = std("entity.baby_wolf.growl"), + ENTITY_BABY_WOLF_HURT = std("entity.baby_wolf.hurt"), + ENTITY_BABY_WOLF_PANT = std("entity.baby_wolf.pant"), + ENTITY_BABY_WOLF_STEP = std("entity.baby_wolf.step"), + ENTITY_BABY_WOLF_WHINE = std("entity.baby_wolf.whine"), + ENTITY_CAT_ROYAL_AMBIENT = std("entity.cat_royal.ambient"), + ENTITY_CAT_ROYAL_BEG_FOR_FOOD = std("entity.cat_royal.beg_for_food"), + ENTITY_CAT_ROYAL_DEATH = std("entity.cat_royal.death"), + ENTITY_CAT_ROYAL_EAT = std("entity.cat_royal.eat"), + ENTITY_CAT_ROYAL_HISS = std("entity.cat_royal.hiss"), + ENTITY_CAT_ROYAL_HURT = std("entity.cat_royal.hurt"), + ENTITY_CAT_ROYAL_PURR = std("entity.cat_royal.purr"), + ENTITY_CAT_ROYAL_PURREOW = std("entity.cat_royal.purreow"), + ENTITY_CAT_ROYAL_STRAY_AMBIENT = std("entity.cat_royal.stray_ambient"), + ENTITY_CHICKEN_PICKY_AMBIENT = std("entity.chicken_picky.ambient"), + ENTITY_CHICKEN_PICKY_DEATH = std("entity.chicken_picky.death"), + ENTITY_CHICKEN_PICKY_HURT = std("entity.chicken_picky.hurt"), + ENTITY_COW_MOODY_AMBIENT = std("entity.cow_moody.ambient"), + ENTITY_COW_MOODY_DEATH = std("entity.cow_moody.death"), + ENTITY_COW_MOODY_HURT = std("entity.cow_moody.hurt"), + ENTITY_COW_MOODY_STEP = std("entity.cow_moody.step"), + ENTITY_PIG_BIG_AMBIENT = std("entity.pig_big.ambient"), + ENTITY_PIG_BIG_DEATH = std("entity.pig_big.death"), + ENTITY_PIG_BIG_EAT = std("entity.pig_big.eat"), + ENTITY_PIG_BIG_HURT = std("entity.pig_big.hurt"), + ENTITY_PIG_EAT = std("entity.pig.eat"), + ENTITY_PIG_MINI_AMBIENT = std("entity.pig_mini.ambient"), + ENTITY_PIG_MINI_DEATH = std("entity.pig_mini.death"), + ENTITY_PIG_MINI_EAT = std("entity.pig_mini.eat"), + ENTITY_PIG_MINI_HURT = std("entity.pig_mini.hurt"), + ITEM_GOLDEN_DANDELION_UNUSE = std("item.golden_dandelion.unuse"), + ITEM_GOLDEN_DANDELION_USE = std("item.golden_dandelion.use"); static { REGISTRY.discardMetadata(); diff --git a/platform/platform-bukkit-impl/src/main/java/taboolib/library/xseries/XTag.java b/platform/platform-bukkit-impl/src/main/java/taboolib/library/xseries/XTag.java index 5fe93514f..e7377aaa6 100644 --- a/platform/platform-bukkit-impl/src/main/java/taboolib/library/xseries/XTag.java +++ b/platform/platform-bukkit-impl/src/main/java/taboolib/library/xseries/XTag.java @@ -2751,7 +2751,7 @@ private static XMaterial[] findAllCorals(boolean alive, boolean block, boolean f * @since 1.13 */ public static boolean isItem(XMaterial material) { - if (XMaterial.supports(13)) { + if (XMaterial.supports(1, 13)) { Material mat = material.get(); return mat != null && mat.isItem(); } @@ -2855,7 +2855,7 @@ public static boolean isItem(XMaterial material) { * @since 1.13 */ public static boolean isInteractable(XMaterial material) { - if (XMaterial.supports(13)) return material.get().isInteractable(); + if (XMaterial.supports(1, 13)) return material.get().isInteractable(); switch (material) { // 1.12 materials only case ACACIA_BUTTON: case ACACIA_DOOR: diff --git a/platform/platform-bukkit-impl/src/main/java/taboolib/library/xseries/particles/XParticle.java b/platform/platform-bukkit-impl/src/main/java/taboolib/library/xseries/particles/XParticle.java index 235bc384f..1b707d4d2 100644 --- a/platform/platform-bukkit-impl/src/main/java/taboolib/library/xseries/particles/XParticle.java +++ b/platform/platform-bukkit-impl/src/main/java/taboolib/library/xseries/particles/XParticle.java @@ -289,6 +289,9 @@ public enum XParticle implements XBase { WITCH("SPELL_WITCH"), @XInfo(since = "1.21.9") COPPER_FIRE_FLAME, + + @XInfo(since = "26.1") PAUSE_MOB_GROWTH, + @XInfo(since = "26.1") RESET_MOB_GROWTH, ; public static final XRegistry REGISTRY = Data.REGISTRY; From 0d44585d4e3413195a9b912ac715451099ac04ba Mon Sep 17 00:00:00 2001 From: Micalhl Date: Wed, 1 Apr 2026 11:24:36 +0800 Subject: [PATCH 04/13] =?UTF-8?q?=E6=96=B0=E7=9A=84=E8=BD=AC=E8=AF=91?= =?UTF-8?q?=E9=80=BB=E8=BE=91=EF=BC=8CPaper/Spigot=201.20.4=E3=80=811.21.1?= =?UTF-8?q?1=E3=80=8126.1=20=E6=B5=8B=E8=AF=95=E9=80=9A=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../taboolib/module/nms/MinecraftVersion.kt | 35 +++++++++++++++++-- .../module/nms/remap/RemapTranslation.kt | 10 +++++- .../nms/remap/RemapTranslationLegacy.kt | 23 ++++++++++-- 3 files changed, 62 insertions(+), 6 deletions(-) diff --git a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/MinecraftVersion.kt b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/MinecraftVersion.kt index 0aa1a3b7a..20d14029d 100644 --- a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/MinecraftVersion.kt +++ b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/MinecraftVersion.kt @@ -216,7 +216,7 @@ object MinecraftVersion { /** * 当前运行版本的 Paper 映射文件 - * 仅用与对 TabooLib 本体的 NMSProxy Impl 进行二次转译(插件本体会自动转译) + * 一、用于对 TabooLib 本体的 NMSProxy Impl 进行二次转译(插件本体会自动转译) * * ``` * 方法/字段逻辑: @@ -236,6 +236,38 @@ object MinecraftVersion { * ``` * * 这么做的原因是要保证 TabooLib 本体必须能够在 Spigot 环境下运行。 + * + * 二、用于在 Spigot Deobf 环境下,将所有 NMSProxy Impl 进行转译 + * + * 在 26.1 版本后,Minecraft 不再被混淆,这意味着不再有混淆表公布 + * 所以,需要提供一种新的转译逻辑,在 1.17 至 1.20.4 中,将 Mojang Deobf 转译为 Spigot Deobf。 + * + * ``` + * 方法/字段逻辑: + * Spigot Deobf -> Mojang Obf (1.18+) + * Mojang Deobf -> Mojang Obf + * + * 以 SystemUtils 为例: + * net/minecraft/Util.backgroundExecutor() -> net/minecraft/SystemUtils.g() + * ^ + * 通过检索下载到的 Spigot 混淆表获得 + * net/minecraft/SystemUtils.ioPool() -> net/minecraft/SystemUtils.g() + * ^ + * 如果是 Paper 服务端则检索服务端里的 reobf.tiny, + * 如果是 Spigot 则下载对应版本的 reobf.tiny 并检索 + * 类逻辑: + * Spigot Deobf 保持不变 + * Mojang Deobf -> Spigot Deobf + * ^ + * 通过 reobf.tiny 查找并转译为 Spigot Deobf + * + * 以 SystemUtils 为例: + * net/minecraft/util/SystemUtils 保持不变 + * net/minecraft/util/Util -> net/minecraft/util/SystemUtils + * ``` + * + * 这么做是为了让用户可以在 1.17+ 只通过 Mojang Deobf 而不是 Spigot Deobf 编写 nms 代码, + * 而不需要同时为了兼容 26.1 和低版本,编写两套代码。 */ val paperMapping by unsafeLazy { // 如果已被其他插件加载,直接从内存中读取 @@ -325,7 +357,6 @@ object MinecraftVersion { } // 在 Bukkit 平台下,注册 Reflex 重定向实现 // 如果是非混淆服务端(26.1+),则不注册 - // TODO: 原本版本出问题 if (runningPlatform == Platform.BUKKIT && !isUnobfuscated) { Reflex.remapper.add(if (isMojangMapping) RemapReflexPaper() else RemapReflexSpigot()) } diff --git a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslation.kt b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslation.kt index c7f02337c..07466d4b8 100644 --- a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslation.kt +++ b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslation.kt @@ -53,9 +53,17 @@ open class RemapTranslation : Remapper() { spigotName = if (MinecraftVersion.isMojangMapping) MinecraftVersion.paperMapping.classMapSpigotToMojang[spigotName] ?: spigotName else spigotName spigotName.replace('.', '/') } else { - key + // 如果是非 Universal CraftBukkit 环境,且这里是 Mojang.Fullname,则:尝试获取 Spigot.Fullname 并返回,如果获取不到,那么 key 就是 Spigot.Fullname 本身 + if (!MinecraftVersion.isMojangMapping) { + MinecraftVersion.paperMapping.classMapMojangToSpigot[key.replace('/', '.')]?.replace('.', '/') ?: key + } else { + // 如果为 Universal CraftBukkit 环境,这里不管是 Spigot.Fullname 还是 Mojang.Fullname 都不需要动 + // 如果是 Spigot.Fullname,Paper PluginRemapper 会进行转译 + key + } } } else { + // TODO 如果是 Mojang.Fullname 则尝试寻找对应的 Spigot.Fullname if (key.startsWith("net/minecraft")) "net/minecraft/server/${MinecraftVersion.minecraftVersion}/${key.substringAfterLast('/')}" else key } } diff --git a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslationLegacy.kt b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslationLegacy.kt index 172db6df6..4d68abeb1 100644 --- a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslationLegacy.kt +++ b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslationLegacy.kt @@ -33,7 +33,14 @@ open class RemapTranslationLegacy : RemapTranslation() { val runningOwner = translate(owner).replace('/', '.') // 追溯父类和接口 val findPath = parentsCacheMap.getOrPut(runningOwner) { findParents(runningOwner).reversed() } - return MinecraftVersion.spigotMapping.fields.find { it.translateName == name && it.path in findPath }?.mojangName ?: name + // 这里肯定是非 Universal CraftBukkit 环境 + // 先尝试当作 Mojang Deobf 转为 Mojang obf,否则当作 Spigot Deobf 转为 Mojang obf + // 这里有个好处是:Spigot 方法和字段的映射在 1.18+ 才提供,但是 Mojang Deobf 从 1.17 开始就提供了,可以直接使用 + var mojangName = MinecraftVersion.paperMapping.fields.find { it.translateName == name && it.path in findPath }?.mojangName + if (mojangName == null) { + mojangName = MinecraftVersion.spigotMapping.fields.find { it.translateName == name && it.path in findPath }?.mojangName + } + return mojangName ?: name } return name } @@ -54,10 +61,20 @@ open class RemapTranslationLegacy : RemapTranslation() { val runningOwner = translate(owner).replace('/', '.') // 追溯父类和接口 val findPath = parentsCacheMap.getOrPut(runningOwner) { findParents(runningOwner).reversed() } - return MinecraftVersion.spigotMapping.methods.find { + // 这里肯定是非 Universal CraftBukkit 环境 + // 先尝试当作 Mojang Deobf 转为 Mojang obf,否则当作 Spigot Deobf 转为 Mojang obf + // 这里有个好处是:Spigot 方法和字段的映射在 1.18+ 才提供,但是 Mojang Deobf 从 1.17 开始就提供了,可以直接使用 + var mojangName = MinecraftVersion.paperMapping.methods.find { // 根据复杂程度依次对比 it.translateName == name && it.path in findPath && RemapHelper.checkParameterType(desc, it.descriptor) - }?.mojangName ?: name + }?.mojangName + if (mojangName == null) { + mojangName = MinecraftVersion.spigotMapping.methods.find { + // 根据复杂程度依次对比 + it.translateName == name && it.path in findPath && RemapHelper.checkParameterType(desc, it.descriptor) + }?.mojangName + } + return mojangName ?: name } return name } From 3dc6817fa626574de5ff09e2134c0d7f0a6099e8 Mon Sep 17 00:00:00 2001 From: Micalhl Date: Wed, 1 Apr 2026 14:47:51 +0800 Subject: [PATCH 05/13] =?UTF-8?q?=E6=96=B0=E7=9A=84=20reflex=20=E8=BD=AC?= =?UTF-8?q?=E8=AF=91=E9=80=BB=E8=BE=91=EF=BC=8CPaper/Spigot=201.20.4?= =?UTF-8?q?=E3=80=811.21.11=20=E6=B5=8B=E8=AF=95=E9=80=9A=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../taboolib/module/nms/MeteorReflection.java | 33 +++++++++++++++ .../kotlin/taboolib/module/nms/Mapping.kt | 5 +++ .../module/nms/MinecraftServerUtil.kt | 3 +- .../taboolib/module/nms/remap/RemapReflex.kt | 22 ++++++++++ .../module/nms/remap/RemapReflexPaper.kt | 24 ----------- .../module/nms/remap/RemapReflexSpigot.kt | 42 +++++++++++++++---- .../module/nms/remap/RemapTranslation.kt | 7 +++- 7 files changed, 99 insertions(+), 37 deletions(-) diff --git a/module/bukkit-nms/src/main/java/taboolib/module/nms/MeteorReflection.java b/module/bukkit-nms/src/main/java/taboolib/module/nms/MeteorReflection.java index 6e402415b..2b852cce7 100644 --- a/module/bukkit-nms/src/main/java/taboolib/module/nms/MeteorReflection.java +++ b/module/bukkit-nms/src/main/java/taboolib/module/nms/MeteorReflection.java @@ -1,5 +1,6 @@ package taboolib.module.nms; +import org.bukkit.Bukkit; import taboolib.common.PrimitiveIO; import taboolib.common.TabooLib; @@ -22,6 +23,9 @@ public class MeteorReflection { private static Class paperReflectionHolder; private static Method forName; + private static boolean isMojangMapping = true; + private static String minecraftVersion; + static { try { paperReflectionHolder = (Class>) Class.forName(PAPER_REFLECTION_HOLDER); @@ -29,6 +33,12 @@ public class MeteorReflection { forName.setAccessible(true); } catch (Throwable ignored) { } + // 简单判断 + final String obcPackage = Bukkit.getServer().getClass().getName(); + if (obcPackage.startsWith("org.bukkit.craftbukkit.v1_")) { + isMojangMapping = false; + minecraftVersion = isMojangMapping ? "UNKNOWN" : obcPackage.split("\\.")[3]; + } } /** @@ -69,6 +79,29 @@ public static Class forName(String name, boolean initialize, ClassLoader load throw new RuntimeException(e); } } else { + /** + * 不是 mojang mapping 的版本有: + * - 1.21.11 及以下的全部 spigot + * - 1.20.5 以下的 paper + * 这些版本无法从 mojang mapping 查找 spigot deobf + * 其余版本: + * - 这些版本均无需从 mojang mapping 查找 spigot deobf + * - 26.1 及以上不能查找 spigot deobf + * - 1.20.6 及以上,paper reflection holder 提供了从 spigot deobf 查找 mojang deobf,无需提供 + * + * 综上所述,只需要为非 mojang mapping 版本提供从 mojang mapping 查找 spigot deobf 的功能即可. + */ + if (!isMojangMapping) { + // 为不带版本的 obc 包名添加版本号 + if (name.startsWith("org.bukkit.craftbukkit") && !name.startsWith("org.bukkit.craftbukkit.v1")) { + name = name.replace("org.bukkit.craftbukkit.", "org.bukkit.craftbukkit." + minecraftVersion); + } + // 处理 nms 类 + if (name.startsWith("net.minecraft")) { + final String translatedName = name.replace("\\.", "/"); + name = MinecraftVersion.INSTANCE.getPaperMapping().getClassMapMojangToSpigot().getOrDefault(translatedName, translatedName).replace("/", "\\."); + } + } return Class.forName(name, initialize, loader); } } diff --git a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/Mapping.kt b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/Mapping.kt index e1cbcfdd7..bb4c4b970 100644 --- a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/Mapping.kt +++ b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/Mapping.kt @@ -27,6 +27,8 @@ class Mapping( // 内存换性能 // val classMapSpigotToMojang: MutableMap = HashMap(), + // + val classMapMojangS2F: MutableMap = HashMap(), // val classMapMojangToSpigot: MutableMap = HashMap(), // 字段 @@ -41,6 +43,7 @@ class Mapping( fun exchange(id: String): Mapping { Exchanges["$id#classMapSpigotS2F"] = classMapSpigotS2F Exchanges["$id#classMapSpigotToMojang"] = classMapSpigotToMojang + Exchanges["$id#classMapMojangS2F"] = classMapMojangS2F Exchanges["$id#classMapMojangToSpigot"] = classMapMojangToSpigot Exchanges["$id#fields"] = fields.map { arrayOf(it.path, it.mojangName, it.translateName) } Exchanges["$id#methods"] = methods.map { arrayOf(it.path, it.mojangName, it.translateName, it.descriptor) } @@ -181,6 +184,7 @@ class Mapping( val spigotName = args[2].replace('/', '.') mapping.classMapSpigotToMojang[spigotName] = mojangName mapping.classMapMojangToSpigot[mojangName] = spigotName + mapping.classMapMojangS2F[mojangName.substringAfterLast('.', "")] = mojangName } // 方法 // Paper 在运行时会将方法转换为 Mojang Deobf 名,但 Spigot 不会(Spigot 环境时,方法名为 Mojang Obf 名) @@ -216,6 +220,7 @@ class Mapping( return Mapping( Exchanges["$id#classMapSpigotS2F"], Exchanges["$id#classMapSpigotToMojang"], + Exchanges["$id#classMapMojangS2F"], Exchanges["$id#classMapMojangToSpigot"], Exchanges.get>>("$id#fields").mapTo(LinkedList()) { Field(it[0], it[1], it[2]) }, Exchanges.get>>("$id#methods").mapTo(LinkedList()) { Method(it[0], it[1], it[2], it[3]) } diff --git a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/MinecraftServerUtil.kt b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/MinecraftServerUtil.kt index 00815e3b8..8efc142df 100644 --- a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/MinecraftServerUtil.kt +++ b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/MinecraftServerUtil.kt @@ -62,10 +62,9 @@ fun nmsClass(name: String): Class<*> { return if (MinecraftVersion.isUnobfuscated) { ClassHelper.getClass("net.minecraft.$name") } else { - // TODO: nmsClass("net.minecraft.util.SystemUtils") SystemUtils (Spigot Deobf) 与 Util (Mojang Deobf) 互转 val className = name.split('.').last() if (MinecraftVersion.isUniversal) { - ClassHelper.getClass(MinecraftVersion.spigotMapping.classMapSpigotS2F[className]?.replace('/', '.') ?: throw ClassNotFoundException(className)) + ClassHelper.getClass(MinecraftVersion.paperMapping.classMapMojangS2F[className]?.replace('/', '.') ?: MinecraftVersion.spigotMapping.classMapSpigotS2F[className]?.replace('/', '.') ?: throw ClassNotFoundException(className)) } else { ClassHelper.getClass("net.minecraft.server.${MinecraftVersion.minecraftVersion}.$className") } diff --git a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapReflex.kt b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapReflex.kt index aefb63213..6b2ff6333 100644 --- a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapReflex.kt +++ b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapReflex.kt @@ -51,4 +51,26 @@ abstract class RemapReflex : ReflexRemapper { newFile(getDataFolder(), ".dev/remap.txt").appendText("m\t$namespace\t$old\t$new\t$descriptor\n") } } + + /** + * 这里存在一个潜在问题,与 NMSProxy 不同的是无法确认它来自何种对照表 + * 因此要从两边猜 + */ + fun matchName(name: String): Pair { + val className = name.replace('/', '.') + var spigotName = paperMapping.classMapMojangToSpigot[className] + val mojangName: String? + // 不为空说明 name 是 Mojang 名 + if (spigotName != null) { + mojangName = className + } else { + spigotName = className + mojangName = paperMapping.classMapSpigotToMojang[className] + } + return spigotName to mojangName + } + + fun translate(key: String): String { + return MinecraftVersion.paperMapping.classMapSpigotToMojang[key.replace('/', '.')] ?: key + } } \ No newline at end of file diff --git a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapReflexPaper.kt b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapReflexPaper.kt index 1fc02d412..d96ff20cc 100644 --- a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapReflexPaper.kt +++ b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapReflexPaper.kt @@ -1,7 +1,5 @@ package taboolib.module.nms.remap -import taboolib.module.nms.MinecraftVersion - /** * TabooLib * taboolib.module.nms.remap.RefRemapper @@ -59,26 +57,4 @@ class RemapReflexPaper : RemapReflex() { deobf } } - - /** - * 这里存在一个潜在问题,与 NMSProxy 不同的是无法确认它来自何种对照表 - * 因此要从两边猜 - */ - fun matchName(name: String): Pair { - val className = name.replace('/', '.') - var spigotName = paperMapping.classMapMojangToSpigot[className] - val mojangName: String? - // 不为空说明 name 是 Mojang 名 - if (spigotName != null) { - mojangName = className - } else { - spigotName = className - mojangName = paperMapping.classMapSpigotToMojang[className] - } - return spigotName to mojangName - } - - fun translate(key: String): String { - return MinecraftVersion.paperMapping.classMapSpigotToMojang[key.replace('/', '.')] ?: key - } } \ No newline at end of file diff --git a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapReflexSpigot.kt b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapReflexSpigot.kt index b7b06b835..494090289 100644 --- a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapReflexSpigot.kt +++ b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapReflexSpigot.kt @@ -17,8 +17,19 @@ class RemapReflexSpigot : RemapReflex() { return if (fieldRemapCacheMap.containsKey(namespace)) { fieldRemapCacheMap[namespace]!! } else { - // 还原 - val value = spigotMapping.fields.find { it.path == name && it.translateName == field }?.mojangName ?: field + val (spigotName, mojangName) = matchName(name) + if (spigotName == null || mojangName == null) { + saveField(namespace, field, field) + return field + } + // 先尝试按照 Mojang Deobf 查找 Mojang Obf + var find = paperMapping.fields.find { it.path == mojangName && it.translateName == field }?.mojangName + // 如果找不到,则按照 Spigot Deobf 查找 Mojang Obf + if (find == null) { + find = spigotMapping.fields.find { it.path == spigotName && it.translateName == field }?.mojangName + } + // 如果还找不到,可能就是 Mojang Obf 本身了 + val value = find ?: field saveField(namespace, field, value) value } @@ -28,19 +39,32 @@ class RemapReflexSpigot : RemapReflex() { override fun method(name: String, method: String, vararg parameter: Any?): String { // 1.18 开始方法混淆 - if (major >= 10) { + // 2026/4/1 更改:改为从 1.17 开始判断,因为 1.17 的方法名存在 Mojang Deobf 版本 + if (isUniversal) { val namespace = "$name#$method(${parameter.joinToString(",") { it?.javaClass?.name.toString() }})" return if (methodRemapCacheMap.containsKey(namespace)) { methodRemapCacheMap[namespace]!! } else { + val (spigotName, mojangName) = matchName(name) + if (spigotName == null || mojangName == null) { + saveMethod(namespace, method, method, null) + return method + } val pArray: Array = arrayOf(*parameter) - // 还原 - val find = spigotMapping.methods.find { - // 判断方法描述符获取准确方法 - it.path == name && it.translateName == method && RemapHelper.checkParameterType(pArray, it.descriptor) + // 先尝试按照 Mojang Deobf 查找 Mojang Obf + var findObf = paperMapping.methods.find { + // 判断方法描述符获取准确 + it.path == mojangName && it.translateName == method && RemapHelper.checkParameterType(pArray, it.descriptor) + } + // 如果找不到,则按照 Spigot Deobf 查找 Mojang Deobf + if (findObf == null) { + findObf = spigotMapping.methods.find { + it.path == spigotName && it.translateName == method && RemapHelper.checkParameterType(pArray, it.descriptor) + } } - val value = find?.mojangName ?: method - saveMethod(namespace, method, value, find?.descriptor) + // 如果还找不到,可能就是 Mojang Obf 本身了 + val value = findObf?.mojangName ?: method + saveMethod(namespace, method, value, findObf?.descriptor) value } } diff --git a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslation.kt b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslation.kt index 07466d4b8..d147c896b 100644 --- a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslation.kt +++ b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslation.kt @@ -63,8 +63,11 @@ open class RemapTranslation : Remapper() { } } } else { - // TODO 如果是 Mojang.Fullname 则尝试寻找对应的 Spigot.Fullname - if (key.startsWith("net/minecraft")) "net/minecraft/server/${MinecraftVersion.minecraftVersion}/${key.substringAfterLast('/')}" else key + // 如果是 Mojang.Fullname 则尝试寻找对应的 Spigot.Fullname + if (key.startsWith("net/minecraft")) { + val spigotName = MinecraftVersion.paperMapping.classMapMojangToSpigot[key.replace('/', '.')]?.replace('.', '/') ?: key + "net/minecraft/server/${MinecraftVersion.minecraftVersion}/${spigotName.substringAfterLast('/')}" + } else key } } From 6c4c881b89d7857481906fa1766ec33170a4decd Mon Sep 17 00:00:00 2001 From: Micalhl Date: Wed, 1 Apr 2026 15:44:05 +0800 Subject: [PATCH 06/13] =?UTF-8?q?ItemTag=20=E6=B5=8B=E8=AF=95=E9=80=9A?= =?UTF-8?q?=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit-nms-tag-modern/build.gradle.kts | 5 + .../taboolib/module/nms/NMSItemTagImpl2.kt | 303 ++++++++++++++++++ .../kotlin/taboolib/module/nms/NMSItemTag.kt | 1 + 3 files changed, 309 insertions(+) create mode 100644 module/bukkit-nms/bukkit-nms-tag/bukkit-nms-tag-modern/src/main/kotlin/taboolib/module/nms/NMSItemTagImpl2.kt diff --git a/module/bukkit-nms/bukkit-nms-tag/bukkit-nms-tag-modern/build.gradle.kts b/module/bukkit-nms/bukkit-nms-tag/bukkit-nms-tag-modern/build.gradle.kts index b8a41071a..478af9d4d 100644 --- a/module/bukkit-nms/bukkit-nms-tag/bukkit-nms-tag-modern/build.gradle.kts +++ b/module/bukkit-nms/bukkit-nms-tag/bukkit-nms-tag-modern/build.gradle.kts @@ -1,5 +1,10 @@ +repositories { + maven("https://libraries.minecraft.net") +} + dependencies { compileOnly(project(":module:bukkit-nms")) compileOnly(project(":module:bukkit-nms:bukkit-nms-tag")) compileOnly("ink.ptms.core:v12104:12104:mapped") + compileOnly("paper:v12111:12111:core") } \ No newline at end of file diff --git a/module/bukkit-nms/bukkit-nms-tag/bukkit-nms-tag-modern/src/main/kotlin/taboolib/module/nms/NMSItemTagImpl2.kt b/module/bukkit-nms/bukkit-nms-tag/bukkit-nms-tag-modern/src/main/kotlin/taboolib/module/nms/NMSItemTagImpl2.kt new file mode 100644 index 000000000..43cacce39 --- /dev/null +++ b/module/bukkit-nms/bukkit-nms-tag/bukkit-nms-tag-modern/src/main/kotlin/taboolib/module/nms/NMSItemTagImpl2.kt @@ -0,0 +1,303 @@ +package taboolib.module.nms + +import net.minecraft.advancements.criterion.BlockPredicate +import net.minecraft.core.component.DataComponentType +import net.minecraft.core.component.DataComponents +import net.minecraft.core.registries.BuiltInRegistries +import net.minecraft.nbt.* +import net.minecraft.resources.Identifier +import net.minecraft.world.item.AdventureModePredicate +import net.minecraft.world.item.component.CustomData +import net.minecraft.world.level.block.Block +import org.bukkit.craftbukkit.CraftRegistry +import org.bukkit.craftbukkit.inventory.CraftItemStack +import org.bukkit.inventory.ItemStack +import taboolib.module.nms.remap.DynamicOpcode +import taboolib.module.nms.remap.dynamic +import java.util.Optional +import kotlin.jvm.optionals.getOrNull + +/** + * [NMSItemTag] 的实现类,使用 Mojang Mapping + */ +class NMSItemTagImpl2 : NMSItemTag() { + + override fun newItemTag(): ItemTag { + return ItemTag12005() + } + + override fun toMinecraftJson(itemStack: ItemStack): String { + return getNMSCopy(itemStack).toNbt().toString() + } + + override fun fromMinecraftJson(json: String): ItemStack? { + // 1.20.5 -> MojangsonParser.parseTag(String) + // 1.21.5 -> MojangsonParser.parseComponentFully(String) + val compound = TagParser.parseCompoundFully(json) + return compound.toItemStack() + } + + override fun getNMSCopy(itemStack: ItemStack): net.minecraft.world.item.ItemStack { + return CraftItemStack.asNMSCopy(itemStack) + } + + override fun getBukkitCopy(itemStack: Any): ItemStack { + return CraftItemStack.asBukkitCopy(itemStack as net.minecraft.world.item.ItemStack) + } + + override fun getItemTag(itemStack: ItemStack, onlyCustom: Boolean): ItemTag { + val nmsItem = getNMSCopy(itemStack) + return if (onlyCustom) { + val tag = nmsItem.get(DataComponents.CUSTOM_DATA)?.copyTag() + if (tag != null) itemTagToBukkitCopy(tag, true).asCompound() else ItemTag() + } else { + val tag = nmsItem.toNbt() + if (tag != null) itemTagToBukkitCopy(tag, false).asCompound() else ItemTag12005() // 返回一个特殊的 ItemTag + } + } + + override fun setItemTag(itemStack: ItemStack, itemTag: ItemTag, onlyCustom: Boolean): ItemStack { + return if (onlyCustom) { + val nmsItem = getNMSCopy(itemStack) + nmsItem.set(DataComponents.CUSTOM_DATA, customDataOf(itemTagToNMSCopy(itemTag) as CompoundTag)) + getBukkitCopy(nmsItem) + } else { + itemTagToNMSCopy(itemTag).toItemStack() ?: itemStack + } + } + + private fun customDataOf(nbt: Any): CustomData { + return dynamic( + DynamicOpcode.INVOKESTATIC, + "net.minecraft.world.item.component.CustomData#of(net.minecraft.nbt.CompoundTag;)net.minecraft.world.item.component.CustomData;", + nbt + ) as CustomData + } + + private fun setAdventurePredicate( + itemStack: ItemStack, + blocks: List, + componentType: DataComponentType, + ): ItemStack { + val nmsItem = getNMSCopy(itemStack) + val predicates = blocks.mapNotNull { blockName -> + val key = Identifier.parse(blockName) + // 懒得导服务端 + @Suppress("unchecked_cast") + val blockHolder = (dynamic( + DynamicOpcode.INVOKEVIRTUAL, + "net.minecraft.core.Registry#get(net.minecraft.resources.Identifier;)java.util.Optional;", + key + ) as Optional).getOrNull() + blockHolder?.let { holder -> + val builder = BlockPredicate.Builder.block() + val block = dynamic( + DynamicOpcode.INVOKEVIRTUAL, + "net.minecraft.core.Holder\$Reference#value()java.lang.Object;", + holder + ) as Block + builder.of(BuiltInRegistries.BLOCK, block) + builder.build() + } + } + val predicate = dynamic(DynamicOpcode.INVOKESPECIAL, "net.minecraft.world.item.AdventureModePredicate(java.util.List;)V", predicates) as AdventureModePredicate + nmsItem.set(componentType, predicate) + return getBukkitCopy(nmsItem) + } + + override fun setItemCanBreak(itemStack: ItemStack, blocks: List): ItemStack { + return setAdventurePredicate(itemStack, blocks, DataComponents.CAN_BREAK) + } + + override fun setItemCanPlaceOn(itemStack: ItemStack, blocks: List): ItemStack { + return setAdventurePredicate(itemStack, blocks, DataComponents.CAN_PLACE_ON) + } + + override fun hasItemCanBreak(itemStack: ItemStack): Boolean { + val nmsItem = getNMSCopy(itemStack) + return nmsItem.get(DataComponents.CAN_BREAK) != null + } + + override fun hasItemCanPlaceOn(itemStack: ItemStack): Boolean { + val nmsItem = getNMSCopy(itemStack) + return nmsItem.get(DataComponents.CAN_PLACE_ON) != null + } + + override fun removeItemCanBreak(itemStack: ItemStack): ItemStack { + val nmsItem = getNMSCopy(itemStack) + nmsItem.remove(DataComponents.CAN_BREAK) + return getBukkitCopy(nmsItem) + } + + override fun removeItemCanPlaceOn(itemStack: ItemStack): ItemStack { + val nmsItem = getNMSCopy(itemStack) + nmsItem.remove(DataComponents.CAN_PLACE_ON) + return getBukkitCopy(nmsItem) + } + + override fun itemTagToString(itemTagData: ItemTagData): String { + return itemTagToNMSCopy(itemTagData).toString() + } + + override fun itemTagToNMSCopy(itemTagData: ItemTagData): Tag { + return when (itemTagData.type) { + // 基本类型 + ItemTagType.BYTE -> ByteTag.valueOf(itemTagData.asByte()) + ItemTagType.SHORT -> ShortTag.valueOf(itemTagData.asShort()) + ItemTagType.INT -> IntTag.valueOf(itemTagData.asInt()) + ItemTagType.LONG -> LongTag.valueOf(itemTagData.asLong()) + ItemTagType.FLOAT -> FloatTag.valueOf(itemTagData.asFloat()) + ItemTagType.DOUBLE -> DoubleTag.valueOf(itemTagData.asDouble()) + ItemTagType.STRING -> StringTag.valueOf(itemTagData.asString()) + + // 数组类型特殊处理 + ItemTagType.BYTE_ARRAY -> ByteArrayTag(itemTagData.asByteArray().copyOf()) + ItemTagType.INT_ARRAY -> IntArrayTag(itemTagData.asIntArray().copyOf()) + ItemTagType.LONG_ARRAY -> LongArrayTag(itemTagData.asLongArray().copyOf()) + + // 列表类型特殊处理 + ItemTagType.LIST -> { + ListTag().also { nmsList -> + val dataList = itemTagData.asList() + if (dataList.isNotEmpty()) { + dataList.forEach { nmsList.add(itemTagToNMSCopy(it)) } + } + } + } + + // 复合类型特殊处理 + ItemTagType.COMPOUND -> { + CompoundTag().also { nmsCompound -> + itemTagData.asCompound().entries.forEach { (key, value) -> + nmsCompound.put(key, itemTagToNMSCopy(value)) + } + } + } + + // 不支持的类型 + else -> error("Unsupported type: ${itemTagData.type}}") + } + } + + override fun itemTagToBukkitCopy(nbtTag: Any): ItemTagData { + return itemTagToBukkitCopy(nbtTag, false) + } + + private fun itemTagToBukkitCopy(nbtTag: Any, onlyCustom: Boolean): ItemTagData { + return when (nbtTag) { + // 基本类型 + is ByteTag -> ItemTagData( + ItemTagType.BYTE, + nbtTag.value() + ) + + is ShortTag -> ItemTagData( + ItemTagType.SHORT, + nbtTag.value() + ) + + is IntTag -> ItemTagData( + ItemTagType.INT, + nbtTag.value() + ) + + is LongTag -> ItemTagData( + ItemTagType.LONG, + nbtTag.value() + ) + + is FloatTag -> ItemTagData( + ItemTagType.FLOAT, + nbtTag.value() + ) + + is DoubleTag -> ItemTagData( + ItemTagType.DOUBLE, + nbtTag.value() + ) + + is StringTag -> ItemTagData( + ItemTagType.STRING, + nbtTag.value() + ) + + // 数组类型特殊处理 + is ByteArrayTag -> ItemTagData(ItemTagType.BYTE_ARRAY, nbtTag.asByteArray.copyOf()) + is IntArrayTag -> ItemTagData(ItemTagType.INT_ARRAY, nbtTag.asIntArray.copyOf()) + is LongArrayTag -> ItemTagData(ItemTagType.LONG_ARRAY, nbtTag.asLongArray.copyOf()) + + // 列表类型特殊处理 + is ListTag -> { + ItemTagList(nbtTag.map { itemTagToBukkitCopy(it) }) + } + + // 复合类型特殊处理 + is CompoundTag -> { + nbtTag.keySet().associateWith { itemTagToBukkitCopy(nbtTag.get(it)!!) }.let { + if (onlyCustom) ItemTag(it) else ItemTag12005(it) + } + } + + // 不支持的类型 + else -> error("Unsupported type: ${nbtTag::class.java}}") + } + } + + val nmsItemStackCodeC = dynamic( + DynamicOpcode.GETSTATIC, + "net.minecraft.world.item.ItemStack#CODEC:com.mojang.serialization.Codec;" + ) + val nbtOpsInstance = dynamic( + DynamicOpcode.GETSTATIC, + "net.minecraft.nbt.NbtOps#INSTANCE:net.minecraft.nbt.NbtOps;" + ) + + // 12106 + private fun net.minecraft.world.item.ItemStack.toNbt(): Tag? { + // NMSItemStack.CODEC.encodeStart(CraftRegistry.getMinecraftRegistry().createSerializationContext(DynamicOpsNBT.INSTANCE), this).result().getOrNull() + // java.lang.IncompatibleClassChangeError: Found interface com.mojang.serialization.DataResult, but class was expected + + // java 17 + val serializationContext = dynamic( + DynamicOpcode.INVOKEVIRTUAL, + "net.minecraft.core.HolderLookup\$Provider#createSerializationContext(com.mojang.serialization.DynamicOps;)net.minecraft.resources.RegistryOps;", + CraftRegistry.getMinecraftRegistry(), + nbtOpsInstance + ) + val dataResult = dynamic( + DynamicOpcode.INVOKEVIRTUAL, + "com.mojang.serialization.Encoder#encodeStart(com.mojang.serialization.DynamicOps;java.lang.Object;)com.mojang.serialization.DataResult;", + nmsItemStackCodeC, + serializationContext, + this + ) + @Suppress("unchecked_cast") + val optional = dynamic(DynamicOpcode.INVOKEVIRTUAL, "com.mojang.serialization.DataResult#result()java.util.Optional;", dataResult) as Optional + return optional.getOrNull() + } + + // 12106 + private fun Tag.toItemStack(): ItemStack? { + // NMSItemStack.CODEC.parse(CraftRegistry.getMinecraftRegistry().createSerializationContext(DynamicOpsNBT.INSTANCE), this) + // java.lang.IncompatibleClassChangeError: Found interface com.mojang.serialization.DataResult, but class was expected + + // java 17 + val serializationContext = dynamic( + DynamicOpcode.INVOKEVIRTUAL, + "net.minecraft.core.HolderLookup\$Provider#createSerializationContext(com.mojang.serialization.DynamicOps;)net.minecraft.resources.RegistryOps;", + CraftRegistry.getMinecraftRegistry(), + nbtOpsInstance + ) + val dataResult = dynamic( + DynamicOpcode.INVOKEVIRTUAL, + "com.mojang.serialization.Decoder#parse(com.mojang.serialization.DynamicOps;java.lang.Object;)com.mojang.serialization.DataResult;", + nmsItemStackCodeC, + serializationContext, + this + ) + @Suppress("unchecked_cast") + val optional = dynamic(DynamicOpcode.INVOKEVIRTUAL, "com.mojang.serialization.DataResult#result()java.util.Optional;", dataResult) as Optional + val nmsItem = optional.getOrNull() + return if (nmsItem != null) getBukkitCopy(nmsItem) else null + } +} \ No newline at end of file diff --git a/module/bukkit-nms/bukkit-nms-tag/src/main/kotlin/taboolib/module/nms/NMSItemTag.kt b/module/bukkit-nms/bukkit-nms-tag/src/main/kotlin/taboolib/module/nms/NMSItemTag.kt index f1d258661..373dff5e1 100644 --- a/module/bukkit-nms/bukkit-nms-tag/src/main/kotlin/taboolib/module/nms/NMSItemTag.kt +++ b/module/bukkit-nms/bukkit-nms-tag/src/main/kotlin/taboolib/module/nms/NMSItemTag.kt @@ -198,6 +198,7 @@ abstract class NMSItemTag { val instance by unsafeLazy { when { + MinecraftVersion.isUnobfuscated -> nmsProxy("{name}Impl2") versionId >= 12005 -> nmsProxy("{name}Impl") else -> nmsProxy("{name}Legacy") } From 866c0008ba5fe1baa8577894618dc97cfb6614d3 Mon Sep 17 00:00:00 2001 From: Micalhl Date: Wed, 1 Apr 2026 19:44:51 +0800 Subject: [PATCH 07/13] =?UTF-8?q?EntityAI=E3=80=81NMS=20stable=20=E5=9C=A8?= =?UTF-8?q?=20Paper/Spigot=201.21.11=E3=80=8126.1=20=E4=B8=8A=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit-nms/bukkit-nms-ai/build.gradle.kts | 1 + .../module/ai/PathfinderCreatorImpl26.java | 49 ++++ .../module/ai/PathfinderExecutorImpl26.kt | 248 ++++++++++++++++++ .../taboolib/module/ai/SimpleAiExecutor.kt | 6 +- .../bukkit-nms-stable/build.gradle.kts | 1 + .../kotlin/taboolib/module/nms/NMSEntity.kt | 4 +- .../kotlin/taboolib/module/nms/NMSMessage.kt | 35 ++- .../kotlin/taboolib/module/nms/NMSParticle.kt | 23 +- .../taboolib/module/nms/NMSScoreboard.kt | 186 ++++++++++--- .../kotlin/taboolib/module/nms/NMSSign.kt | 16 +- .../taboolib/module/nms/NMSTranslate.kt | 10 +- .../nms/remap/RemapTranslationUnobfsucated.kt | 13 +- 12 files changed, 536 insertions(+), 56 deletions(-) create mode 100644 module/bukkit-nms/bukkit-nms-ai/src/main/java/taboolib/module/ai/PathfinderCreatorImpl26.java create mode 100644 module/bukkit-nms/bukkit-nms-ai/src/main/java/taboolib/module/ai/PathfinderExecutorImpl26.kt diff --git a/module/bukkit-nms/bukkit-nms-ai/build.gradle.kts b/module/bukkit-nms/bukkit-nms-ai/build.gradle.kts index ffac8f193..b728a1c67 100644 --- a/module/bukkit-nms/bukkit-nms-ai/build.gradle.kts +++ b/module/bukkit-nms/bukkit-nms-ai/build.gradle.kts @@ -5,6 +5,7 @@ dependencies { // 服务端 compileOnly("ink.ptms:nms-all:1.0.0") compileOnly("ink.ptms.core:v12104:12104:mapped") + compileOnly("paper:v12111:12111:core") } kotlin { diff --git a/module/bukkit-nms/bukkit-nms-ai/src/main/java/taboolib/module/ai/PathfinderCreatorImpl26.java b/module/bukkit-nms/bukkit-nms-ai/src/main/java/taboolib/module/ai/PathfinderCreatorImpl26.java new file mode 100644 index 000000000..d9f3cf575 --- /dev/null +++ b/module/bukkit-nms/bukkit-nms-ai/src/main/java/taboolib/module/ai/PathfinderCreatorImpl26.java @@ -0,0 +1,49 @@ +package taboolib.module.ai; + +/** + * 该类仅用作生成 ASM 代码,无任何意义 + * + * @author sky + * @since 2018-09-19 22:31 + */ +public class PathfinderCreatorImpl26 extends net.minecraft.world.entity.ai.goal.Goal implements PathfinderCreator { + + private SimpleAi simpleAI; + + public PathfinderCreatorImpl26() { + } + + public PathfinderCreatorImpl26(SimpleAi ai) { + this.simpleAI = ai; + } + + @Override + public Object createPathfinderGoal(SimpleAi ai) { + return new PathfinderCreatorImpl26(ai); + } + + @Override + public boolean canUse() { + return simpleAI.shouldExecute(); + } + + @Override + public boolean canContinueToUse() { + return simpleAI.continueExecute(); + } + + @Override + public void start() { + simpleAI.startTask(); + } + + @Override + public void stop() { + simpleAI.resetTask(); + } + + @Override + public void tick() { + simpleAI.updateTask(); + } +} diff --git a/module/bukkit-nms/bukkit-nms-ai/src/main/java/taboolib/module/ai/PathfinderExecutorImpl26.kt b/module/bukkit-nms/bukkit-nms-ai/src/main/java/taboolib/module/ai/PathfinderExecutorImpl26.kt new file mode 100644 index 000000000..c925b053b --- /dev/null +++ b/module/bukkit-nms/bukkit-nms-ai/src/main/java/taboolib/module/ai/PathfinderExecutorImpl26.kt @@ -0,0 +1,248 @@ +package taboolib.module.ai + +import net.minecraft.world.entity.Mob +import net.minecraft.world.entity.ai.attributes.Attributes +import net.minecraft.world.entity.ai.control.JumpControl +import net.minecraft.world.entity.ai.control.LookControl +import net.minecraft.world.entity.ai.goal.Goal +import net.minecraft.world.entity.ai.goal.GoalSelector +import net.minecraft.world.entity.ai.navigation.PathNavigation +import net.minecraft.world.level.pathfinder.Path +import org.bukkit.Location +import org.bukkit.craftbukkit.entity.CraftEntity +import org.bukkit.entity.Entity +import org.bukkit.entity.LivingEntity +import org.tabooproject.reflex.Reflex.Companion.getProperty +import org.tabooproject.reflex.Reflex.Companion.setProperty +import org.tabooproject.reflex.UnsafeAccess.get +import org.tabooproject.reflex.UnsafeAccess.put +import taboolib.module.nms.MinecraftVersion +import taboolib.module.nms.remap.DynamicOpcode +import taboolib.module.nms.remap.dynamic +import java.lang.reflect.Field + +/** + * 该类仅用作生成 ASM 代码,无任何意义 + * + * @author sky + * @since 2018-09-20 20:57 + */ +class PathfinderExecutorImpl26 : PathfinderExecutor() { + + private var pathEntity: Field? = null + private val pathfinderGoalSelectorSet: Field + private var controllerJumpCurrent: Field + + init { + pathfinderGoalSelectorSet = GoalSelector::class.java.getDeclaredField("availableGoals") + pathfinderGoalSelectorSet.isAccessible = true + controllerJumpCurrent = JumpControl::class.java.getDeclaredField("jump") + controllerJumpCurrent.isAccessible = true + for (field in PathNavigation::class.java.declaredFields) { + if (field.type == Path::class.java) { + pathEntity = field + break + } + } + } + + override fun getEntityInsentient(entity: LivingEntity): Any { + return (entity as CraftEntity).handle + } + + override fun getNavigation(entity: LivingEntity): Any { + return (getEntityInsentient(entity) as Mob).navigation + } + + override fun getControllerJump(entity: LivingEntity): Any { + val e = getEntityInsentient(entity) + if (MinecraftVersion.isUniversal) { + return (e as Mob).jumpControl + } + return (e as Mob).jumpControl + } + + override fun getControllerMove(entity: LivingEntity): Any { + return (getEntityInsentient(entity) as Mob).moveControl + } + + override fun getControllerLook(entity: LivingEntity): Any { + val e = getEntityInsentient(entity) + if (MinecraftVersion.isUniversal) { + return (e as Mob).lookControl + } + return (e as Mob).lookControl + } + + override fun getGoalSelector(entity: LivingEntity): Any { + return (getEntityInsentient(entity) as Mob).goalSelector + } + + override fun getTargetSelector(entity: LivingEntity): Any { + return (getEntityInsentient(entity) as Mob).targetSelector + } + + override fun getPathEntity(entity: LivingEntity): Any { + return get(getNavigation(entity), pathEntity!!)!! + } + + override fun setPathEntity(entity: LivingEntity, pathEntity: Any) { + put(getNavigation(entity), this.pathEntity!!, pathEntity) + } + + override fun addGoalAi(entity: LivingEntity, ai: SimpleAi, priority: Int) { + (getEntityInsentient(entity) as Mob).goalSelector.addGoal(priority, pathfinderCreator.createPathfinderGoal(ai) as Goal) + } + + override fun addTargetAi(entity: LivingEntity, ai: SimpleAi, priority: Int) { + (getEntityInsentient(entity) as Mob).targetSelector.addGoal(priority, pathfinderCreator.createPathfinderGoal(ai) as Goal) + } + + override fun replaceGoalAi(entity: LivingEntity, ai: SimpleAi, priority: Int) { + replaceGoalAi(entity, ai, priority, null) + } + + override fun replaceTargetAi(entity: LivingEntity, ai: SimpleAi, priority: Int) { + replaceTargetAi(entity, ai, priority, null) + } + + override fun replaceGoalAi(entity: LivingEntity, ai: SimpleAi, priority: Int, name: String?) { + if (name == null) { + removeGoal(priority, (getEntityInsentient(entity) as Mob).goalSelector) + } else { + removeGoal(name, (getEntityInsentient(entity) as Mob).goalSelector) + } + addGoalAi(entity, ai, priority) + } + + override fun replaceTargetAi(entity: LivingEntity, ai: SimpleAi, priority: Int, name: String?) { + if (name == null) { + removeGoal(priority, (getEntityInsentient(entity) as Mob).targetSelector) + } else { + removeGoal(name, (getEntityInsentient(entity) as Mob).targetSelector) + } + addTargetAi(entity, ai, priority) + } + + override fun removeGoalAi(entity: LivingEntity, priority: Int) { + removeGoal(priority, (getEntityInsentient(entity) as Mob).goalSelector) + } + + override fun removeTargetAi(entity: LivingEntity, priority: Int) { + removeGoal(priority, (getEntityInsentient(entity) as Mob).targetSelector) + } + + override fun removeGoalAi(entity: LivingEntity, name: String) { + removeGoal(name, (getEntityInsentient(entity) as Mob).goalSelector) + } + + override fun removeTargetAi(entity: LivingEntity, name: String) { + removeGoal(name, (getEntityInsentient(entity) as Mob).targetSelector) + } + + private fun removeGoal(name: String, targetSelector: Any) { + val collection = getGoal(targetSelector) + collection.toList().forEach { + val a = it!!.getProperty("goal", remap = true)!! + if (a.javaClass.name.contains(name)) { + if (collection is MutableList) { + collection.remove(it) + } else if (collection is MutableSet) { + collection.remove(it) + } + } + if (a.javaClass.simpleName == "PathfinderCreatorImpl26" && a.getProperty("simpleAI")!!.javaClass.name.contains(name)) { + if (collection is MutableList) { + collection.remove(it) + } else if (collection is MutableSet) { + collection.remove(it) + } + } + } + } + + private fun removeGoal(priority: Int, targetSelector: Any) { + val collection = getGoal(targetSelector) + collection.toList().forEach { + if (it!!.getProperty("priority") == priority) { + if (collection is MutableList) { + collection.remove(it) + } else if (collection is MutableSet) { + collection.remove(it) + } + } + } + } + + private fun getGoal(targetSelector: Any): Collection<*> { + return targetSelector.getProperty>("availableGoals", remap = true)!! + } + + override fun clearGoalAi(entity: LivingEntity) { + get>((getEntityInsentient(entity) as Mob).goalSelector, pathfinderGoalSelectorSet)?.clear() + } + + override fun clearTargetAi(entity: LivingEntity) { + get>((getEntityInsentient(entity) as Mob).targetSelector, pathfinderGoalSelectorSet)?.clear() + } + + override fun getGoalAi(entity: LivingEntity): Iterable<*>? { + return get>((getEntityInsentient(entity) as Mob).goalSelector, pathfinderGoalSelectorSet) + } + + override fun getTargetAi(entity: LivingEntity): Iterable<*>? { + return get>((getEntityInsentient(entity) as Mob).targetSelector, pathfinderGoalSelectorSet) + } + + override fun setGoalAi(entity: LivingEntity, ai: Iterable<*>?) { + put((getEntityInsentient(entity) as Mob).goalSelector, pathfinderGoalSelectorSet, ai) + } + + override fun setTargetAi(entity: LivingEntity, ai: Iterable<*>?) { + put((getEntityInsentient(entity) as Mob).targetSelector, pathfinderGoalSelectorSet, ai) + } + + override fun navigationMove(entity: LivingEntity, location: Location): Boolean { + return navigationMove(entity, location, 0.6) + } + + override fun navigationMove(entity: LivingEntity, location: Location, speed: Double): Boolean { + return (getNavigation(entity) as PathNavigation).moveTo(location.x, location.y, location.z, speed) + } + + override fun navigationMove(entity: LivingEntity, target: LivingEntity): Boolean { + return navigationMove(entity, target, 0.6) + } + + override fun navigationMove(entity: LivingEntity, target: LivingEntity, speed: Double): Boolean { + return (getNavigation(entity) as PathNavigation).moveTo((target as CraftEntity).handle, speed) + } + + override fun navigationReach(entity: LivingEntity): Boolean { + return dynamic( + DynamicOpcode.INVOKEVIRTUAL, + "net.minecraft.world.level.pathfinder.Path#canReach()Z", + getPathEntity(entity) + ) as Boolean + } + + override fun controllerLookAt(entity: LivingEntity, target: Location) { + (getControllerLook(entity) as LookControl).setLookAt(target.x, target.y, target.z, 10f, 40f) + } + + override fun controllerLookAt(entity: LivingEntity, target: Entity) { + (getControllerLook(entity) as LookControl).setLookAt((target as CraftEntity).handle, 10f, 40f) + } + + override fun controllerJumpReady(entity: LivingEntity) { + (getControllerJump(entity) as JumpControl).setProperty("jump", true, remap = true) + } + + override fun controllerJumpCurrent(entity: LivingEntity): Boolean { + return controllerJumpCurrent.getBoolean(getControllerJump(entity)) + } + + override fun setFollowRange(entity: LivingEntity, value: Double) { + (getEntityInsentient(entity) as Mob).getAttribute(Attributes.FOLLOW_RANGE)!!.baseValue = value + } +} diff --git a/module/bukkit-nms/bukkit-nms-ai/src/main/kotlin/taboolib/module/ai/SimpleAiExecutor.kt b/module/bukkit-nms/bukkit-nms-ai/src/main/kotlin/taboolib/module/ai/SimpleAiExecutor.kt index dd01d5e1e..4d47965c3 100644 --- a/module/bukkit-nms/bukkit-nms-ai/src/main/kotlin/taboolib/module/ai/SimpleAiExecutor.kt +++ b/module/bukkit-nms/bukkit-nms-ai/src/main/kotlin/taboolib/module/ai/SimpleAiExecutor.kt @@ -6,9 +6,11 @@ import org.bukkit.entity.LivingEntity import taboolib.module.nms.MinecraftVersion import taboolib.module.nms.nmsProxy -val pathfinderCreator = nmsProxy(PathfinderCreator::class.java, bind = "{name}Impl" + if (MinecraftVersion.isUniversal) "17" else "") +private val versionId = if (MinecraftVersion.isUnobfuscated) "26" else if (MinecraftVersion.isUniversal) "17" else "" -val pathfinderExecutor = nmsProxy(PathfinderExecutor::class.java, bind = "{name}Impl" + if (MinecraftVersion.isUniversal) "17" else "") +val pathfinderCreator = nmsProxy(PathfinderCreator::class.java, bind = "{name}Impl$versionId") + +val pathfinderExecutor = nmsProxy(PathfinderExecutor::class.java, bind = "{name}Impl$versionId") /** * 注册一个 Goal AI diff --git a/module/bukkit-nms/bukkit-nms-stable/build.gradle.kts b/module/bukkit-nms/bukkit-nms-stable/build.gradle.kts index 3c8aca96d..0ded27fd3 100644 --- a/module/bukkit-nms/bukkit-nms-stable/build.gradle.kts +++ b/module/bukkit-nms/bukkit-nms-stable/build.gradle.kts @@ -18,6 +18,7 @@ dependencies { compileOnly("ink.ptms.core:v12005:12005:mapped") compileOnly("ink.ptms.core:v12002:12002:mapped") compileOnly("ink.ptms.core:v11604:11604") + compileOnly("paper:v12111:12111:core") compileOnly("ink.ptms:nms-all:1.0.0") // Mojang compileOnly("com.mojang:brigadier:1.0.18") diff --git a/module/bukkit-nms/bukkit-nms-stable/src/main/kotlin/taboolib/module/nms/NMSEntity.kt b/module/bukkit-nms/bukkit-nms-stable/src/main/kotlin/taboolib/module/nms/NMSEntity.kt index 94fad92f9..a342f6b4a 100644 --- a/module/bukkit-nms/bukkit-nms-stable/src/main/kotlin/taboolib/module/nms/NMSEntity.kt +++ b/module/bukkit-nms/bukkit-nms-stable/src/main/kotlin/taboolib/module/nms/NMSEntity.kt @@ -89,8 +89,8 @@ class NMSEntityImpl : NMSEntity() { @Suppress("SpellCheckingInspection") override fun getLanguageKey(entity: Entity): MinecraftLanguage.LanguageKey { val key = when (MinecraftVersion.major) { - // region 1.17 .. 1.21 - in MinecraftVersion.V1_17..MinecraftVersion.V1_21 -> { + // region 1.17 .. Latest + in MinecraftVersion.V1_17..Int.MAX_VALUE -> { // 使用 Translatable 接口 if (isTranslatableSupported) { var key = entity.type.translationKey diff --git a/module/bukkit-nms/bukkit-nms-stable/src/main/kotlin/taboolib/module/nms/NMSMessage.kt b/module/bukkit-nms/bukkit-nms-stable/src/main/kotlin/taboolib/module/nms/NMSMessage.kt index b4ee8d059..6d4719711 100644 --- a/module/bukkit-nms/bukkit-nms-stable/src/main/kotlin/taboolib/module/nms/NMSMessage.kt +++ b/module/bukkit-nms/bukkit-nms-stable/src/main/kotlin/taboolib/module/nms/NMSMessage.kt @@ -2,13 +2,19 @@ package taboolib.module.nms import net.md_5.bungee.api.ChatMessageType import net.md_5.bungee.chat.ComponentSerializer +import net.minecraft.network.chat.Component +import net.minecraft.network.chat.IChatBaseComponent +import net.minecraft.server.level.ServerBossEvent import org.bukkit.boss.BossBar +import org.bukkit.craftbukkit.boss.CraftBossBar import org.bukkit.craftbukkit.v1_21_R3.util.CraftChatMessage import org.bukkit.entity.Player import org.tabooproject.reflex.Reflex.Companion.getProperty import org.tabooproject.reflex.Reflex.Companion.setProperty import taboolib.common.UnsupportedVersionException import taboolib.common.util.unsafeLazy +import taboolib.module.nms.remap.DynamicOpcode +import taboolib.module.nms.remap.dynamic /** * 将 Json 信息设置到 [BossBar] 的标题栏 @@ -58,14 +64,21 @@ abstract class NMSMessage { class NMSMessageImpl : NMSMessage() { override fun fromJson(json: String): Any { + if (MinecraftVersion.isUnobfuscated) { + return org.bukkit.craftbukkit.util.CraftChatMessage.fromJSON(json) + } return CraftChatMessage.fromJSON(json) } override fun setRawTitle(bossBar: BossBar, title: String) { // 1.20.5+ if (MinecraftVersion.versionId >= 12005) { - bossBar as CraftBossBar21 - bossBar.handle.setName(CraftChatMessage.fromJSON(title)) + if (MinecraftVersion.isUnobfuscated) { + ((bossBar as CraftBossBar).handle as ServerBossEvent).setName(fromJson(title) as Component) + } else { + bossBar as CraftBossBar21 + bossBar.handle.setName(fromJson(title) as IChatBaseComponent) + } } // 1.16+ // ChatSerializer.a 的返回值由 IChatBaseComponent 变为 IChatMutableComponent @@ -87,11 +100,25 @@ class NMSMessageImpl : NMSMessage() { player.sendPacket(NMSClientboundSetTitlesAnimationPacket(fadein, stay, fadeout)) // 大标题 if (title != null) { - player.sendPacket(NMSClientboundSetTitleTextPacket(CraftChatMessage.fromJSON(title))) + val packet = if (MinecraftVersion.isUnobfuscated) { + dynamic( + DynamicOpcode.INVOKESPECIAL, + "net.minecraft.network.protocol.game.ClientboundSetTitleTextPacket(net.minecraft.network.chat.Component;)V", + fromJson(title) + ) as NMSClientboundSetTitleTextPacket + } else NMSClientboundSetTitleTextPacket(fromJson(title) as IChatBaseComponent) + player.sendPacket(packet) } // 小标题 if (subtitle != null) { - player.sendPacket(NMSClientboundSetSubtitleTextPacket(CraftChatMessage.fromJSON(subtitle))) + val packet = if (MinecraftVersion.isUnobfuscated) { + dynamic( + DynamicOpcode.INVOKESPECIAL, + "net.minecraft.network.protocol.game.ClientboundSetSubtitleTextPacket(net.minecraft.network.chat.Component;)V", + fromJson(subtitle) + ) as NMSClientboundSetSubtitleTextPacket + } else NMSClientboundSetSubtitleTextPacket(fromJson(subtitle) as IChatBaseComponent) + player.sendPacket(packet) } } else { // 时间 diff --git a/module/bukkit-nms/bukkit-nms-stable/src/main/kotlin/taboolib/module/nms/NMSParticle.kt b/module/bukkit-nms/bukkit-nms-stable/src/main/kotlin/taboolib/module/nms/NMSParticle.kt index 34c33ad06..e49b20d8f 100644 --- a/module/bukkit-nms/bukkit-nms-stable/src/main/kotlin/taboolib/module/nms/NMSParticle.kt +++ b/module/bukkit-nms/bukkit-nms-stable/src/main/kotlin/taboolib/module/nms/NMSParticle.kt @@ -1,7 +1,10 @@ package taboolib.module.nms +import net.minecraft.core.particles.ParticleOptions +import net.minecraft.network.protocol.game.ClientboundLevelParticlesPacket import org.bukkit.Location import org.bukkit.Particle +import org.bukkit.craftbukkit.CraftParticle import org.bukkit.util.Vector import taboolib.module.nms.MinecraftVersion.versionId @@ -41,7 +44,9 @@ class NMSParticleImpl : NMSParticle() { error("data should be ${particle.dataType} (${data.javaClass})") } return if (MinecraftVersion.isHigher(MinecraftVersion.V1_12)) { - val param = if (versionId >= 12002) { + val param = if (MinecraftVersion.isUnobfuscated) { + CraftParticle.createParticleParam(particle, data) + } else if (versionId >= 12002) { try { org.bukkit.craftbukkit.v1_21_R3.CraftParticle.createParticleParam(particle, data) } catch (e: NoSuchMethodError) { @@ -50,7 +55,21 @@ class NMSParticleImpl : NMSParticle() { } else { org.bukkit.craftbukkit.v1_16_R1.CraftParticle.toNMS(particle, data) } - if (version > 12101) { + if (MinecraftVersion.isUnobfuscated) { + ClientboundLevelParticlesPacket( + param as ParticleOptions, + true, + true, + location.x, + location.y, + location.z, + offset.x.toFloat(), + offset.y.toFloat(), + offset.z.toFloat(), + speed.toFloat(), + count + ) + } else if (version > 12101) { net.minecraft.network.protocol.game.PacketPlayOutWorldParticles( param as net.minecraft.core.particles.ParticleParam, true, diff --git a/module/bukkit-nms/bukkit-nms-stable/src/main/kotlin/taboolib/module/nms/NMSScoreboard.kt b/module/bukkit-nms/bukkit-nms-stable/src/main/kotlin/taboolib/module/nms/NMSScoreboard.kt index f77b5b98c..a168d391d 100644 --- a/module/bukkit-nms/bukkit-nms-stable/src/main/kotlin/taboolib/module/nms/NMSScoreboard.kt +++ b/module/bukkit-nms/bukkit-nms-stable/src/main/kotlin/taboolib/module/nms/NMSScoreboard.kt @@ -4,17 +4,22 @@ package taboolib.module.nms import net.minecraft.EnumChatFormat import net.minecraft.core.IRegistryCustom +import net.minecraft.network.chat.Component import net.minecraft.network.chat.IChatBaseComponent import net.minecraft.network.chat.numbers.BlankFormat import net.minecraft.network.protocol.game.* import net.minecraft.server.v1_12_R1.ScoreboardScore import net.minecraft.world.scores.DisplaySlot +import net.minecraft.world.scores.Objective +import net.minecraft.world.scores.PlayerTeam import net.minecraft.world.scores.Scoreboard import net.minecraft.world.scores.ScoreboardObjective import net.minecraft.world.scores.ScoreboardTeam import net.minecraft.world.scores.criteria.IScoreboardCriteria +import net.minecraft.world.scores.criteria.ObjectiveCriteria import org.bukkit.Bukkit import org.bukkit.ChatColor +import org.bukkit.craftbukkit.util.CraftChatMessage import org.bukkit.entity.Player import org.bukkit.event.player.PlayerJoinEvent import org.bukkit.event.player.PlayerQuitEvent @@ -192,7 +197,18 @@ class NMSScoreboardImpl : NMSScoreboard() { override fun setupScoreboard(player: Player, color: Boolean, title: String) { val objectiveName = getObjectiveName(player) val score = if (MinecraftVersion.isUniversal) { - if (version >= 12003) { + if (MinecraftVersion.isUnobfuscated) { + Objective( + Scoreboard(), + objectiveName, + ObjectiveCriteria.AIR, + component(title) as Component, + ObjectiveCriteria.RenderType.INTEGER, + true, + BlankFormat.INSTANCE + ) + } + else if (version >= 12003) { ScoreboardObjective( Scoreboard(), objectiveName, @@ -229,7 +245,7 @@ class NMSScoreboardImpl : NMSScoreboard() { ).apply { setProperty("e", title) } } } - player.sendPacket(PacketPlayOutScoreboardObjective(score, 0)) + player.sendPacket(if (MinecraftVersion.isUnobfuscated) ClientboundSetObjectivePacket(score as Objective, 0) else PacketPlayOutScoreboardObjective(score as ScoreboardObjective, 0)) // 初始化颜色 if (color) initTeam(player) } @@ -243,7 +259,18 @@ class NMSScoreboardImpl : NMSScoreboard() { val objectiveName = getObjectiveName(player) if (content.isEmpty()) { val score = if (MinecraftVersion.isUniversal) { - if (version >= 12003) { + if (MinecraftVersion.isUnobfuscated) { + Objective( + Scoreboard(), + objectiveName, + ObjectiveCriteria.AIR, + component("ScoreBoard") as Component, + ObjectiveCriteria.RenderType.INTEGER, + true, + BlankFormat.INSTANCE + ) + } + else if (version >= 12003) { ScoreboardObjective( Scoreboard(), objectiveName, @@ -283,7 +310,7 @@ class NMSScoreboardImpl : NMSScoreboard() { } } // endregion - player.sendPacket(PacketPlayOutScoreboardObjective(score, 1)) + player.sendPacket(if (MinecraftVersion.isUnobfuscated) ClientboundSetObjectivePacket(score as Objective, 1) else PacketPlayOutScoreboardObjective(score as ScoreboardObjective, 1)) return true } val update = content.size != lastContent.size @@ -301,7 +328,21 @@ class NMSScoreboardImpl : NMSScoreboard() { override fun display(player: Player) { val objectiveName = getObjectiveName(player) val packet = if (MinecraftVersion.isUniversal) { - if (version >= 12003) { + if (MinecraftVersion.isUnobfuscated) { + ClientboundSetDisplayObjectivePacket( + DisplaySlot.SIDEBAR, + Objective( + Scoreboard(), + objectiveName, + ObjectiveCriteria.AIR, + Component.empty(), + ObjectiveCriteria.RenderType.INTEGER, + true, + BlankFormat.INSTANCE + ) + ) + } + else if (version >= 12003) { PacketPlayOutScoreboardDisplayObjective( DisplaySlot.SIDEBAR, ScoreboardObjective( Scoreboard(), @@ -355,7 +396,18 @@ class NMSScoreboardImpl : NMSScoreboard() { override fun setDisplayName(player: Player, title: String) { val objectiveName = getObjectiveName(player) val score = if (MinecraftVersion.isUniversal) { - if (version >= 12003) { + if (MinecraftVersion.isUnobfuscated) { + Objective( + Scoreboard(), + objectiveName, + ObjectiveCriteria.AIR, + component(title) as Component, + ObjectiveCriteria.RenderType.INTEGER, + true, + BlankFormat.INSTANCE + ) + } + else if (version >= 12003) { ScoreboardObjective( Scoreboard(), objectiveName, @@ -393,7 +445,11 @@ class NMSScoreboardImpl : NMSScoreboard() { } } // endregion - player.sendPacket(PacketPlayOutScoreboardObjective(score, 2)) + if (MinecraftVersion.isUnobfuscated) { + player.sendPacket(ClientboundSetObjectivePacket(score as Objective, 2)) + } else { + player.sendPacket(PacketPlayOutScoreboardObjective(score as ScoreboardObjective, 2)) + } } /** @@ -418,17 +474,31 @@ class NMSScoreboardImpl : NMSScoreboard() { createTeam(player) } if (MinecraftVersion.isUniversal) { - val team = ScoreboardTeam(Scoreboard(), player.displayName) - // 队伍参数 - team.playerPrefix = component(prefix) as IChatBaseComponent - team.playerSuffix = component(suffix) as IChatBaseComponent - val packet = PacketPlayOutScoreboardTeam::class.java.invokeConstructor( - player.displayName, 2, Optional.of(PacketPlayOutScoreboardTeam.b(team)), listOf() - ) - if (target == null) { - Bukkit.getServer().onlinePlayers.forEach { it.sendPacket(packet) } + if (MinecraftVersion.isUnobfuscated) { + val team = PlayerTeam(Scoreboard(), player.displayName) + // 队伍参数 + team.playerPrefix = component(prefix) as Component + team.playerSuffix = component(suffix) as Component + val packet = ClientboundSetPlayerTeamPacket::class.java.invokeConstructor(player.displayName, 2, Optional.of( + ClientboundSetPlayerTeamPacket.Parameters(team)), listOf()) + if (target == null) { + Bukkit.getServer().onlinePlayers.forEach { it.sendPacket(packet) } + } else { + player.sendPacket(packet) + } } else { - player.sendPacket(packet) + val team = ScoreboardTeam(Scoreboard(), player.displayName) + // 队伍参数 + team.playerPrefix = component(prefix) as IChatBaseComponent + team.playerSuffix = component(suffix) as IChatBaseComponent + val packet = PacketPlayOutScoreboardTeam::class.java.invokeConstructor( + player.displayName, 2, Optional.of(PacketPlayOutScoreboardTeam.b(team)), listOf() + ) + if (target == null) { + Bukkit.getServer().onlinePlayers.forEach { it.sendPacket(packet) } + } else { + player.sendPacket(packet) + } } return } @@ -465,14 +535,22 @@ class NMSScoreboardImpl : NMSScoreboard() { if (require(net.minecraft.server.v1_16_R3.IChatBaseComponent.ChatSerializer::class.java)) { jsonComponentImpl()(text) } else { - org.bukkit.craftbukkit.v1_21_R3.util.CraftChatMessage.fromJSON(text) + if (MinecraftVersion.isUnobfuscated) { + CraftChatMessage.fromJSON(text) + } else { + org.bukkit.craftbukkit.v1_21_R3.util.CraftChatMessage.fromJSON(text) + } } } else { - net.minecraft.server.v1_16_R3.IChatBaseComponent::class.java.invokeMethod( - "literal", - text, - isStatic = true - )!! + if (MinecraftVersion.isUnobfuscated) { + Component.literal(text) + } else { + net.minecraft.server.v1_16_R3.IChatBaseComponent::class.java.invokeMethod( + "literal", + text, + isStatic = true + )!! + } } } @@ -504,12 +582,21 @@ class NMSScoreboardImpl : NMSScoreboard() { uniqueOwner.forEach { color -> if (MinecraftVersion.isUniversal) { // 队伍参数 - val team = ScoreboardTeam(Scoreboard(), color) - player.sendPacket( - PacketPlayOutScoreboardTeam::class.java.invokeConstructor( - color, 0, Optional.of(PacketPlayOutScoreboardTeam.b(team)), listOf(color) + if (MinecraftVersion.isUnobfuscated) { + val team = PlayerTeam(Scoreboard(), color) + player.sendPacket( + ClientboundSetPlayerTeamPacket::class.java.invokeConstructor( + color, 0, Optional.of(ClientboundSetPlayerTeamPacket.Parameters(team)), listOf(color) + ) ) - ) + } else { + val team = ScoreboardTeam(Scoreboard(), color) + player.sendPacket( + PacketPlayOutScoreboardTeam::class.java.invokeConstructor( + color, 0, Optional.of(PacketPlayOutScoreboardTeam.b(team)), listOf(color) + ) + ) + } return@forEach } // region Legacy Version @@ -525,12 +612,21 @@ class NMSScoreboardImpl : NMSScoreboard() { private fun createTeam(player: Player) { if (MinecraftVersion.isUniversal) { // 队伍参数 - val packet = PacketPlayOutScoreboardTeam::class.java.invokeConstructor( - player.displayName, - 0, - Optional.of(PacketPlayOutScoreboardTeam.b(ScoreboardTeam(Scoreboard(), player.displayName))), - listOf(player.name) - ) + val packet = if (MinecraftVersion.isUnobfuscated) { + ClientboundSetPlayerTeamPacket::class.java.invokeConstructor( + player.displayName, + 0, + Optional.of(ClientboundSetPlayerTeamPacket.Parameters(PlayerTeam(Scoreboard(), player.displayName))), + listOf(player.name) + ) + } else { + PacketPlayOutScoreboardTeam::class.java.invokeConstructor( + player.displayName, + 0, + Optional.of(PacketPlayOutScoreboardTeam.b(ScoreboardTeam(Scoreboard(), player.displayName))), + listOf(player.name) + ) + } Bukkit.getServer().onlinePlayers.forEach { it.sendPacket(packet) } return } @@ -558,6 +654,20 @@ class NMSScoreboardImpl : NMSScoreboard() { * @param team 为\[content.size - line - 1\] */ private fun sendTeamPrefixSuffix(player: Player, team: String, content: String) { + if (MinecraftVersion.isUnobfuscated) { + val t = PlayerTeam(Scoreboard(), team) + t.playerPrefix = component(content) as Component + player.sendPacket( + ClientboundSetPlayerTeamPacket::class.java.invokeConstructor( + team, + 2, + Optional.of(ClientboundSetPlayerTeamPacket.Parameters(t)), + listOf(team) + ) + ) + return + } + // 1.17+ if (MinecraftVersion.major >= 9) { val t = ScoreboardTeam(Scoreboard(), team) t.playerPrefix = component(content) as IChatBaseComponent @@ -609,6 +719,14 @@ class NMSScoreboardImpl : NMSScoreboard() { // 行数变多了,新增行 if (validateLineCount(line) > lastLineCount) { (lastLineCount until line).forEach { i -> + if (MinecraftVersion.isUnobfuscated) { + player.sendPacket( + ClientboundSetScorePacket( + uniqueOwner[i], objectiveName, i, Optional.empty(), Optional.empty() + ) + ) + return@forEach + } // 1.20.5 后两个参数改为 Optional // String owner, String objectiveName, int score, Optional display, Optional numberFormat if (MinecraftVersion.versionId >= 12005) { diff --git a/module/bukkit-nms/bukkit-nms-stable/src/main/kotlin/taboolib/module/nms/NMSSign.kt b/module/bukkit-nms/bukkit-nms-stable/src/main/kotlin/taboolib/module/nms/NMSSign.kt index e2c545245..22eef30e8 100644 --- a/module/bukkit-nms/bukkit-nms-stable/src/main/kotlin/taboolib/module/nms/NMSSign.kt +++ b/module/bukkit-nms/bukkit-nms-stable/src/main/kotlin/taboolib/module/nms/NMSSign.kt @@ -1,5 +1,7 @@ package taboolib.module.nms +import net.minecraft.core.BlockPos +import net.minecraft.network.protocol.game.ClientboundOpenSignEditorPacket import org.bukkit.Material import org.bukkit.block.Block import org.bukkit.entity.Player @@ -104,12 +106,18 @@ class NMSSignImpl : NMSSign() { } override fun openSignEditor(player: Player, block: Block) { - val blockPosition = net.minecraft.server.v1_12_R1.BlockPosition(block.x, block.y, block.z) + val blockPosition = if (MinecraftVersion.isUnobfuscated) { + BlockPos(block.x, block.y, block.z) + } else { + net.minecraft.server.v1_12_R1.BlockPosition(block.x, block.y, block.z) + } // 1.20 -> 正反牌子 - if (MinecraftVersion.isHigherOrEqual(MinecraftVersion.V1_20)) { + if (MinecraftVersion.isUnobfuscated) { + player.sendPacket(ClientboundOpenSignEditorPacket(blockPosition as BlockPos, true)) + } else if (MinecraftVersion.isHigherOrEqual(MinecraftVersion.V1_20)) { player.sendPacket(constructorPacketOutSignEditor.newInstance(blockPosition, true)) } else { - player.sendPacket(net.minecraft.server.v1_12_R1.PacketPlayOutOpenSignEditor(blockPosition)) + player.sendPacket(net.minecraft.server.v1_12_R1.PacketPlayOutOpenSignEditor(blockPosition as net.minecraft.server.v1_12_R1.BlockPosition)) } } } @@ -130,7 +138,7 @@ private object NMSSignListener { @SubscribeEvent fun onReceive(e: PacketReceiveEvent) { - if (e.packet.nameInSpigot == "PacketPlayInUpdateSign" && callback.containsKey(e.player.name)) { + if ((e.packet.name == "PacketPlayInUpdateSign" || e.packet.name == "ServerboundSignUpdatePacket") && callback.containsKey(e.player.name)) { val function = callback.remove(e.player.name) ?: return val lines = when { MinecraftVersion.isHigherOrEqual(MinecraftVersion.V1_17) -> e.packet.read>("lines")!! diff --git a/module/bukkit-nms/bukkit-nms-stable/src/main/kotlin/taboolib/module/nms/NMSTranslate.kt b/module/bukkit-nms/bukkit-nms-stable/src/main/kotlin/taboolib/module/nms/NMSTranslate.kt index 0dd14ce68..0f0157bff 100644 --- a/module/bukkit-nms/bukkit-nms-stable/src/main/kotlin/taboolib/module/nms/NMSTranslate.kt +++ b/module/bukkit-nms/bukkit-nms-stable/src/main/kotlin/taboolib/module/nms/NMSTranslate.kt @@ -171,22 +171,22 @@ class NMSTranslateImpl : NMSTranslate() { * 用于获取物品的语言文件名称的方法 * 限定名称; 参数只有一个; 参数类型是 [net.minecraft.server] 包下的 ItemStack; 返回值是 String */ - val itemLocaleNameMethod: Method? = net.minecraft.server.v1_12_R1.Item::class.java.declaredMethods.find { - checkName0(it.name) && it.parameterTypes.size == 1 && it.parameterTypes[0] == net.minecraft.server.v1_12_R1.ItemStack::class.java && it.returnType == String::class.java + val itemLocaleNameMethod: Method? = nmsClass("world.item.Item").declaredMethods.find { + checkName0(it.name) && it.parameterTypes.size == 1 && it.parameterTypes[0] == nmsClass("world.item.ItemStack") && it.returnType == String::class.java } /** * 用于获取物品的语言文件节点的方法 * 限定名称; 参数只有一个; 参数类型是 [net.minecraft.server] 包下的 ItemStack; 返回值是 String */ - val itemLocaleKeyMethod: Method? = net.minecraft.server.v1_12_R1.Item::class.java.declaredMethods.find { - checkName1(it.name) && it.parameterTypes.size == 1 && it.parameterTypes[0] == net.minecraft.server.v1_12_R1.ItemStack::class.java && it.returnType == String::class.java + val itemLocaleKeyMethod: Method? = nmsClass("world.item.Item").declaredMethods.find { + checkName1(it.name) && it.parameterTypes.size == 1 && it.parameterTypes[0] == nmsClass("world.item.ItemStack") && it.returnType == String::class.java } /** * 1.19.3, 1.20 -> BuiltInRegistries.MOB_EFFECT */ - val mobEffectBuiltInRegistries by unsafeLazy { nmsClass("BuiltInRegistries").getProperty("MOB_EFFECT", isStatic = true)!! } + val mobEffectBuiltInRegistries by unsafeLazy { nmsClass("core.registries.BuiltInRegistries").getProperty("MOB_EFFECT", isStatic = true)!! } /** * 1.17, 1.19.2 -> IRegistry.MOB_EFFECT diff --git a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslationUnobfsucated.kt b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslationUnobfsucated.kt index 24968da36..0a71ef6c9 100644 --- a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslationUnobfsucated.kt +++ b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslationUnobfsucated.kt @@ -1,5 +1,7 @@ package taboolib.module.nms.remap +import taboolib.module.nms.MinecraftVersion + /** * TabooLib * taboolib.module.nms.remap.RemapTranslationUnobfsucated @@ -9,8 +11,13 @@ package taboolib.module.nms.remap */ class RemapTranslationUnobfuscated : RemapTranslation() { - override fun map(internalName: String): String { - // 非混淆版本服务端不进行任何转译 - return internalName + override fun translate(key: String): String { + // obc + // 非混淆服务端,只能处理 obc 的版本号了 + if (key.startsWith("org/bukkit/craftbukkit")) { + // 若当前使用 Universal CraftBukkit 环境,则移除版本号 + return key.replace(obc1, if (MinecraftVersion.isMojangMapping) obc3 else obc2) + } + return key } } \ No newline at end of file From 2a16dbc968dcc53a2ee9e52d4a7b117534ea6b3f Mon Sep 17 00:00:00 2001 From: Micalhl Date: Wed, 1 Apr 2026 20:08:26 +0800 Subject: [PATCH 08/13] =?UTF-8?q?module-nms=20=E6=A8=A1=E5=9D=97=E5=85=A8?= =?UTF-8?q?=E9=83=A8=E9=80=9A=E8=BF=87=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nms-data-serializer-12005/build.gradle.kts | 2 +- .../taboolib/module/nms/DataSerializerFactory12005.kt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/module/bukkit-nms/bukkit-nms-data-serializer/nms-data-serializer-12005/build.gradle.kts b/module/bukkit-nms/bukkit-nms-data-serializer/nms-data-serializer-12005/build.gradle.kts index 47f963788..d20971e34 100644 --- a/module/bukkit-nms/bukkit-nms-data-serializer/nms-data-serializer-12005/build.gradle.kts +++ b/module/bukkit-nms/bukkit-nms-data-serializer/nms-data-serializer-12005/build.gradle.kts @@ -5,7 +5,7 @@ dependencies { compileOnly(project(":module:bukkit-nms")) compileOnly(project(":module:bukkit-nms:bukkit-nms-data-serializer")) // 服务端 - compileOnly("ink.ptms.core:v12104:12104:mapped") + compileOnly("paper:v12111:12111:core") // DataSerializer compileOnly("io.netty:netty-all:4.1.73.Final") } diff --git a/module/bukkit-nms/bukkit-nms-data-serializer/nms-data-serializer-12005/src/main/kotlin/taboolib/module/nms/DataSerializerFactory12005.kt b/module/bukkit-nms/bukkit-nms-data-serializer/nms-data-serializer-12005/src/main/kotlin/taboolib/module/nms/DataSerializerFactory12005.kt index 46f737d97..c6f9e19f2 100644 --- a/module/bukkit-nms/bukkit-nms-data-serializer/nms-data-serializer-12005/src/main/kotlin/taboolib/module/nms/DataSerializerFactory12005.kt +++ b/module/bukkit-nms/bukkit-nms-data-serializer/nms-data-serializer-12005/src/main/kotlin/taboolib/module/nms/DataSerializerFactory12005.kt @@ -2,10 +2,10 @@ package taboolib.module.nms import io.netty.buffer.ByteBufOutputStream import io.netty.buffer.Unpooled -import net.minecraft.core.IRegistryCustom +import net.minecraft.core.RegistryAccess import net.minecraft.network.RegistryFriendlyByteBuf import net.minecraft.network.chat.ComponentSerialization -import org.bukkit.craftbukkit.v1_21_R3.util.CraftChatMessage +import org.bukkit.craftbukkit.util.CraftChatMessage import java.io.DataOutput /** @@ -17,7 +17,7 @@ import java.io.DataOutput */ class DataSerializerFactory12005 : DataSerializerFactory, DataSerializer { - val buf: RegistryFriendlyByteBuf = RegistryFriendlyByteBuf(Unpooled.buffer(), IRegistryCustom.EMPTY) + val buf: RegistryFriendlyByteBuf = RegistryFriendlyByteBuf(Unpooled.buffer(), RegistryAccess.EMPTY) override fun writeByte(byte: Byte): DataSerializer { return buf.writeByte(byte.toInt()).let { this } From ee8e8695054120ebfb4648863543a2c56022439a Mon Sep 17 00:00:00 2001 From: Micalhl Date: Wed, 1 Apr 2026 23:19:26 +0800 Subject: [PATCH 09/13] =?UTF-8?q?navigation=20=E5=AF=BB=E8=B7=AF=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E9=80=9A=E8=BF=87=E7=BC=96=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/bukkit-navigation/build.gradle.kts | 1 + .../taboolib/module/navigation/NMSImpl.kt | 32 ++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/module/bukkit/bukkit-navigation/build.gradle.kts b/module/bukkit/bukkit-navigation/build.gradle.kts index 265f88eb3..1dc78a18b 100644 --- a/module/bukkit/bukkit-navigation/build.gradle.kts +++ b/module/bukkit/bukkit-navigation/build.gradle.kts @@ -8,4 +8,5 @@ dependencies { compileOnly("ink.ptms.core:v11100:11100") compileOnly("ink.ptms.core:v10900:10900") compileOnly("ink.ptms:nms-all:1.0.0") + compileOnly("paper:v12111:12111:core") } \ No newline at end of file diff --git a/module/bukkit/bukkit-navigation/src/main/kotlin/taboolib/module/navigation/NMSImpl.kt b/module/bukkit/bukkit-navigation/src/main/kotlin/taboolib/module/navigation/NMSImpl.kt index 0b901e931..8ca4ea4ac 100644 --- a/module/bukkit/bukkit-navigation/src/main/kotlin/taboolib/module/navigation/NMSImpl.kt +++ b/module/bukkit/bukkit-navigation/src/main/kotlin/taboolib/module/navigation/NMSImpl.kt @@ -1,8 +1,11 @@ package taboolib.module.navigation +import net.minecraft.core.BlockPos import net.minecraft.server.v1_12_R1.BlockDoor import net.minecraft.server.v1_12_R1.BlockPosition import net.minecraft.server.v1_12_R1.BlockTrapdoor +import net.minecraft.world.level.block.DoorBlock +import net.minecraft.world.level.block.TrapDoorBlock import net.minecraft.world.level.block.state.IBlockData import org.bukkit.block.Block import org.bukkit.craftbukkit.v1_12_R1.CraftWorld @@ -12,6 +15,8 @@ import org.tabooproject.reflex.Reflex.Companion.getProperty import org.tabooproject.reflex.Reflex.Companion.invokeMethod import taboolib.module.nms.MinecraftVersion import taboolib.module.nms.MinecraftVersion.isHigherOrEqual +import taboolib.module.nms.remap.DynamicOpcode +import taboolib.module.nms.remap.dynamic /** * Navigation @@ -24,6 +29,7 @@ import taboolib.module.nms.MinecraftVersion.isHigherOrEqual class NMSImpl : NMS() { val version = MinecraftVersion.major + val isUnobfuscated = MinecraftVersion.isUnobfuscated val majorLegacy = MinecraftVersion.versionId override fun getBoundingBox(entity: Entity): BoundingBox { @@ -98,6 +104,9 @@ class NMSImpl : NMS() { } override fun isDoorOpened(block: Block): Boolean { return when { + isUnobfuscated -> { + isDoorOpen(block, false) + } // 1.18 起函数名发生变动: getType -> getBlockState isHigherOrEqual(MinecraftVersion.V1_18) -> { (block.world as org.bukkit.craftbukkit.v1_21_R1.CraftWorld).handle @@ -123,7 +132,28 @@ class NMSImpl : NMS() { } override fun isTrapdoorOpen(block: Block): Boolean { - return (block.world as CraftWorld).handle.getType(BlockPosition(block.x, block.y, block.z)).get(BlockTrapdoor.OPEN) + return if (isUnobfuscated) { + isDoorOpen(block, true) + } else { + (block.world as CraftWorld).handle.getType(BlockPosition(block.x, block.y, block.z)).get(BlockTrapdoor.OPEN) + } + } + + private fun isDoorOpen(block: Block, isTrapdoor: Boolean): Boolean { + val handle = (block.world as org.bukkit.craftbukkit.CraftWorld).handle + val blockState = dynamic( + DynamicOpcode.INVOKEVIRTUAL, + "net.minecraft.world.level.BlockGetter#getBlockState(net.minecraft.core.BlockPos;)net.minecraft.world.level.block.state.BlockState;", + handle, + BlockPos(block.x, block.y, block.z) + ) + val value = dynamic( + DynamicOpcode.INVOKEVIRTUAL, + "net.minecraft.world.level.block.state.StateHolder#getValue(net.minecraft.world.level.block.state.properties.Property;)java.lang.Object;", + blockState, + if (isTrapdoor) TrapDoorBlock.OPEN else DoorBlock.OPEN + ) + return value as Boolean } @Suppress("DEPRECATION") From 6e6376bb066d6b1929c185fbed03249de02437ab Mon Sep 17 00:00:00 2001 From: Micalhl Date: Thu, 2 Apr 2026 00:35:53 +0800 Subject: [PATCH 10/13] =?UTF-8?q?=E5=88=86=E7=A6=BB=20isUniversalCraftBukk?= =?UTF-8?q?it=20=E5=92=8C=20isMojangMapping=EF=BC=8C=E5=9C=A8=20Paper/Spig?= =?UTF-8?q?ot=201.19.4=E3=80=811.20.4=E3=80=811.21.11=E3=80=8126.1=20?= =?UTF-8?q?=E4=B8=8A=E6=B5=8B=E8=AF=95=E9=80=9A=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../taboolib/module/nms/MeteorInjector.java | 12 ++++++++++-- .../taboolib/module/nms/MeteorReflection.java | 19 ++++++++++++++----- .../module/nms/AsmClassTranslation.kt | 7 ++++--- .../module/nms/MinecraftServerUtil.kt | 2 +- .../taboolib/module/nms/MinecraftVersion.kt | 12 +++++++----- .../module/nms/remap/RemapTranslation.kt | 19 ++++++++++++++----- .../nms/remap/RemapTranslationUnobfsucated.kt | 2 +- module/bukkit/bukkit-fake-op/build.gradle.kts | 1 + .../taboolib/expansion/PlayerFakeOpNMSImpl.kt | 5 ++--- 9 files changed, 54 insertions(+), 25 deletions(-) diff --git a/module/bukkit-nms/src/main/java/taboolib/module/nms/MeteorInjector.java b/module/bukkit-nms/src/main/java/taboolib/module/nms/MeteorInjector.java index 85c074c91..f4283e6c2 100644 --- a/module/bukkit-nms/src/main/java/taboolib/module/nms/MeteorInjector.java +++ b/module/bukkit-nms/src/main/java/taboolib/module/nms/MeteorInjector.java @@ -34,11 +34,11 @@ public class MeteorInjector implements Closeable { private static final Class SERVER_CLASS = getNMSClass("MinecraftServer", "server", "MinecraftServer", "server"); private static final Class SERVER_CONNECTION_CLASS = getNMSClass("ServerConnection", "server.network", "ServerConnectionListener", "server.network"); - private static final Class PACKET_LOGIN_OUT_SUCCESS_CLASS = getNMSClass("PacketLoginOutSuccess", "network.protocol.login", "ClientboundLoginFinishedPacket", "network.protocol.login"); + private static Class PACKET_LOGIN_OUT_SUCCESS_CLASS; private static final Field NMS_SERVER = getField(getCBClass("CraftServer"), SERVER_CLASS, 1); private static final Field NMS_SERVER_CONNECTION = getField(SERVER_CLASS, SERVER_CONNECTION_CLASS, 1); - private static final Field GAME_PROFILE_FROM_PACKET = getField(PACKET_LOGIN_OUT_SUCCESS_CLASS, GameProfile.class, 1); + private static Field GAME_PROFILE_FROM_PACKET; private static final Field CHANNELS_LIST = getField(SERVER_CONNECTION_CLASS, List.class, 1); private static final Method GAME_PROFILE_ID = getMethod(GameProfile.class, MinecraftVersion.INSTANCE.getVersionId() > 12108 ? "id" : "getId"); @@ -72,6 +72,14 @@ public MeteorInjector(@NotNull Plugin plugin) { Object conn; try { + // PacketLoginOutSuccess, ClientboundLoginFinishedPacket, ClientboundGameProfilePacket + try { + PACKET_LOGIN_OUT_SUCCESS_CLASS = getNMSClass("PacketLoginOutSuccess", "network.protocol.login", "ClientboundLoginFinishedPacket", "network.protocol.login"); + } catch (Throwable ignored) { + PACKET_LOGIN_OUT_SUCCESS_CLASS = getNMSClass("PacketLoginOutSuccess", "network.protocol.login", "ClientboundGameProfilePacket", "network.protocol.login"); + } + GAME_PROFILE_FROM_PACKET = getField(PACKET_LOGIN_OUT_SUCCESS_CLASS, GameProfile.class, 1); + conn = NMS_SERVER_CONNECTION.get(NMS_SERVER.get(Bukkit.getServer())); channels = (List) CHANNELS_LIST.get(conn); } catch (ReflectiveOperationException exception) { diff --git a/module/bukkit-nms/src/main/java/taboolib/module/nms/MeteorReflection.java b/module/bukkit-nms/src/main/java/taboolib/module/nms/MeteorReflection.java index 2b852cce7..8538db6b2 100644 --- a/module/bukkit-nms/src/main/java/taboolib/module/nms/MeteorReflection.java +++ b/module/bukkit-nms/src/main/java/taboolib/module/nms/MeteorReflection.java @@ -23,10 +23,16 @@ public class MeteorReflection { private static Class paperReflectionHolder; private static Method forName; - private static boolean isMojangMapping = true; - private static String minecraftVersion; + private static String minecraftVersion = "UNKNOWN"; + + private static boolean isMojangMapping = false; static { + try { + Class.forName("net.minecraft.core.MappedRegistry"); + isMojangMapping = true; + } catch (Throwable ignored) { + } try { paperReflectionHolder = (Class>) Class.forName(PAPER_REFLECTION_HOLDER); forName = paperReflectionHolder.getDeclaredMethod("forName", String.class, boolean.class, ClassLoader.class); @@ -36,11 +42,14 @@ public class MeteorReflection { // 简单判断 final String obcPackage = Bukkit.getServer().getClass().getName(); if (obcPackage.startsWith("org.bukkit.craftbukkit.v1_")) { - isMojangMapping = false; - minecraftVersion = isMojangMapping ? "UNKNOWN" : obcPackage.split("\\.")[3]; + minecraftVersion = obcPackage.split("\\.")[3]; } } + public static boolean isMojangMapping() { + return isMojangMapping; + } + /** * 由 "extra.properties" 启动,依赖加载后迅速接管 TabooLib 类查找器 */ @@ -93,7 +102,7 @@ public static Class forName(String name, boolean initialize, ClassLoader load */ if (!isMojangMapping) { // 为不带版本的 obc 包名添加版本号 - if (name.startsWith("org.bukkit.craftbukkit") && !name.startsWith("org.bukkit.craftbukkit.v1")) { + if (minecraftVersion != "UNKNOWN" && name.startsWith("org.bukkit.craftbukkit") && !name.startsWith("org.bukkit.craftbukkit.v1")) { name = name.replace("org.bukkit.craftbukkit.", "org.bukkit.craftbukkit." + minecraftVersion); } // 处理 nms 类 diff --git a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/AsmClassTranslation.kt b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/AsmClassTranslation.kt index 4145d7650..174b22350 100644 --- a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/AsmClassTranslation.kt +++ b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/AsmClassTranslation.kt @@ -70,7 +70,7 @@ class AsmClassTranslation(val source: String) { // 若当前运行环境为非混淆服务端,则不应该进行除 dynamic、requires 外的任何转译操作 val remapper = if (MinecraftVersion.isUnobfuscated) { RemapTranslationUnobfuscated() - } else if (MinecraftVersion.isMojangMapping) { + } else if (MinecraftVersion.isUniversalCraftBukkit) { // 若当前运行环境为 Paper 时使用新版转换器 // 若转译对象为 TabooLib 类,需要特殊处理 if (source.startsWith(taboolibPath)) RemapTranslationTabooLib() else RemapTranslation() @@ -103,8 +103,9 @@ class AsmClassTranslation(val source: String) { val mcRunningVersion = MinecraftVersion.runningVersion val mcNmsVersion = MinecraftVersion.minecraftVersion val isUniversal = MinecraftVersion.isUniversal - val isUniversalCB = MinecraftVersion.isMojangMapping + val isUniversalCB = MinecraftVersion.isUniversalCraftBukkit + val isMojangMapping = MinecraftVersion.isMojangMapping val isUnobfuscated = MinecraftVersion.isUnobfuscated - return "mcRunning:$mcRunningVersion-nms:$mcNmsVersion-universal:$isUniversal-universalCB:$isUniversalCB-isUnobfuscated:$isUnobfuscated" + return "mcRunning:$mcRunningVersion-nms:$mcNmsVersion-universal:$isUniversal-universalCB:$isUniversalCB-mojangMapping:$isMojangMapping-unobfuscated:$isUnobfuscated" } } \ No newline at end of file diff --git a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/MinecraftServerUtil.kt b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/MinecraftServerUtil.kt index 8efc142df..c447306fd 100644 --- a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/MinecraftServerUtil.kt +++ b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/MinecraftServerUtil.kt @@ -48,7 +48,7 @@ val minecraftServerObject: Any by unsafeLazy { * 获取 OBC 类 */ fun obcClass(name: String): Class<*> { - return if (MinecraftVersion.isMojangMapping) { + return if (MinecraftVersion.isUniversalCraftBukkit) { ClassHelper.getClass("org.bukkit.craftbukkit.$name") } else { ClassHelper.getClass("org.bukkit.craftbukkit.${MinecraftVersion.minecraftVersion}.$name") diff --git a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/MinecraftVersion.kt b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/MinecraftVersion.kt index 20d14029d..c42d7036b 100644 --- a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/MinecraftVersion.kt +++ b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/MinecraftVersion.kt @@ -58,14 +58,16 @@ object MinecraftVersion { } /** - * 是否为非混淆版本或 mojang mapping 版本(一般表现为 Paper 1.20.6+ 环境) + * 是否为非混淆版本或 mojang mapping 版本 */ val isMojangMapping: Boolean - get() = minecraftVersion == "UNKNOWN" || isUnobfuscated + get() = MeteorReflection.isMojangMapping() || isUnobfuscated - @Deprecated("Use isMojangMapping instead.", ReplaceWith("isMojangMapping")) + /** + * 是否为 universal craftbukkit 版本(一般表现为 Paper 1.20.6+ 环境) + */ val isUniversalCraftBukkit: Boolean - get() = isMojangMapping + get() = minecraftVersion == "UNKNOWN" /** * 是否为 CatServer @@ -358,7 +360,7 @@ object MinecraftVersion { // 在 Bukkit 平台下,注册 Reflex 重定向实现 // 如果是非混淆服务端(26.1+),则不注册 if (runningPlatform == Platform.BUKKIT && !isUnobfuscated) { - Reflex.remapper.add(if (isMojangMapping) RemapReflexPaper() else RemapReflexSpigot()) + Reflex.remapper.add(if (isUniversalCraftBukkit) RemapReflexPaper() else RemapReflexSpigot()) } } } \ No newline at end of file diff --git a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslation.kt b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslation.kt index d147c896b..aef7a3aa0 100644 --- a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslation.kt +++ b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslation.kt @@ -39,8 +39,17 @@ open class RemapTranslation : Remapper() { open fun translate(key: String): String { // obc if (key.startsWith("org/bukkit/craftbukkit")) { - // 若当前使用 Universal CraftBukkit 环境,则移除版本号 - return key.replace(obc1, if (MinecraftVersion.isMojangMapping) obc3 else obc2) + // 如果是 Universal CraftBukkit,则必须去除版本号 + if (MinecraftVersion.isUniversalCraftBukkit) { + return key.replace(obc1, obc3) + } + // 若非 Universal CraftBukkit 环境,则判断是否有版本号 + // 如果没有版本号,则补上版本号 + if (!key.startsWith("org/bukkit/craftbukkit/v1_")) { + return key.replace(obc3, obc2) + } + // 如果有版本号,则替换版本号为当前正在运行的版本 + return key.replace(obc1, obc2) } // 统一版本 return if (MinecraftVersion.isUniversal) { @@ -49,15 +58,15 @@ open class RemapTranslation : Remapper() { if (key.startsWith("net/minecraft/server/v1_")) { // 先转为 Spigot.FullName var spigotName = MinecraftVersion.spigotMapping.classMapSpigotS2F[key.substringAfterLast('/')] ?: return key - // 如果为 Universal CraftBukkit 环境, 则应进一步转译为 Mojang.FullName + // 如果为 Mojang Mapping 环境, 则应进一步转译为 Mojang.FullName spigotName = if (MinecraftVersion.isMojangMapping) MinecraftVersion.paperMapping.classMapSpigotToMojang[spigotName] ?: spigotName else spigotName spigotName.replace('.', '/') } else { - // 如果是非 Universal CraftBukkit 环境,且这里是 Mojang.Fullname,则:尝试获取 Spigot.Fullname 并返回,如果获取不到,那么 key 就是 Spigot.Fullname 本身 + // 如果是非 Mojang Mapping 环境,且这里是 Mojang.Fullname,则:尝试获取 Spigot.Fullname 并返回,如果获取不到,那么 key 就是 Spigot.Fullname 本身 if (!MinecraftVersion.isMojangMapping) { MinecraftVersion.paperMapping.classMapMojangToSpigot[key.replace('/', '.')]?.replace('.', '/') ?: key } else { - // 如果为 Universal CraftBukkit 环境,这里不管是 Spigot.Fullname 还是 Mojang.Fullname 都不需要动 + // 如果为 Mojang Mapping 环境,这里不管是 Spigot.Fullname 还是 Mojang.Fullname 都不需要动 // 如果是 Spigot.Fullname,Paper PluginRemapper 会进行转译 key } diff --git a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslationUnobfsucated.kt b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslationUnobfsucated.kt index 0a71ef6c9..f0c87c376 100644 --- a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslationUnobfsucated.kt +++ b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslationUnobfsucated.kt @@ -16,7 +16,7 @@ class RemapTranslationUnobfuscated : RemapTranslation() { // 非混淆服务端,只能处理 obc 的版本号了 if (key.startsWith("org/bukkit/craftbukkit")) { // 若当前使用 Universal CraftBukkit 环境,则移除版本号 - return key.replace(obc1, if (MinecraftVersion.isMojangMapping) obc3 else obc2) + return key.replace(obc1, if (MinecraftVersion.isUniversalCraftBukkit) obc3 else obc2) } return key } diff --git a/module/bukkit/bukkit-fake-op/build.gradle.kts b/module/bukkit/bukkit-fake-op/build.gradle.kts index 94fa593ee..6b9bd559f 100644 --- a/module/bukkit/bukkit-fake-op/build.gradle.kts +++ b/module/bukkit/bukkit-fake-op/build.gradle.kts @@ -5,6 +5,7 @@ dependencies { compileOnly(project(":common-env")) compileOnly(project(":common-util")) compileOnly(project(":module:bukkit-nms")) + compileOnly("paper:v12111:12111:core") compileOnly("ink.ptms.core:v11701:11701-minimize:universal") compileOnly("net.bytebuddy:byte-buddy:1.14.9") } diff --git a/module/bukkit/bukkit-fake-op/src/main/kotlin/taboolib/expansion/PlayerFakeOpNMSImpl.kt b/module/bukkit/bukkit-fake-op/src/main/kotlin/taboolib/expansion/PlayerFakeOpNMSImpl.kt index 7ca355a9e..d6949d41e 100644 --- a/module/bukkit/bukkit-fake-op/src/main/kotlin/taboolib/expansion/PlayerFakeOpNMSImpl.kt +++ b/module/bukkit/bukkit-fake-op/src/main/kotlin/taboolib/expansion/PlayerFakeOpNMSImpl.kt @@ -11,10 +11,9 @@ import net.bytebuddy.implementation.bind.annotation.FieldValue import net.bytebuddy.implementation.bind.annotation.Pipe import net.bytebuddy.implementation.bind.annotation.RuntimeType import net.bytebuddy.matcher.ElementMatchers -import net.minecraft.server.level.EntityPlayer -import org.bukkit.craftbukkit.v1_17_R1.CraftServer -import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer import org.bukkit.Bukkit +import org.bukkit.craftbukkit.CraftServer +import org.bukkit.craftbukkit.entity.CraftPlayer import org.bukkit.entity.Player import org.bukkit.permissions.Permission import taboolib.common.util.unsafeLazy From 5e9c76b134270563cb9995e3f7ace6df6b370a59 Mon Sep 17 00:00:00 2001 From: Micalhl Date: Thu, 2 Apr 2026 10:59:26 +0800 Subject: [PATCH 11/13] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E7=AB=AF=E4=BE=9D=E8=B5=96=EF=BC=8C=E6=9B=B4=E6=96=B0=20server?= =?UTF-8?q?gen=20=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .tools/servergen.jar | Bin 1714474 -> 1702185 bytes .../bukkit-nms/bukkit-nms-ai/build.gradle.kts | 4 ++-- .../build.gradle.kts | 2 +- .../bukkit-nms-stable/build.gradle.kts | 2 +- .../bukkit-nms-tag-modern/build.gradle.kts | 2 +- module/bukkit/bukkit-fake-op/build.gradle.kts | 2 +- .../bukkit/bukkit-navigation/build.gradle.kts | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.tools/servergen.jar b/.tools/servergen.jar index 7f8e8830500e2252e273694766c4c5e490978343..4939fcd57532627fd482f4b2822f54f667fa21e1 100644 GIT binary patch delta 190179 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%0DpkNz4MMI%CcsD$OFc7_FwMM;X@X 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%0DTQ% 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 Cgjr1h delta 202752 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 Date: Wed, 8 Apr 2026 12:22:31 +0800 Subject: [PATCH 12/13] =?UTF-8?q?=E6=94=AF=E6=8C=81=2026.1.1=EF=BC=8C?= =?UTF-8?q?=E5=8D=87=E7=BA=A7=E8=99=9A=E6=8B=9F=E7=95=8C=E9=9D=A2=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=EF=BC=8C=E5=B9=B6=E4=BF=AE=E5=A4=8D=E4=B8=8E=20tb=206?= =?UTF-8?q?.2=20=E6=8F=92=E4=BB=B6=E7=9A=84=E5=85=BC=E5=AE=B9=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/taboolib/module/nms/Mapping.kt | 3 +- .../taboolib/module/nms/MinecraftVersion.kt | 2 +- module/bukkit/bukkit-ui/build.gradle.kts | 1 + .../module/ui/virtual/InventoryHandlerImpl.kt | 64 +++++++++++++------ 4 files changed, 48 insertions(+), 22 deletions(-) diff --git a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/Mapping.kt b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/Mapping.kt index bb4c4b970..e41ea876a 100644 --- a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/Mapping.kt +++ b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/Mapping.kt @@ -1,6 +1,7 @@ package taboolib.module.nms import com.google.gson.JsonParser +import net.minecraft.server.v1_16_R3.it import taboolib.common.PrimitiveIO import taboolib.common.env.RuntimeEnv import taboolib.common.io.newFile @@ -220,7 +221,7 @@ class Mapping( return Mapping( Exchanges["$id#classMapSpigotS2F"], Exchanges["$id#classMapSpigotToMojang"], - Exchanges["$id#classMapMojangS2F"], + Exchanges.getOrPut("$id#classMapMojangS2F") { Exchanges.get>("$id#classMapSpigotToMojang").values.associateBy { it.substringAfterLast('.', "") }.toMutableMap() }, Exchanges["$id#classMapMojangToSpigot"], Exchanges.get>>("$id#fields").mapTo(LinkedList()) { Field(it[0], it[1], it[2]) }, Exchanges.get>>("$id#methods").mapTo(LinkedList()) { Method(it[0], it[1], it[2], it[3]) } diff --git a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/MinecraftVersion.kt b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/MinecraftVersion.kt index c42d7036b..e1c8040f7 100644 --- a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/MinecraftVersion.kt +++ b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/MinecraftVersion.kt @@ -102,7 +102,7 @@ object MinecraftVersion { arrayOf("1.19", "1.19.1", "1.19.2", "1.19.3", "1.19.4"), // 11 arrayOf("1.20", "1.20.1", "1.20.2", "!1.20.3", "1.20.4", "!1.20.5", "1.20.6"), // 12 (跳过 1.20.3、1.20.5) NOTICE 从 1.20.5 开始, paper 进行了破坏性修改 arrayOf("!1.21", "1.21.1", "!1.21.2", "1.21.3", "1.21.4", "1.21.5", "!1.21.6", "!1.21.7", "1.21.8", "!1.21.9", "1.21.10", "1.21.11"), // 13 (跳过 1.21、1.21.2、1.21.6、1.21.7 和 1.21.9) - arrayOf("26.1") // 14 NOTICE 从 26.1 开始, Minecraft 不再被混淆 + arrayOf("26.1", "26.1.1") // 14 NOTICE 从 26.1 开始, Minecraft 不再被混淆 // @formatter:on ) diff --git a/module/bukkit/bukkit-ui/build.gradle.kts b/module/bukkit/bukkit-ui/build.gradle.kts index 12ccbac7e..7c760b765 100644 --- a/module/bukkit/bukkit-ui/build.gradle.kts +++ b/module/bukkit/bukkit-ui/build.gradle.kts @@ -14,6 +14,7 @@ dependencies { compileOnly("ink.ptms.core:v10900:10900") // 降低依赖权重 避免编译报错 compileOnly("ink.ptms.core:v12104:12104-minimize:mapped") + compileOnly("ink.ptms.core:v260100:260100-minimize") // 版本实现 compileOnly(project(":module:bukkit:bukkit-ui:bukkit-ui-12100")) compileOnly(project(":module:bukkit:bukkit-ui:bukkit-ui-legacy")) diff --git a/module/bukkit/bukkit-ui/src/main/kotlin/taboolib/module/ui/virtual/InventoryHandlerImpl.kt b/module/bukkit/bukkit-ui/src/main/kotlin/taboolib/module/ui/virtual/InventoryHandlerImpl.kt index 4e9fe9578..661c4dacd 100644 --- a/module/bukkit/bukkit-ui/src/main/kotlin/taboolib/module/ui/virtual/InventoryHandlerImpl.kt +++ b/module/bukkit/bukkit-ui/src/main/kotlin/taboolib/module/ui/virtual/InventoryHandlerImpl.kt @@ -1,7 +1,17 @@ package taboolib.module.ui.virtual +import net.minecraft.network.chat.Component +import net.minecraft.network.protocol.game.ClientboundContainerClosePacket +import net.minecraft.network.protocol.game.ClientboundContainerSetContentPacket +import net.minecraft.network.protocol.game.ClientboundContainerSetDataPacket +import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket +import net.minecraft.network.protocol.game.ClientboundOpenScreenPacket import org.bukkit.Bukkit import org.bukkit.Material +import org.bukkit.craftbukkit.entity.CraftPlayer +import org.bukkit.craftbukkit.inventory.CraftContainer +import org.bukkit.craftbukkit.inventory.CraftItemStack +import org.bukkit.craftbukkit.util.CraftChatMessage import org.bukkit.entity.Player import org.bukkit.event.inventory.InventoryCloseEvent import org.bukkit.inventory.ItemStack @@ -28,7 +38,10 @@ class InventoryHandlerImpl : InventoryHandler() { val major = MinecraftVersion.major override fun craftChatMessageToPlain(message: Any): String { - return if (MinecraftVersion.isUniversal) { + return if (MinecraftVersion.isUnobfuscated) { + message as Component + CraftChatMessage.fromComponent(message) + } else if (MinecraftVersion.isUniversal) { message as NMSIChatBaseComponent Craft19ChatMessage.fromComponent(message) } else { @@ -43,7 +56,10 @@ class InventoryHandlerImpl : InventoryHandler() { // 1.16+ // ChatSerializer.a 的返回值由 IChatBaseComponent 变为 IChatMutableComponent try { - if (MinecraftVersion.majorLegacy >= 12005) { + if (MinecraftVersion.isUnobfuscated) { + CraftChatMessage.fromJSON(source) + } + else if (MinecraftVersion.majorLegacy >= 12005) { Craft19ChatMessage.fromJSON(source) } else { if (MinecraftVersion.isHigherOrEqual(MinecraftVersion.V1_16)) { @@ -113,6 +129,18 @@ class InventoryHandlerImpl : InventoryHandler() { } return VInventory(inventory, id, player, container, cursorItem, title, NMSPacketPlayOutOpenWindow(id, windowType, component)) } + // 26.1 + in MinecraftVersion.V26_1..Int.MAX_VALUE -> { + val windowType = CraftContainer.getNotchInventoryType(inventory.bukkitInventory) + val container = CraftContainer(inventory.bukkitInventory, (player as CraftPlayer).handle, id) + val title = InventoryViewProxy.getTitle(container.bukkitView) + val component = if (title.startsWith('{') && title.endsWith('}')) { + CraftChatMessage.fromJSON(title) + } else { + CraftChatMessage.fromString(title)[0] + } + return VInventory(inventory, id, player, container, cursorItem, title, ClientboundOpenScreenPacket(id, windowType, component)) + } // 不支持 else -> throw UnsupportedVersionException() } @@ -159,24 +187,19 @@ class InventoryHandlerImpl : InventoryHandler() { nmsWindowItems.addAll(windowItems.map { Craft16ItemStack.asNMSCopy(it) }) NMS16PacketPlayOutWindowItems(id, nmsWindowItems) } - // 1.17, 1.18, 1.19, 1.20, 1.21 + // 1.17, 1.18, 1.19, 1.20, 1.21, 26.1 // 1.21.8 之前: public PacketPlayOutWindowItems(int var0, int var1, NonNullList var2, ItemStack var3) // 1.21.8 起: 构造器第三个参数从 NonNullList 改为 List - in MinecraftVersion.V1_17..MinecraftVersion.V1_21 -> { + in MinecraftVersion.V1_17..Int.MAX_VALUE -> { val nmsItems = windowItems.map { Craft19ItemStack.asNMSCopy(it) } val nmsCursorItem = Craft19ItemStack.asNMSCopy(cursorItem) + val nmsWindowItems = NMSNonNullList.create() + nmsWindowItems.addAll(nmsItems) if (MinecraftVersion.versionId >= 12108) { - // 1.21.8+: 使用 List 参数的构造器 (反射调用避免编译时签名绑定) - val packetClass = NMSPacketPlayOutWindowItems::class.java - val constructor = packetClass.declaredConstructors.first { - it.parameterCount == 4 && it.parameterTypes[0] == Int::class.java - } - constructor.isAccessible = true - constructor.newInstance(id, incrementStateId(), nmsItems, nmsCursorItem) + // 1.21.8+: 使用 List 参数的构造器 + ClientboundContainerSetContentPacket(id, incrementStateId(), nmsWindowItems, nmsCursorItem) } else { // 1.17~1.21.5: 使用 NonNullList 参数的构造器 - val nmsWindowItems = NMSNonNullList.create() - nmsWindowItems.addAll(nmsItems) NMSPacketPlayOutWindowItems(id, incrementStateId(), nmsWindowItems, nmsCursorItem) } } @@ -219,10 +242,11 @@ class InventoryHandlerImpl : InventoryHandler() { in MinecraftVersion.V1_8..MinecraftVersion.V1_16 -> { viewer.sendPacket(NMS16PacketPlayOutSetSlot(id, slot, Craft16ItemStack.asNMSCopy(itemStack))) } - // 1.17, 1.18, 1.19, 1.20 + // 1.17, 1.18, 1.19, 1.20, 1.21, 1.22 // public PacketPlayOutSetSlot(int var0, int var1, int var2, ItemStack var3) - in MinecraftVersion.V1_17..MinecraftVersion.V1_21 -> { - viewer.sendPacket(NMSPacketPlayOutSetSlot(id, incrementStateId(), slot, Craft19ItemStack.asNMSCopy(itemStack))) + // public ClientboundContainerSetSlotPacket(int containerId, int stateId, int slot, ItemStack itemStack) + in MinecraftVersion.V1_17..Int.MAX_VALUE -> { + viewer.sendPacket(ClientboundContainerSetSlotPacket(id, incrementStateId(), slot, CraftItemStack.asNMSCopy(itemStack))) } // 不支持 else -> throw UnsupportedVersionException() @@ -243,7 +267,7 @@ class InventoryHandlerImpl : InventoryHandler() { fun broadcastDataValue(slot: Int, state: Int) { if (MinecraftVersion.isUniversal) { - viewer.sendPacket(NMSPacketPlayOutWindowData(id, slot, state)) + viewer.sendPacket(ClientboundContainerSetDataPacket(id, slot, state)) } else { viewer.sendPacket(NMS16PacketPlayOutWindowData(id, slot, state)) } @@ -270,7 +294,7 @@ class InventoryHandlerImpl : InventoryHandler() { // 关闭页面 if (sendPacket) { if (MinecraftVersion.isUniversal) { - viewer.sendPacket(NMSPacketPlayOutCloseWindow(id)) + viewer.sendPacket(ClientboundContainerClosePacket(id)) } else { viewer.sendPacket(NMS16PacketPlayOutCloseWindow(id)) } @@ -308,11 +332,11 @@ class InventoryHandlerImpl : InventoryHandler() { handle(slot, button, shift) } // 1.17, 1.18, 1.19, 1.20 - in MinecraftVersion.V1_17..MinecraftVersion.V1_21 -> { + in MinecraftVersion.V1_17..Int.MAX_VALUE -> { // val stateId = packet.read("stateId")!! val slotNum = packet.read("slotNum")!! val buttonNum = packet.read("buttonNum")!! - val clickType = packet.read("clickType").toString() + val clickType = packet.read(if (MinecraftVersion.isUnobfuscated) "containerInput" else "clickType").toString() handle(slotNum, buttonNum, clickType) } From fd8e4050eb94413b780cdcf5041f3fe229ff0579 Mon Sep 17 00:00:00 2001 From: Micalhl Date: Wed, 8 Apr 2026 13:35:46 +0800 Subject: [PATCH 13/13] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20Packet#nameInMojang?= =?UTF-8?q?=20=E5=AD=97=E6=AE=B5=E5=B9=B6=E5=9C=A8=20Paper/Spigot=201.8.8?= =?UTF-8?q?=20=E5=92=8C=201.21.11=20=E9=80=9A=E8=BF=87=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/kotlin/taboolib/module/nms/Packet.kt | 3 +++ .../kotlin/taboolib/module/nms/PacketImpl.kt | 27 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/Packet.kt b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/Packet.kt index 17f439ad9..70abe92ac 100644 --- a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/Packet.kt +++ b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/Packet.kt @@ -18,6 +18,9 @@ abstract class Packet { /** 数据包名称(强制 Spigot 译名)*/ abstract val nameInSpigot: String? + /** 数据包名称(强制 Mojang 译名)*/ + abstract val nameInMojang: String? + /** 数据包完整名称 */ abstract val fullyName: String diff --git a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/PacketImpl.kt b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/PacketImpl.kt index 2481ecdae..740480304 100644 --- a/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/PacketImpl.kt +++ b/module/bukkit-nms/src/main/kotlin/taboolib/module/nms/PacketImpl.kt @@ -43,6 +43,32 @@ class PacketImpl(override var source: Any) : Packet() { return find } + /** 数据包名称(强制 Mojang 译名)*/ + override val nameInMojang: String? + get() { + // 如果是 Paper 服务器,或非混淆服务端,则直接返回原名称 + if (MinecraftVersion.isUnobfuscated || MinecraftVersion.isMojangMapping) return name + // 借助映射表获取并缓存译名 + if (mojangNameCache.containsKey(fullyName)) { + return mojangNameCache[fullyName]!!.orNull() + } + // 1.16 及以下版本,尝试获取 Spigot 译名 + val realFullyName = if (!MinecraftVersion.isUniversal) + MinecraftVersion.spigotMapping.classMapSpigotS2F[name] ?: fullyName + else fullyName + val find = MinecraftVersion.paperMapping.classMapSpigotToMojang[realFullyName]?.substringAfterLast('.') + if (find == null) { + warning( + """ + 未能找到 $fullyName 的 Mojang 译名。 + Cannot find spigot name for $fullyName. + """.t() + ) + } + spigotNameCache[fullyName] = Optional.ofNullable(find) + return find + } + /** 数据包完整名称 */ override var fullyName = source.javaClass.name.toString() @@ -66,5 +92,6 @@ class PacketImpl(override var source: Any) : Packet() { companion object { val spigotNameCache = Exchanges.getOrPut("packet_spigot_name_cache") { ConcurrentHashMap>() } + val mojangNameCache = Exchanges.getOrPut("packet_mojang_name_cache") { ConcurrentHashMap>() } } } \ No newline at end of file