LoadControllerMixin
基本信息
| 属性 | 值 |
|---|---|
| 全名 | io.github.tox1cozz.mixinbooterlegacy.loader.mixin.LoadControllerMixin |
| 文件 | module-mixinbooterlegacy/src/main/java/…/loader/mixin/LoadControllerMixin.java |
| 行数 | 104 |
| 目标 | LoadController |
| 所属配置 | mixin.mixinbooterlegacy.json |
| 启用版本 | Minecraft 1.7.10 |
注入点
@Mixin(value = LoadController.class, remap = false)
public class LoadControllerMixin {
@Inject(method = "distributeStateMessage(Lcpw/mods/fml/common/LoaderState;[Ljava/lang/Object;)V",
at = @At("HEAD"))
| 项 | 值 |
|---|---|
| 目标类 | LoadController |
remap |
false |
| 注入方法 | distributeStateMessage |
| 描述符 | (Lcpw/mods/fml/common/LoaderState;[Ljava/lang/Object;)V |
at |
HEAD |
实现要点
⚠️ remap = false 是必需的:LoadController 是 MixinBooter 自身的类,
不参与 Minecraft 混淆名映射。描述符里 LoaderState 用的是
cpw.mods.fml.common.LoaderState 全限定名而非内部名 aI,
正是 remap = false 的体现。
⚠️ distributeStateMessage 是 FML 状态分发方法 ——
在该方法 HEAD 注入意味着能在 FML 各加载阶段(CONSTRUCTING / PREINIT / etc.)
的最开始插入逻辑。这正是实现「早期 / 晚期 mixin 编排」的关键挂载点。
⚠️ 本 mixin 内部会主动抛 MixinInitialisationError,当被注解的类
标了 @LateMixin 却没实现 ILateMixinLoader 接口时:
throw new MixinInitialisationError(String.format(
"The class %s has the LateMixin annotation, but does not implement the ILateMixinLoader interface.",
clazz.getName()));
即晚期 mixin 的前置契约校验,不满足则直接失败。
⚠️ 3 个模块各有 1 个针对 LoadController 的 mixin
| 模块 | 类 | 是否被应用 |
|---|---|---|
| module-mixinbooterlegacy | 本类 | 配置有列出,但该配置未列入 manifest |
| module-gtnhmixins | LateMixinOrchestrationMixin | 是 |
| module-gasstation | com/falsepattern/gasstation/mixins/mixin/LoadControllerMixin.java |
否(mixins 数组为空) |
⚠️ 三个 mixin 注入同一方法(gtnhmixins 那个也注入
distributeStateMessage 的 HEAD)。@Inject 到同一 HEAD 位置时,
多个注入器按 mixin 优先级与配置加载顺序依次执行,顺序不保证。
相关条目
- mixin 配置对照 - 4 个配置的
required/minVersion对照 - module-mixinbooterlegacy - 所属模块
- LateMixinOrchestrationMixin - 同一目标的另一 mixin
- module-gtnhmixins - 早期 / 晚期 mixin 体系