FML 加载插件
基本信息
| 属性 | 值 |
|---|---|
| modid | lwjgl3ify |
| @Mod 类 | me.eigenraven.lwjgl3ify.Lwjgl3ify |
| acceptedMinecraftVersions | [1.7.10] |
| IFMLLoadingPlugin 实现 | me.eigenraven.lwjgl3ify.core.Lwjgl3ifyCoremod |
| SortingIndex | Integer.MAX_VALUE - 2 |
| 早期 mixin 配置 | mixins.lwjgl3ify.early.json |
| 晚期 mixin 配置 | mixins.lwjgl3ify.late.json |
| 注册方块 / 物品 / 实体 / TileEntity | 0 / 0 / 0 / 0 |
| 注册实体 / 材质 / 配方 / 指令 | 0 / 0 / 0 / 0 |
Lwjgl3ify 同时以 FML 模组 和 FML 加载插件(coremod) 两种身份存在,入口分别在 Lwjgl3ify.java:21-27 与 Lwjgl3ifyCoremod.java:22。
功能
@Mod 入口
Lwjgl3ify 是 jar 中唯一带 @Mod 注解的类(grep -rn '@Mod' src/main/java/ 在 me/eigenraven/lwjgl3ify/ 下只命中 Lwjgl3ify.java:21,其余 10 处命中是 @ModifyConstant / @ModifyExpressionValue / @Mod.Instance / @Mod.EventHandler 等同名前缀的 mixin 注解与处理器,不是新的 @Mod 声明)。
生命周期只有两个阶段:
| 阶段 | 位置 | 行为 |
|---|---|---|
| preInit | Lwjgl3ify.java:40-56 |
调用 PROXY.runCompatHooks(),随后自检:实例化 ConfigUtils 并断言 isLwjgl3ifyLoaded()、isConfigLoaded() 均成立,且 utils.getExtensibleEnums() 与 Config.getExtensibleEnums() 引用相等,任一不成立即抛 IllegalStateException(Lwjgl3ify.java:48,51,54) |
| postInit | Lwjgl3ify.java:58-86 |
调用 PROXY.registerEventHandler();随后反射读取 LaunchClassLoader 的 classLoaderExceptions / transformerExceptions 两个私有 Set<String> 并排序后逐条打日志(Lwjgl3ify.java:63-82) |
postInit 的反射读取失败只记 LOG.warn(Lwjgl3ify.java:83-85),属于非致命降级。
IFMLLoadingPlugin 入口
Lwjgl3ifyCoremod 的构造器(Lwjgl3ifyCoremod.java:26-42)依次做四件事:
- 尝试把自身类加载器转型为
LaunchClassLoader,成功则排除org.hotswap.agent与org.lwjglx.debug两个包(Lwjgl3ifyCoremod.java:28-30)。转型失败走catch (ClassCastException),仅打 warn 不中止(Lwjgl3ifyCoremod.java:31-36)。 - 调用
Config.loadConfig()(Lwjgl3ifyCoremod.java:37)—— 这是配置文件第一次被读入的时点。 - 检查
Launch.blackboard的lwjgl3ify:rfb-booted键;若不为Boolean.TRUE则直接 return(Lwjgl3ifyCoremod.java:38-40),即 RetroFuturaBootstrap 未先行加载时不执行后续初始化。 - 键为真时调用
LateInit.lateConstruct()(Lwjgl3ifyCoremod.java:41)。
getASMTransformerClass() 返回空数组(Lwjgl3ifyCoremod.java:45-47)—— 该 coremod 不注册任何传统 FML ASM 转换器;所有字节码改写由 RetroFuturaBootstrap 侧的 RFB 转换器完成(见 RFB 字节码转换器)。getModContainerClass()、getSetupClass()、getAccessTransformerClass() 全部返回 null(Lwjgl3ifyCoremod.java:50-65),injectData 是空实现(Lwjgl3ifyCoremod.java:60)。
getMixins(Set<String>) 委托给 IMixins.getEarlyMixins(Mixins.class, loadedCoreMods)(Lwjgl3ifyCoremod.java:74),并在客户端且 Config.MIXIN_STBI_TEXTURE_STITCHING 为真但结果中缺 game.MixinStitcher 时打一条 error 级日志,提示移除 FastCraft 或升级到 FastCraft 1.25 并加 OptiFine(Lwjgl3ifyCoremod.java:75-82)。
LateInit
LateInit.lateConstruct()(LateInit.java:9-20)先强制加载 javax.script.ScriptEngineManager 以确保 javax.script 可用,失败则包成 RuntimeException 重抛(LateInit.java:11-15);仅客户端调用 org.lwjglx.Sys.initialize()(LateInit.java:16-19)。
配置 GUI 工厂
@Mod(guiFactory = "me.eigenraven.lwjgl3ify.client.GuiFactory")(Lwjgl3ify.java:27)指向 GuiFactory,其 mainConfigGuiClass() 返回 GuiConfigLwjgl3ify.class(GuiFactory.java:17-19)。runtimeGuiCategories() 与 getHandlerFor(...) 均返回 null(GuiFactory.java:22-29),因此不提供运行时可调项。
数值
| 数值 | 值 | 来源 |
|---|---|---|
@Mod 类数量 |
1 | src/main/java/me/eigenraven/lwjgl3ify/Lwjgl3ify.java:21 |
@Mod.EventHandler 数量 |
2(preInit / postInit) | Lwjgl3ify.java:40、:58 |
| SortingIndex | 2147483645(Integer.MAX_VALUE - 2) |
Lwjgl3ifyCoremod.java:21 |
| coremod 构造器中排除的包 | 2(org.hotswap.agent、org.lwjglx.debug) |
Lwjgl3ifyCoremod.java:29-30 |
getASMTransformerClass() 返回长度 |
0 | Lwjgl3ifyCoremod.java:46 |
| postInit 反射读取的排除项集合 | 2(classLoaderExceptions、transformerExceptions) |
Lwjgl3ify.java:63-66 |
交互
| 触发 | 行为 |
|---|---|
| 客户端启动 | preInit 运行兼容钩子 + 三项自检;postInit 注册 Forge 事件总线 |
| 服务端启动 | 同样运行两个阶段;CommonProxy.registerEventHandler() 是空方法(CommonProxy.java:8),故不注册任何处理器 |
| RFB 未先行加载 | 构造器在读完配置后提前 return,LateInit 不执行 |
启动器类加载器非 LaunchClassLoader |
排除包失败,仅 warn |
相关条目
- RFB 加载插件 - 在 coremod 之前运行的启动期插件,负责设置
lwjgl3ify:rfb-booted黑板键 - RFB 字节码转换器 - 承接
getASMTransformerClass()主动返回的 0 个转换器 - 第三方兼容钩子 -
runCompatHooks()实际安装的内容 - lwjgl3ify.cfg 配置 -
Config.loadConfig()读入的文件