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。

相关条目