teddyxlandlee 发表于 2025-11-5 18:23:23

【MJSB】Mojang仅凭一个改名得罪了所有Modloader(bushi

本帖最后由 teddyxlandlee 于 2025-11-5 18:24 编辑

最新快照25w45a同步发布了未混淆的版本`25w45a_unobfuscated`,该版本没有进入Version Manifest。

与此同时,Mojang把`net.minecraft.resources.ResourceLocation`(Fabric Yarn:`net.minecraft.util.Identifier`;Intermediary:`net.minecraft.class_2960`)改名为`net.minecraft.resources.Identifier`。不知是对CC0之神Yarn的致敬,还是如Wiki群友说的“与基岩版术语同步”。

Fabric由于使用Intermediary这一稳定中间名,不会受到影响。但从1.21.12起,Intermediary就要随着去除混淆适应期的结束而终止存在,**Fabric平台的兼容断层本就是1.21.12**。

Forge和NeoForge分别从1.20.6和1.20.2就开始用官方映射表,所以他们不得不接受Mojang对代码进行更名导致的兼容性问题。因此,**1.21.11是Forge系的兼容断层**。

因此,通过Unobfuscation和Identifier renaming,Mojang把所有modloader得罪了个遍(大雾

(以上涉及的版本号都假设Mojang暂时不跳大版本号)

---------------------

这两件事情都很令人意外,但当它们发生在同一个版本,这个有意思的巧合就可以加以利用。

简单来说,无论是哪个平台,在运行环境中都可以通过**判断`net.minecraft.resources.Identifier`类是否存在,来判定是否是Mojang官方的未混淆版本**。通常来说,在代码中使用`Class.forName("net.minecraft.resources.Identifier")并检测是否抛出ClassNotFoundException异常,这就足够了。——Fabric在区间内的混淆版本仍会使用intermediary,不会被这个规则误判。

但在Mixin Config Plugin或Coremod等不适合加载原版类的情况下,如果不能扫classpath的话,这个办法可能并不适用。

如果在Forge系环境下,可以直接比较MC版本是否高于1.21.10,这就足够了,毕竟他们不支持快照。

Fabric的话情况会稍微复杂一些。由于我们目前并不知道Fabric会如何将`_unobfuscated`的版本翻译称SemVer(语义版本号),我们只能在原始版本号上作文章。但在假定Mojang不跳大版本号的条件下,从1.21.12的第一个快照起将不再包含混淆。因此可以作这么一个判定:
```
isMojMapped(): !(<=1.21.11-alpha.25.44.a) && (>=1.21.12- || FabricLoader.getInstance().getRawGameVersion().endsWith("_unobfuscated"))
```
其中`1.21.12-`在Fabric的`SemanticVersion`中代表“主版本号为1.21.12的某个虚拟版本,该版本不晚于一切主版本号为1.21.12的版本”。也就是说,`>=1.21.12-`匹配1.21.12的所有快照、预发布版、发布候选、正式版等,以及比1.21.12更晚的版本。
页: [1]
查看完整版本: 【MJSB】Mojang仅凭一个改名得罪了所有Modloader(bushi