Coremod 安装与 ASM 注入

基本信息

属性 值
类型 Forge Coremod(IFMLLoadingPlugin)
主类 alexiil.mods.load.coremod.LoadingScreenLoadPlugin
转换器 alexiil.mods.load.coremod.BetterLoadingScreenTransformer
启动版本 @MCVersion("1.7.10")
注入时机 injectData(FML 启动阶段)

功能

BetterLoadingScreen 是一个 coremod + 普通 mod 双层结构。在 FML 加载早期(IFMLLoadingPlugin.injectData)就由 LoadingScreenLoadPlugin 完成:

  1. 读取 config/Betterloadingscreen/betterloadingscreen.cfg(如不存在则在 start() 中创建)。
  2. 根据配置选择 IDisplayer 实现:
    • useMinecraft=true → MinecraftDisplayerWrapper(使用 Minecraft 的 OpenGL 上下文渲染)
    • 否则若非 headless → FrameDisplayer(Swing 窗口)
    • 否则 LoggingDisplayer(仅日志)
  3. Translation.addTranslations(coremodLocation) 把 assets/betterloadingscreen/lang/*.lang 全部加载到 Translation.translators。

ASM 转换器

BetterLoadingScreenTransformer.transform 使用 Java 17 switch 表达式对以下类做字节码注入:

目标类 转换目的
net.minecraft.launchwrapper.ObjectFactory$ClientObjectFactory 在客户端 Minecraft 启动前 hook(具体挂钩缺失可改为附加逻辑)
cpw.mods.fml.client.SplashProgress 把 enabled 反射设为 false(overrideForgeSplashProgress 备用)
cpw.mods.fml.common.ProgressBar / cpw.mods.fml.common.ProgressManager 在 push / step / pop 后回调 FMLProgressTracker.onBarPush/Step/Pop
net.minecraft.client.Minecraft 在主类加载完成后挂钩(具体注入点由 transformer 实现)

转换器本身对 alexiil.mods.load.coremod 包启用 @IFMLLoadingPlugin.TransformerExclusions,避免循环转换。

资源注入

  • LoadingScreenLoadPlugin.injectData 还会让 ProgressDisplayer.start(coremodLocation) 创建一个 DummyModContainer,使 mod 能从 config/Betterloadingscreen/betterloadingscreen.cfg 读取配置。
  • 若 coreModLocation.isDirectory()(开发环境),MinecraftDisplayer.open 用 FMLFolderResourcePack 注册;否则用 FMLFileResourcePack,再调 mc.refreshResources(),让 randomBackgrounds 引用的纹理即时可用。

数值

数值 默认值 说明
useMinecraft true 决定 IDisplayer 实现
playSound true 加载完成是否播放提示音

相关条目