Mixin 注册机制总览
基本信息
| 属性 | 值 |
|---|---|
| 注册枚举 | me.eigenraven.lwjgl3ify.mixins.Mixins |
| 枚举条目数 | 12 |
| 覆盖的唯一 mixin 类数 | 22 |
| 目录下 mixin 源文件数 | 22 |
| 早期加载器 | Lwjgl3ifyCoremod(IEarlyMixinLoader) |
| 晚期加载器 | Lwjgl3ifyLateMixins(@LateMixin + ILateMixinLoader) |
| 目标模组枚举 | me.eigenraven.lwjgl3ify.mixins.TargetedMod(6 项) |
LWJGL3ify 的 mixin 列表不在 JSON 里。三个 mixins.lwjgl3ify*.json 的 mixins / client / server 数组全部缺失(详见下文),真实列表由 Mixins 枚举经 GTNH Mixins 的 MixinBuilder DSL 动态生成。
功能
三个 mixin JSON 均为空壳
src/main/resources/ 下的三个配置文件实测内容(全文):
| 文件 | package |
特殊字段 | 数组 |
|---|---|---|---|
mixins.lwjgl3ify.early.json |
me.eigenraven.lwjgl3ify.mixins.early |
mixinextras.minVersion = 0.5.0 |
无 |
mixins.lwjgl3ify.json |
me.eigenraven.lwjgl3ify.mixins |
无 | 无 |
mixins.lwjgl3ify.late.json |
me.eigenraven.lwjgl3ify.mixins.late |
无 | 无 |
三者共有 "required": true、"minVersion": "0.8.3-GTNH"、"refmap": "mixins.lwjgl3ify.refmap.json"、"target": "@env(DEFAULT)"、"compatibilityLevel": "JAVA_8"。
数组为空是设计而非缺陷:条目列表由 IMixins.getEarlyMixins(Mixins.class, loadedCoreMods) 在运行时计算(Lwjgl3ifyCoremod.java:74),结果作为 getMixins() 的返回值传给 Mixin 引导器,根本不经过 JSON 数组。
12 个枚举条目
Mixins.java:13-80(整段被 // spotless:off / // spotless:on 包裹):
| # | 条目 | Phase | 门控 | mixin 数 |
|---|---|---|---|---|
| 1 | FORGE_JAVA9 |
EARLY | — | 4 |
| 2 | STB_TEXTURE_LOADING |
EARLY | 配置 | 2 |
| 3 | TEXT_FIELD_SDL_INPUT |
EARLY | — | 5 |
| 4 | OPEN_URL_WITH_SDL |
EARLY | — | 4 |
| 5 | FLOAT_MOUSE_MOVEMENT |
EARLY | — | 2 |
| 6 | MINECRAFT_SCALE_FULLSCREEN_CORRECTLY |
EARLY | — | 1 |
| 7 | XAEROS_MINIMAP_SCROLL |
LATE | modId | 1 |
| 8 | XAEROS_WORLDMAP_SCROLL |
LATE | modId | 1 |
| 9 | OPENCOMPUTERS_KEYBOARD_INPUT_FIX |
EARLY | coreMod+modId | 1 |
| 10 | STB_TEXTURE_STITCHING |
EARLY | 配置 + 排除模组 | 1 |
| 11 | STB_TEXTURE_STITCHING_FORCE |
EARLY | 配置 + 必需模组 | 1 |
| 12 | STB_TEXTURE_STITCHING_FOR_FASCRAFT |
EARLY | 配置 + 2 必需模组 | 1 |
注意 game.MixinStitcher 在条目 10/11/12 中被引用 3 次(Mixins.java:67,72,77),故 12 个条目共引用 24 次、覆盖 22 个唯一 mixin 类——与目录下 22 个 .java 文件一一对应,无遗漏、无多余。
计数交叉验证
| 方法 | 结果 |
|---|---|
枚举常量正则 ^ [A-Z][A-Z_0-9]*\( |
12 |
new MixinBuilder 出现次数 |
12 |
.add(Common|Client)Mixins( 出现次数 |
12 |
| 唯一 mixin 名字符串(多段式正则) | 22 |
git ls-files 中 mixins/** 排除 Mixins.java/TargetedMod.java 后 |
22 |
注:
FORGE_JAVA9含数字9,若用[A-Z_]+字符类会漏计为 11。本条目采用含0-9的字符类并已二次核对。
两个加载器
- 早期:
Lwjgl3ifyCoremod同时实现IFMLLoadingPlugin与IEarlyMixinLoader(Lwjgl3ifyCoremod.java:22),getMixinConfig()返回mixins.lwjgl3ify.early.json(:69)。 - 晚期:
Lwjgl3ifyLateMixins标注@LateMixin(Lwjgl3ifyLateMixins.java:14),getMixinConfig()返回mixins.lwjgl3ify.late.json(:19),getMixins调IMixins.getLateMixins(:25)。
mixins.lwjgl3ify.json 的归属
该文件未被任何 Java / Kotlin / Gradle 源文件按字符串引用(全仓 grep "mixins.lwjgl3ify.json" 无命中)。同样的模式在 GTNHLib 镜像中同样存在:mixins.gtnhlib.json 存在但 grep '"mixins\.gtnhlib\.json"' 亦无命中,而 mixins.gtnhlib.early.json 被 GTNHLibCore.java:171 引用、mixins.gtnhlib.late.json 被 GTNHLibLateMixinLoader.java:16 引用。
因此这是 GTNH 构建体系下各 mod 共同的目录约定产物,并非 lwjgl3ify 独有的缺陷。究竟由谁加载这个裸配置——无法核实:UniMixins 侧的扫描/引导逻辑不在本仓库内。UniMixins 虽有本地镜像(/Users/evlos/a/mirror/UniMixins),但本次未对其做源码核验,因此不给出具体的加载器类名,也不下"该文件是死文件"的结论。
数值
| 数值 | 值 |
|---|---|
| mixin JSON 文件数 | 3 |
含非空 mixins 数组的 JSON |
0 |
| 枚举条目数 | 12 |
| 唯一 mixin 类数 | 22 |
| EARLY 阶段条目 | 10 |
| LATE 阶段条目 | 2 |
addCommonMixins 条目 |
1(FORGE_JAVA9) |
addClientMixins 条目 |
11 |
TargetedMod 枚举项 |
6 |
setApplyIf 配置门控条目 |
4 |
交互
| 触发 | 行为 |
|---|---|
| 早期 mixin 加载 | 走 Lwjgl3ifyCoremod.getMixins,Phase.EARLY 条目被求值 |
| 晚期 mixin 加载 | 走 Lwjgl3ifyLateMixins.getMixins,Phase.LATE 条目被求值 |
条目设了 addRequiredMod 且目标模组未加载 |
整条跳过 |
条目设了 addExcludedMod 且目标模组已加载 |
整条跳过 |
条目设了 setApplyIf 且谓词为假 |
整条跳过 |
| 目标模组由 coremod 类判定(如 FastCraft、OptiFine) | 通过 setCoreModClass 在 loadedCoreMods 集合中查找 |
相关条目
- FML Java 9+ 兼容补丁 - 唯一使用
addCommonMixins的条目 - SDL 输入与窗口 Mixin - 4 条目 12 个客户端 mixin
- 纹理加载与拼接 Mixin - 3 个条目共用同一个
MixinStitcher - 第三方模组兼容 Mixin - 3 个受目标模组门控的条目
- 第三方兼容钩子 -
TargetedMod判定方式