Mixin 枚举
基本信息
| 属性 | 值 |
|---|---|
| 枚举 | com.gtnewhorizon.gtnhlib.mixins.Mixins |
| 源码 | src/main/java/com/gtnewhorizon/gtnhlib/mixins/Mixins.java |
| 接口 | com.gtnewhorizon.gtnhmixins.builders.IMixins |
| 枚举条目数 | 27 |
| 引用的 mixin 类总数 | 54 |
| 目标 mod 枚举 | com.gtnewhorizon.gtnhlib.mixins.TargetMods(3 个) |
⚠️ 本枚举是 mixin 清单的唯一真实来源。 4 个 mixins.gtnhlib*.json 的 mixins / client / server 数组全为空(见 Mixin 引导流程),按 JSON 统计会得到 0。详见本条目末尾的计数校验。
功能
Mixins 枚举把每个注入组表达为一个 MixinBuilder,带阶段(EARLY/LATE)、条件(setApplyIf)与目标 mod 依赖(addRequiredMod / addExcludedMod)。GTNHLibCore.getMixins() 与 GTNHLibLateMixinLoader.getMixins() 分别按阶段取用。
27 个条目
约定:C = client 侧,M = 双方。
| # | 枚举名 | 阶段 | 条件 | mixin 数 | 作用 |
|---|---|---|---|---|---|
| 1 | THREAD_SAFE_TESSELLATOR |
EARLY | 无 | 1 C | MixinTessellator |
| 2 | WAVEFRONT_VBO |
EARLY | 无 | 1 C | MixinWavefrontObject |
| 3 | AUTO_CONFIG_GUI |
EARLY | 无 | 1 C | fml.MixinGuiModList |
| 4 | EVENT_BUS_ACCESSOR |
EARLY | 无 | 2 M | fml.EventBusAccessor、fml.EnumHolderAccessor |
| 5 | TOOLTIP_RENDER |
EARLY | 无 | 1 C | MixinGuiScreen |
| 6 | EQUIPMENT_CHANGE_EVENT |
EARLY | 无 | 1 M | MixinEntityLivingBase |
| 7 | BACKPORT_SERVER_TICKING |
EARLY | 无 | 1 M | MixinMinecraftServer |
| 8 | GAME_RULES_API |
EARLY | 无 | 1 M | MixinGameRules |
| 9 | BRIGADIER |
EARLY | 无 | 2 M | MixinCommandHandler、MixinCommandHelp |
| 10 | FONT_RENDERER |
EARLY | enableFontRendererMixin |
1 C | 字体渲染替换 |
| 11 | BLOCK_PROPERTIES_ACCESSORS |
EARLY | 无 | 1 M | MixinTileEntitySkull |
| 12 | MODEL_TEXTURE_LOADING |
EARLY | () -> true |
7 C | 自动加载模型/纹理/元数据 |
| 13 | MODEL_PARTICLE_FIXES |
EARLY | () -> true |
5 C | 覆盖模型粒子图标 |
| 14 | MODEL_ITEM_RENDERER |
EARLY | 无 | 1 C | 修 MixinModelFHC 原点枢轴 |
| 15 | MODEL_BLOCK_CRACKS |
EARLY | 无 | 1 C | 修复模型方块裂纹纹理 |
| 16 | DYNAMIC_BLOCK_SOUNDS |
EARLY | blockSoundMixins |
7(5 M + 2 C) | 动态方块音效 |
| 17 | ENTITY_RENDERER_ACCESSOR |
EARLY | 无 | 1 C | 访问 EntityRenderer lightmap |
| 18 | ITEM_TRANSLUCENCY |
EARLY | enableTranslucentItemRenders |
2 C | 半透明物品渲染 |
| 19 | CUSTOM_CHAT_COMPONENT_REGISTRATION |
EARLY | 无 | 1 M | 自定义聊天组件注册 |
| 20 | MULTI_RELEASE_JAR_FILTER |
EARLY | 无(排除 LWJGL3ify) | 1 M | 跳过 mod 发现中的多版本 JAR 条目 |
| 21 | PICK_BLOCK_TRAP |
EARLY | 无 | 1 C | MixinMinecraft_PickBlockTrap |
| 22 | ENHANCED_INFUSION_RECIPE |
LATE | 需 Thaumcraft | 1 M | 附魔台配方替换而非消耗 |
| 23 | CONFIG_ORDER |
EARLY | 无 | 1 C | fml.MixinGuiConfig |
| 24 | WORLD_DELETION_EVENT |
EARLY | 无 | 1 C | MixinGuiSelectWorld |
| 25 | WORLD_LOAD_WARNING |
EARLY | 无 | 2 M | 世界转换警告系统 accessor |
| 26 | MODDED_FLOWERS_IN_FLOWER_POT |
EARLY | enableMoreFlowerPottage |
3 M | 模组方块入花盆 |
| 27 | BIOMES_O_PLENTY_FLOWER_POT |
LATE | enableMoreFlowerPottage + 需 Biomes O’ Plenty |
6 M | BoP 方块实现 IFlowerPottable |
条件列为「无」者,走 Mixins(Side side, String... mixins) 简写构造器(Mixins.java:95-97),该构造器固定 .setPhase(Phase.EARLY):
Mixins(Side side, String... mixins) {
builder = new MixinBuilder().addSidedMixins(side, mixins).setPhase(Phase.EARLY);
}
第 26 条的 MixinRenderBlocks_FlowerPot 虽为客户端类,但在枚举中以 addCommonMixins 登记(Mixins.java:112-115),故 3 个 mixin 全按 common 计。上表 27 行求和 = 54,与磁盘统计一致。
目标 mod 依赖
mixins/TargetMods.java 声明 3 个目标:
| 常量 | coreModClass | modId |
|---|---|---|
LWJGL3IFY |
me.eigenraven.lwjgl3ify.core.Lwjgl3ifyCoremod |
— |
THAUMCRAFT |
— | Thaumcraft |
BIOMES_O_PLENTY |
biomesoplenty.BiomesOPlenty |
BiomesOPlenty |
用法:ENHANCED_INFUSION_RECIPE 用 addRequiredMod(TargetMods.THAUMCRAFT);MULTI_RELEASE_JAR_FILTER 用 addExcludedMod(TargetMods.LWJGL3IFY)。
计数校验(两条独立路径互证)
路径 A — 从枚举解析引用名(排除 new MixinBuilder("…") 的描述字符串):
names referenced by enum: 54
UNRESOLVED: []
路径 B — 从磁盘枚举 mixins/ 下的 mixin 源文件:
| 目录 | 文件数 |
|---|---|
mixins/early/(含 block_sounds 7、fml 5、models 9、models/particles 5) |
47 |
mixins/late/(含 flowerpotcompat 6) |
7 |
mixins/preinit/ |
1 |
| 合计 | 55 |
55 = 54(枚举)+ 1(PreInitMixinPlugin),两条路径完全吻合。54 个被引用的 mixin 名全部能在磁盘上找到对应 .java,无悬空引用 —— 这一点与 MineTweaker3 那类"字符串反射出 5 个类名、3 个不存在"的情况不同。
计数脚本按需在枚举中的相对前缀(block_sounds、fml、models、models.particles、flowerpotcompat)展开定位;例如 "MixinEnhancedInfusionRecipe" 解析到 mixins/late/MixinEnhancedInfusionRecipe.java,"models.FRMAccessor" 解析到 mixins/early/models/FRMAccessor.java。
交互
条目通过两个加载器被消费:
GTNHLibCore.getMixins(Set<String> loadedCoreMods)→IMixins.getEarlyMixins(Mixins.class, loadedCoreMods)→ 走mixins.gtnhlib.early.jsonGTNHLibLateMixinLoader.getMixins(Set<String> loadedMods)→IMixins.getLateMixins(Mixins.class, loadedMods)→ 走mixins.gtnhlib.late.json
setApplyIf 的 lambda 在 early 阶段就要求值(eventbus/AutoEventBus 同类机制见 core/GTNHLibCore 的配置期注册),因此条件里引用的配置项必须在 coremod 构造期已就绪。
相关条目
- Mixin 引导流程 - 4 个 JSON 的空数组问题、preinit 独立通道与 ASM transformer
- GTNHLib 主配置 - 4 个被
setApplyIf引用的配置项 - 动态方块音效 - 条目 16 的接口侧文档
- 花盆兼容 - 条目 26、27 的接口侧文档