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 完成:
- 读取
config/Betterloadingscreen/betterloadingscreen.cfg(如不存在则在start()中创建)。 - 根据配置选择
IDisplayer实现:useMinecraft=true→MinecraftDisplayerWrapper(使用 Minecraft 的 OpenGL 上下文渲染)- 否则若非 headless →
FrameDisplayer(Swing 窗口) - 否则
LoggingDisplayer(仅日志)
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 |
加载完成是否播放提示音 |
相关条目
- ProgressDisplayer 三种实现 - 客户端/Swing/日志三种模式
- FML 生命周期阶段 - ASM 监听 ProgressManager 派发的 7 个阶段
- 通用配置项 - useMinecraft / playSound