- Intermediary 是 Fabric 在 Minecraft 混淆代码之上构建的稳定命名层。
- 它为每个混淆符号提供一个固定的名称,该名称在不同版本中保持不变。
- 编译后的 Fabric 模组会针对 Intermediary 名称进行发布,而不是可读的名称。
- 它能减少更新时的破坏,但无法阻止模组因游戏代码移除而失效.
中间层是 Fabric 为 Minecraft 混淆的代码覆盖层。Mojang 发布的游戏包含打乱的类、字段和方法名称,这些名称在每次发布时都会发生变化。中间层为每个名称提供一个固定的名称,该名称在不同版本中保持不变,因此编译后的模组即使在游戏底层更新后也能找到它所修补的代码.
Opal 的适配
Opal 是一个 Fabric 模组,因此它依赖于这个映射层,就像任何其他的 Fabric 模组一样。您无需手动配置它;设置指南 就能让您开始运行。
中介究竟是什么
中介是一组映射关系:一个查找表,它将每个被混淆的 Minecraft 符号与一个稳定、机器生成的名称配对。游戏调用的一个类,例如 a,在 Intermediary 中可能会变成 class_1234。这个名称可能不美观,但对于该符号而言,它在不同版本中是永久的。
Mojang 在每次构建时都会混淆游戏。如果没有中介,像 field_5678 这样的名称会在每次发布时发生变化,这就是为什么针对原始混淆名称编译的模组在游戏更新的瞬间失效的原因。中介冻结了这些名称,使得映射关系,而不是模组,来吸收变化。
为什么 Fabric 模组需要它
模组是针对 Intermediary 名称编译的,而不是开发者编写的可读名称。这个决定就是为什么 Fabric 模组可以在无需重新编译的情况下在新游戏构建上继续运行的原因。
当游戏启动时,Fabric 会加载该版本的 Intermediary 映射,并将混淆的游戏类重新映射到模组期望的稳定名称。模组和游戏在名称集合上达成一致,而这个集合既不会由模组提供,也不会由游戏提供。
中介与开发者映射
开发者不会读取或写入 class_1234。他们使用像 Yarn 或 Mojmap 这样的可读映射进行工作,这些映射为符号提供描述性名称。在构建时,这些可读名称会被编译成 Intermediary 以供分发.
| 层级 | 示例名称 | 使用者 | 版本兼容 |
|---|---|---|---|
| 混淆 | a, field_5678 | 没人手动 | 否 |
| 中间层 | class_1234 | 发布的模组二进制文件 | 是 |
| Yarn / Mojmap | MinecraftClient | 构建时期的开发者 | 可读,版本追踪 |
这种分离方式允许开发者使用友好的名称进行编码,而实际发布的版本保持版本稳定性。可读的映射可以互换;中间层是每个人都一致同意的最低标准。
如何融入模组的生命周期
- 开发者使用 Yarn 或 Mojmap 等可读的映射编写代码。
- 构建将这些名称转换为中间层名称。
- 模组以引用中间层符号的 jar 文件形式发布。
- 启动时,Fabric 将运行游戏的混淆名称重新映射到中间层,以便模组和游戏对齐。
这就是为什么映射是 Fabric 模组开发中一个安静但关键的部分:它们是确保模组在每次更新后都能指向正确代码的合同。
常见问题
不是。纱线是开发者编写代码的可读映射。中介是编译后的模组实际发行的稳定、机器生成的层。纱线名称在构建时会被编译为中介。
它们是生成的,而不是人工编写的。像 class_1234 这样的名称只需要保证唯一性和持久性,而不需要美观。Yarn 或 Mojmap 会在顶层处理可读性。
不是的。中介保持名称稳定,但如果Mojang移除或重写了一个方法,底层代码会消失,无论名称如何。它减少了破坏,但不能完全消除它。
不太需要。它在 Fabric 内部运行,就像幕后工作一样。你通常只有在作为开发者或查看提到中介符号的崩溃日志时才会遇到它。