TabooLib / taboolib

Powerful framework for creating multi-platform Minecraft plugin
https://tabooproject.org
MIT License
299 stars 100 forks source link

[6.2.0][dev] 1.21 Fix nmsProxy #444

Closed Micalhl closed 3 weeks ago

Micalhl commented 1 month ago

对于 TabooLib 内的类, 使用 RemapTranslationTabooLib 进行 Spigot Deobf -> Mojang Obf -> Mojang Deobf 转换。

而插件内的类,已经由 Paper 进行转译了,所以不应该再使用 RemapTranslation (现在为 RemapTranslationLegacy) 进行转译, 应该只需要使用该 RemapTranslation 移除包名中的跨版本信息 (诸如 v1_20_R3) , 而无需对字段名、方法名进行任何操作。

注:我对 TabooLib nms 内部运行逻辑暂时还了解的不是很清楚,不清楚有没有错误,写的垃圾别骂我😭(逃

TheFloodDragon commented 1 month ago

终于被发现了

Bkm016 commented 1 month ago

终于被发现了

TheFloodDragon commented 1 month ago

终于被发现了

我:

发现问题->LookLook源码->确定问题->摆烂

行动力 0.o%

Bkm016 commented 1 month ago

终于被发现了

发现问题->LookLook源码->确定问题->摆烂

行动力 0.o%

尊重他人劳动,请勿发表令人不适的言论。

TheFloodDragon commented 1 month ago

尊重他人劳动,请勿发表令人不适的言论。

好的~

TheFloodDragon commented 1 month ago

可能存在一种特殊情况下的问题:(未实践,纯推理)

RemapTranslation.kt#L55

推演流程: 在RemapTranslation在Paper1.20.5+启用时 NMSProxy代理的类恰好存在类net.minecraft.server.v1*.的类 (低版本包名类) 恰好符合此if条件,然后走MinecraftVersion.spigotMapping.classMapSpigotS2F

此时是classMapSpigotS2F 根据此字段描述

// <Spigot.SimpleName, Spigot.FullName> val classMapSpigotS2F = HashMap<String, String>()

注意到,映射末端是 Spigot.FullName

而此时运行环境为Paper1.20.5+,使用的是MojangDeobf

那么,是否会存在:Paper1.20.5+时,会找不到Spigot.FullName的类

Micalhl commented 1 month ago

昨天改这个模块前,正常使用 nmsProxy,发现 1.16 和 1.17 无法共存,所以没有考虑这个问题,这是另外一个问题。

----- 原始邮件 -----

@.***>

@.***>等3人

主题:Re: [TabooLib/taboolib] [6.2.0][dev] 1.21 Fix nmsProxy (PR #444)

日期:2024年08月18日 10:55:14

可能存在一种特殊情况下的问题: RemapTranslation.kt#L55 推演流程: 在RemapTranslation在Paper1.20.5+启用时 NMSProxy代理的类恰好存在类net.minecraft.server.v1_20_R3.*的类 符合此if条件,然后就会将其走MinecraftVersion.spigotMapping.classMapSpigotS2F 此时是classMapSpigotS2F 根据此字段描述

// <Spigot.SimpleName, Spigot.FullName> val classMapSpigotS2F = HashMap<String, String>() 注意到,映射末端是 Spigot.FullName,

而此时运行环境为Paper1.20.5+,使用的是MojangDeobf 那么,是否会存在:Paper1.20.5+时,会找不到Spigot.FullName的类 — Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>

Micalhl commented 1 month ago

可能存在一种特殊情况下的问题:(未实践,纯推理)

RemapTranslation.kt#L55

推演流程: 在RemapTranslation在Paper1.20.5+启用时 NMSProxy代理的类恰好存在类net.minecraft.server.v1____.*的类 (低版本包名类) 恰好符合此if条件,然后走MinecraftVersion.spigotMapping.classMapSpigotS2F

此时是classMapSpigotS2F 根据此字段描述

// <Spigot.SimpleName, Spigot.FullName> val classMapSpigotS2F = HashMap<String, String>()

注意到,映射末端是 Spigot.FullName

而此时运行环境为Paper1.20.5+,使用的是MojangDeobf

那么,是否会存在:Paper1.20.5+时,会找不到Spigot.FullName的类

在最新的提交 (da1c338) 里我已经尝试规避这个问题,感谢指出。

Micalhl commented 1 month ago
image

有个问题,为什么要删掉这个东西?不通过这个东西转译描述符的话,后面 RemapHelper.checkParameterType 判断描述符就有问题,因为有 getClass 操作。 如果这个判断描述符不转译的话,就会出现我之前说的 1.16 和 1.17 无法共存的问题。简单来说就是当 NMSProxy 中即有 1.16 的 NMS 代码,又有 1.17(Universal)的代码时,转译就会出现 java.lang.ClassNotFoundException: net.minecraft.server.v1_16_R3.XXXXXX。