Learn · mappings

是什么 Minecraft 映射?详解

Minecraft 的映射是名称表,它们将混淆的代码,例如 a.b.c,转换为可读的名称,以便模组和客户端可以读取和钩住游戏.

TRtrolPublished 1 min read

什么是 Minecraft 映射?

Minecraft 映射是翻译表,它将游戏中的混淆符号与人类可读的名称配对。零售版中,类、方法和字段都被重命名为微小的无意义字符串,例如 abkc.d.e。像 MCP、Yarn 或 Mojang 映射这样的映射集会在这些混乱之上覆盖真实名称,以便开发人员可以阅读代码并与之挂钩。

如果没有映射,游戏在技术上是开放的,但在实践中却难以阅读。应用一个映射后,标记为 field_71090_bL 的字段会显示为类似 experienceLevel 的名称,整个代码库突然看起来像正常的软件。

为什么 Minecraft 需要映射?

映射存在是因为 Mojang 在每次发布前都会混淆 Minecraft。构建步骤会将每个类和成员重写为短令牌。这可以稍微减小 jar 文件的大小,但主要目的是使代码难以理解。这是每个模组和客户端必须克服的障碍。

映射是通往这个障碍的关键。它是一个一对一的列表:左边是混淆名称,右边是可读名称。将其应用于整个游戏,打乱的 jar 文件就会变成可用的源代码树.

你将要听到的三个映射集

有很多映射项目,但其中三个占据了对话的主导地位。它们各自属于不同的时代和不同的拥有者。

MCP (Mod Coder Pack)

MCP 是社区映射,在 1.14 之前为模组制作提供了动力。它运行在两层之上。Searge 项目生成了稳定但不美观的中间名称,例如 func_70071_h_,而 MCP 则为这些名称赋予了友好的名称,例如 onUpdate。大多数较旧的 1.8.9 独立客户端仍然针对 MCP 映射的树进行编译,并将它们的反射指向 MCP 或 Searge 名称。

Yarn

Yarn 是 FabricMC 为 Fabric 生态系统维护的开源映射。它是社区编写的,采用自由许可协议,并且在发布新的 Minecraft 版本时通常会快速更新。这种快速周转是 Fabric 模组能够尽早达到新版本的一个重要原因。

Mojang 映射

Mojang 映射,通常缩写为 Mojmap,是 Mojang 自 1.14.4 起在每个版本发布时发布的官方名称。由于它们直接来自源代码,因此名称与 Mojang 开发者实际使用的名称一致。它们有效地取代了 MCP 和 Searge,成为任何现代客户端的默认起点。

MCP 与 Yarn 与 Mojang 映射

简而言之:MCP 是旧的工具链,Mojang 映射是官方的替代品,而 Yarn 介于两者之间,是大多数 Fabric 项目使用的开放社区版本。以下是它们在重要方面的一些比较。

MCPYarnMojang 映射
维护者社区(Searge + MCP)FabricMCMojang
时代1.14 之前(1.7 到 1.12)1.14 及更高版本1.14.4 及更高版本
起源社区衍生社区衍生第一方官方
典型用途遗留客户端,旧的模组FabricFabric, Forge, NeoForge
状态为 Mojmap 所取代,已退役活跃活跃的默认选项

映射在模组工具链中的作用

映射在编译时完成其工作,而不是在运行时。构建工具获取被混淆的游戏,运行映射,然后将可读的副本交给开发者编写。当模组完成后,工具链将其重新映射,使其引用与玩家实际 jar 中的混淆名称对齐。

加载器对此采取不同的方法。Fabric 基于 Yarn 或 Mojang 映射进行构建,具体取决于项目。Forge 历史上将工作拆分,通过一个映射读取代码,同时针对另一个映射运行。Mojang 映射的许可足够宽松,可以在构建时使用,这就是为什么大多数当前的工具链依赖于它的原因.

中介:稳定模组的层级

还有一个值得了解的名字。中介是 Fabric 使用的一个稳定的中间层,即使可读的映射发生变化,编译后的模组也能继续工作。可读名称(Yarn 或 Mojmap)位于顶层,方便人类使用,而中介则在底层保持不变,为运行的游戏提供支持。在 MCP 世界中,Searge 扮演了类似的角色。这个想法很简单:为二进制文件提供一个固定的层级,为开发者提供一个友好的层级。

常见问题

获取Terminus

Built to track Minecraft's mappings so its modules keep working across versions.