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)依次做四件事:

  1. 尝试把自身类加载器转型为 LaunchClassLoader,成功则排除 org.hotswap.agent 与 org.lwjglx.debug 两个包(Lwjgl3ifyCoremod.java:28-30)。转型失败走 catch (ClassCastException),仅打 warn 不中止(Lwjgl3ifyCoremod.java:31-36)。
  2. 调用 Config.loadConfig()(Lwjgl3ifyCoremod.java:37)—— 这是配置文件第一次被读入的时点。
  3. 检查 Launch.blackboard 的 lwjgl3ify:rfb-booted 键;若不为 Boolean.TRUE 则直接 return(Lwjgl3ifyCoremod.java:38-40),即 RetroFuturaBootstrap 未先行加载时不执行后续初始化。
  4. 键为真时调用 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

相关条目