Skip to content

Commit 0d44585

Browse files
committed
新的转译逻辑,Paper/Spigot 1.20.4、1.21.11、26.1 测试通过
1 parent 3f657a6 commit 0d44585

3 files changed

Lines changed: 62 additions & 6 deletions

File tree

module/bukkit-nms/src/main/kotlin/taboolib/module/nms/MinecraftVersion.kt

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ object MinecraftVersion {
216216

217217
/**
218218
* 当前运行版本的 Paper 映射文件
219-
* 仅用与对 TabooLib 本体的 NMSProxy Impl 进行二次转译(插件本体会自动转译)
219+
* 一、用于对 TabooLib 本体的 NMSProxy Impl 进行二次转译(插件本体会自动转译)
220220
*
221221
* ```
222222
* 方法/字段逻辑:
@@ -236,6 +236,38 @@ object MinecraftVersion {
236236
* ```
237237
*
238238
* 这么做的原因是要保证 TabooLib 本体必须能够在 Spigot 环境下运行。
239+
*
240+
* 二、用于在 Spigot Deobf 环境下,将所有 NMSProxy Impl 进行转译
241+
*
242+
* 在 26.1 版本后,Minecraft 不再被混淆,这意味着不再有混淆表公布
243+
* 所以,需要提供一种新的转译逻辑,在 1.17 至 1.20.4 中,将 Mojang Deobf 转译为 Spigot Deobf。
244+
*
245+
* ```
246+
* 方法/字段逻辑:
247+
* Spigot Deobf -> Mojang Obf (1.18+)
248+
* Mojang Deobf -> Mojang Obf
249+
*
250+
* 以 SystemUtils 为例:
251+
* net/minecraft/Util.backgroundExecutor() -> net/minecraft/SystemUtils.g()
252+
* ^
253+
* 通过检索下载到的 Spigot 混淆表获得
254+
* net/minecraft/SystemUtils.ioPool() -> net/minecraft/SystemUtils.g()
255+
* ^
256+
* 如果是 Paper 服务端则检索服务端里的 reobf.tiny,
257+
* 如果是 Spigot 则下载对应版本的 reobf.tiny 并检索
258+
* 类逻辑:
259+
* Spigot Deobf 保持不变
260+
* Mojang Deobf -> Spigot Deobf
261+
* ^
262+
* 通过 reobf.tiny 查找并转译为 Spigot Deobf
263+
*
264+
* 以 SystemUtils 为例:
265+
* net/minecraft/util/SystemUtils 保持不变
266+
* net/minecraft/util/Util -> net/minecraft/util/SystemUtils
267+
* ```
268+
*
269+
* 这么做是为了让用户可以在 1.17+ 只通过 Mojang Deobf 而不是 Spigot Deobf 编写 nms 代码,
270+
* 而不需要同时为了兼容 26.1 和低版本,编写两套代码。
239271
*/
240272
val paperMapping by unsafeLazy {
241273
// 如果已被其他插件加载,直接从内存中读取
@@ -325,7 +357,6 @@ object MinecraftVersion {
325357
}
326358
// 在 Bukkit 平台下,注册 Reflex 重定向实现
327359
// 如果是非混淆服务端(26.1+),则不注册
328-
// TODO: 原本版本出问题
329360
if (runningPlatform == Platform.BUKKIT && !isUnobfuscated) {
330361
Reflex.remapper.add(if (isMojangMapping) RemapReflexPaper() else RemapReflexSpigot())
331362
}

module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslation.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,17 @@ open class RemapTranslation : Remapper() {
5353
spigotName = if (MinecraftVersion.isMojangMapping) MinecraftVersion.paperMapping.classMapSpigotToMojang[spigotName] ?: spigotName else spigotName
5454
spigotName.replace('.', '/')
5555
} else {
56-
key
56+
// 如果是非 Universal CraftBukkit 环境,且这里是 Mojang.Fullname,则:尝试获取 Spigot.Fullname 并返回,如果获取不到,那么 key 就是 Spigot.Fullname 本身
57+
if (!MinecraftVersion.isMojangMapping) {
58+
MinecraftVersion.paperMapping.classMapMojangToSpigot[key.replace('/', '.')]?.replace('.', '/') ?: key
59+
} else {
60+
// 如果为 Universal CraftBukkit 环境,这里不管是 Spigot.Fullname 还是 Mojang.Fullname 都不需要动
61+
// 如果是 Spigot.Fullname,Paper PluginRemapper 会进行转译
62+
key
63+
}
5764
}
5865
} else {
66+
// TODO 如果是 Mojang.Fullname 则尝试寻找对应的 Spigot.Fullname
5967
if (key.startsWith("net/minecraft")) "net/minecraft/server/${MinecraftVersion.minecraftVersion}/${key.substringAfterLast('/')}" else key
6068
}
6169
}

module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslationLegacy.kt

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,14 @@ open class RemapTranslationLegacy : RemapTranslation() {
3333
val runningOwner = translate(owner).replace('/', '.')
3434
// 追溯父类和接口
3535
val findPath = parentsCacheMap.getOrPut(runningOwner) { findParents(runningOwner).reversed() }
36-
return MinecraftVersion.spigotMapping.fields.find { it.translateName == name && it.path in findPath }?.mojangName ?: name
36+
// 这里肯定是非 Universal CraftBukkit 环境
37+
// 先尝试当作 Mojang Deobf 转为 Mojang obf,否则当作 Spigot Deobf 转为 Mojang obf
38+
// 这里有个好处是:Spigot 方法和字段的映射在 1.18+ 才提供,但是 Mojang Deobf 从 1.17 开始就提供了,可以直接使用
39+
var mojangName = MinecraftVersion.paperMapping.fields.find { it.translateName == name && it.path in findPath }?.mojangName
40+
if (mojangName == null) {
41+
mojangName = MinecraftVersion.spigotMapping.fields.find { it.translateName == name && it.path in findPath }?.mojangName
42+
}
43+
return mojangName ?: name
3744
}
3845
return name
3946
}
@@ -54,10 +61,20 @@ open class RemapTranslationLegacy : RemapTranslation() {
5461
val runningOwner = translate(owner).replace('/', '.')
5562
// 追溯父类和接口
5663
val findPath = parentsCacheMap.getOrPut(runningOwner) { findParents(runningOwner).reversed() }
57-
return MinecraftVersion.spigotMapping.methods.find {
64+
// 这里肯定是非 Universal CraftBukkit 环境
65+
// 先尝试当作 Mojang Deobf 转为 Mojang obf,否则当作 Spigot Deobf 转为 Mojang obf
66+
// 这里有个好处是:Spigot 方法和字段的映射在 1.18+ 才提供,但是 Mojang Deobf 从 1.17 开始就提供了,可以直接使用
67+
var mojangName = MinecraftVersion.paperMapping.methods.find {
5868
// 根据复杂程度依次对比
5969
it.translateName == name && it.path in findPath && RemapHelper.checkParameterType(desc, it.descriptor)
60-
}?.mojangName ?: name
70+
}?.mojangName
71+
if (mojangName == null) {
72+
mojangName = MinecraftVersion.spigotMapping.methods.find {
73+
// 根据复杂程度依次对比
74+
it.translateName == name && it.path in findPath && RemapHelper.checkParameterType(desc, it.descriptor)
75+
}?.mojangName
76+
}
77+
return mojangName ?: name
6178
}
6279
return name
6380
}

0 commit comments

Comments
 (0)