Mixin 注册表(Mixins 枚举)
这是 383 个 mixin 的注册真源
src/main/java/com/gtnewhorizons/angelica/mixins/Mixins.java(1025 行)是一个枚举,每个枚举项用 MixinBuilder 声明一组 mixin。这是唯一的注册真源 —— 直接 find 目录得到的文件数只是「有多少个源文件」,不能回答「有多少个 mixin 真正被注册、在什么条件下注册」。
src/mixin/java/com/gtnewhorizons/angelica/mixins/
├── early/ 349 个源文件
└── late/ 34 个源文件
实测统计
| 指标 | 值 | 方法 |
|---|---|---|
| 枚举组数 | 53 | grep -cE "^\s{4}[A-Z_0-9]+\(new MixinBuilder\(\)" |
add*Mixins 调用点 |
97 | 95 × addClientMixins + 2 × addCommonMixins |
| 注册名出现总次数 | 396 | 解析括号内字符串,并把 addPrefix("前缀") 展开到每个字面量上 |
| 注册名去重后 | 395 | 同上口径下的集合运算 |
@Mixin 源文件数 |
383 | 目录遍历 |
为什么 395 ≠ 383
grep -c register 或数调用点都会得到偏差。真实差异有三个来源:
(1)真实重复注册(1 处) —— 把 addPrefix 前缀展开后,notfine.clouds.MixinEntityRenderer 出现了两次:一次是 Mixins.java:125 的完整字面量,一次是 Mixins.java:690 在 notfine. 前缀组里的 "clouds.MixinEntityRenderer"。同一类被注册两次(Mixin 本身会容忍,但属于冗余)。
(2)有源文件但未注册(1 处) —— Mixins.java:692 是全文件唯一被注释掉的注册项:
//"clouds.MixinRenderGlobal",
而 early/notfine/clouds/MixinRenderGlobal.java 文件确实存在于磁盘上 —— 即 dead code,不构成任何能力。详见 NotFine mixin 分组。
(3)名字是包相对的 —— 注册时写的是相对 phase 根包的部分限定名。例如 block.MixinBlockLeaves 在 early 包下解析为 com.gtnewhorizons.angelica.mixins.early.block.MixinBlockLeaves,而顶层裸名 MixinBerryBush 解析为 ...early.MixinBerryBush。所以「去重后的字符串数」与「文件数」不是同一坐标系。
⚠️ 去重数依赖归一化口径。若不展开
addPrefix前缀直接对字面量做集合运算,会得到 377 —— 那会把MixinRenderBlocks(磁盘上 9 个同名类)等不同包的类误判为重复。唯一可复现的口径是「展开前缀后再去重」= 395。
结论:本 wiki 以 383 个
@Mixin源文件作为覆盖分母(它唯一对应磁盘上的类),以 53 组 / 395 个注册名描述注册结构。两者不可互相替代。
注册 API
Mixins.java 使用的 builder 方法:
| 方法 | 调用点 | 行范围 |
|---|---|---|
addClientMixins(...) |
95 | — |
addCommonMixins(...) |
2 | — |
addServerMixins(...) |
0 | 本 mod 不用 |
每个枚举项的典型结构(:24-29):
ANGELICA_STARTUP(new MixinBuilder()
.setPhase(Phase.EARLY)
.addClientMixins(
"angelica.startup.MixinInitGLStateManager"
)
),
常见控制方法:
| 方法 | 用途 | 示例位置 |
|---|---|---|
setPhase(Phase.EARLY / LATE) |
决定注入阶段 | 几乎每项 |
setApplyIf(Supplier<Boolean>) |
按配置开关门控 | Mixins.java:89 () -> AngelicaConfig.entityOverlayFixes |
addRequiredMod(TargetedMod.X) |
目标 mod 未装则跳过 | :83 addRequiredMod(TargetedMod.STARMINER) |
addExcludedMod(TargetedMod.X) |
目标 mod 已装则跳过 | :76-77 排除 Dynamic Surroundings |
applyIf 的来源共 4 种:AngelicaConfig、CompatConfig、MCPatcherForgeConfig、NotFineConfig。例如:
| 绑定 | 行 | 后果 |
|---|---|---|
NotFineConfig.betterBlockFaceCulling |
:724、:781 |
见 NotFine |
NotFineConfig.renderPass |
:860 |
恒 false,该项永远不生效 |
按子系统分组(去重后)
395 个注册名按前两段包名归并:
| 组 | 数量 | 组 | 数量 |
|---|---|---|---|
celeritas.terrain |
17 | client.renderer |
12 |
angelica.bugfixes |
16 | client.particle |
8 |
angelica.entity |
12 | client.extrautils |
3 |
client.*(第三段) |
12 | client.ntmSpace |
3 |
angelica.debug |
8 | client.dragonapi |
2 |
angelica.hudcaching |
8 | client.etfuturum |
2 |
angelica.tesr |
8 | client.securitycraft |
2 |
celeritas.features |
7 | client.thaumcraft |
2 |
angelica.archaic |
7 | mcpatcherforge.ctm_cc |
4 |
celeritas.light |
6 | mcpatcherforge.hd |
2 |
shaders.startup |
6 | notfine.faceculling |
2 |
angelica.gui |
5 | notfine.toggle |
2 |
angelica.tracy |
5 | 其余各 1–4 项 | — |
celeritas.biome_blending |
5 | ||
notfine.leaves |
5 | ||
angelica.animation |
4 | ||
angelica.fpsreducer |
4 | ||
angelica.optimizations |
4 |
目录级统计(源文件,383)
| 包 | 文件数 |
|---|---|
early/angelica(含 24 个子包) |
122 |
early/mcpatcherforge(含 9 个子包) |
82 |
early/shaders(含 startup) |
44 |
early/celeritas(含 7 个子包) |
40 |
early/notfine(含 11 个子包) |
33 |
early/rendering(扁平单层) |
24 |
late/client(含 13 个第三方 mod 子包) |
21 |
late/notfine(含 3 个子包) |
12 |
early/dragonapi |
2 |
early/sdlgpu |
2 |
late/chisel |
1 |
mixin 配置文件
src/main/resources/ 下有 8 个 mixin 配置 json:
| 文件 | package 字段 |
|---|---|
mixins.angelica.early.json |
com.gtnewhorizons.angelica.mixins.early |
mixins.angelica.early.j17.json |
同上 |
mixins.angelica.early.j21.json |
同上 |
mixins.angelica.late.json |
com.gtnewhorizons.angelica.mixins.late |
mixins.angelica.late.j17.json |
同上 |
mixins.angelica.late.j21.json |
同上 |
mixins.angelica.json |
无 package 字段 |
mixins.angelica.server.json |
无 package 字段 |
这些 json 的 target 均为 @env(DEFAULT),refmap 统一指向 mixins.angelica.refmap.json。minVersion 除一个例外全部是 0.8.3-GTNH —— mixins.angelica.early.j21.json:3 是 0.8.7。compatibilityLevel 也不是全部 JAVA_8:三个基础 json(early / late / server)与无包的 mixins.angelica.json 是 JAVA_8,而四个 .j17 / .j21 变体分别是 JAVA_17 与 JAVA_21。
这些 json 里没有 mixin 类列表 —— 解析后 mixins / client / server 数组全部为 0。类清单由 GTNH 的 mixin 注解处理器在构建期从 Mixins.java 生成。这是「构建期占位符」的又一例:源码里看不到静态清单。
.j17 / .j21 后缀变体是为 JDK 17 / 21 的多版本 jar 准备的(gradle.properties:60 jvmDowngraderMultiReleaseVersions = 17, 21, 25),不是不同 Minecraft 版本 —— 全部面向 1.7.10。
相关条目
- Angelica mixin 分组 - 122 个 Angelica 系
- MCPatcherForge mixin 分组 - 82 个
- Iris(着色器)mixin 分组 - 44 个
- Celeritas mixin 分组 - 40 个
- NotFine mixin 分组 - 45 个(early 33 + late 12)
- late/client mixin 分组 - 21 个第三方 mod 补丁
- early/rendering mixin 分组 - 24 个
- TargetedMod -
addRequiredMod/addExcludedMod的枚举