RetroFuturaBootstrap 插件
基本信息
| 属性 | 值 |
|---|---|
| 插件描述符 | src/main/resources/META-INF/rfb-plugin/hodgepodge.properties |
| 插件类 | com.mitchej123.hodgepodge.core.rfb.HodgepodgeRfbPlugin |
| 源目录 | core/rfb/(10 个 Java 文件:HodgepodgeRfbPlugin + hooks/ 4 + transformers/ 5) |
| 框架 | com.gtnewhorizons.retrofuturabootstrap.api.RfbClassTransformer(RetroFuturaBootstrap) |
| 编译依赖 | dependencies.gradle:17 —— compileOnly("com.gtnewhorizons.retrofuturabootstrap:RetroFuturaBootstrap:1.0.16") { transitive = false } |
| 关联 | Coremod 引导、ASM 变换器、早期配置 |
功能
RetroFuturaBootstrap(RFB)是 GTNHLib 提供的类加载前改写框架。与 FML coremod 相比,它的 transformer 拿到的是 ClassNodeHandle(可直接操作的 ASM 树),而 FML 那条路拿到的是已决定的字节数组。
Hodgepodge 通过 RFB 改写 Forge 自身的 2 个热点类,外加 2 个仅调试用的变换器。
描述符
META-INF/rfb-plugin/hodgepodge.properties:
| 键 | 值 |
|---|---|
name |
Hodgepodge |
version |
${version} —— Gradle 占位符,运行时由构建期替换 |
className |
com.mitchej123.hodgepodge.core.rfb.HodgepodgeRfbPlugin |
transformerExclusions |
com.mitchej123.hodgepodge.core.shared |
loadAfter |
mixin |
loadRequires |
gtnhlib |
loadBefore / versionConstraints / additionalVersions |
空 |
loadRequires=gtnhlib表示 RFB 插件在运行期需要 GTNHLib 在场。与mixins的顺序由loadAfter=mixin固定。
明细
插件生命周期
HodgepodgeRfbPlugin.java 只有两个覆写方法:
| 方法 | 行为 | 源位置 |
|---|---|---|
onConstruction(PluginContext) |
Launch.blackboard.put("hodgepodge.rfbPluginLoaded", TRUE) |
:21-24 |
makeTransformers() |
按 EarlyConfig 开关动态组装变换器数组 |
:27-40 |
4 个变换器
| 变换器 | 安装条件 | 目标类 | 用途 |
|---|---|---|---|
ForgeConfigurationTransformer |
!EarlyConfig.noLeanerForgeConfiguration |
Forge Configuration |
精简配置载入流程 |
ForgeEventSubscriptionTransformer |
!EarlyConfig.noFasterForgeEventTransformer |
Forge 事件订阅 | 加速事件分发 |
ConfigParsingTimeTransformer |
EarlyConfig.debugLogConfigParsingTimes(JVM -Dhodgepodge.logConfigTimes) |
配置类 | 仅调试:统计解析耗时 |
EnumValuesTransformer |
EarlyConfig.debugEnumValuesSpam(JVM -Dhodgepodge.logEnumValues) |
Enum.values() 调用点 |
仅调试:统计 values() 重复复制 |
后两项由 hooks/ 下的对应 Hook 类(ConfigParsingTimeHook、EnumValuesHook)承载逻辑。EnumValuesHook 在复制次数超阈值时写 EnumValuesDebug.csv(EnumValuesHook.java:41-53)。
已知的一处静默失败
EnumValuesHook.printResults() 的 catch (Throwable ignored) {}(EnumValuesHook.java:52)吞掉了调试 CSV 的写入失败。这是有意的 —— 它只包住调试输出,失败时丢掉一份诊断文件,不影响任何游戏行为。与之对照,Compat.java:52 的 catch (Exception ignored) {} 同样是探测式空 catch(检查 NEI 是否有书签面板 API)。
Hodgepodge 主体代码中没有其它空 catch(src/main/java 下非 mixin 目录全量扫描:仅此 2 处)。
数值
| 项 | 数量 |
|---|---|
| RFB 变换器 | 4(2 个生产 + 2 个调试) |
| 默认开启的生产变换器 | 2 |
| 默认关闭的调试变换器 | 2 |
| Hook 类 | 4(ConfigParsingTimeHook、EnumValuesHook、ForgeConfigurationHook、ForgeEventSubscriptionHook) |
| 变换器类 | 5(含 EnumASMHelper 工具类) |
相关条目
- Coremod 引导 - FML coremod 那条改写路线,与本插件并存
- ASM 变换器 - 走 FML coremod 的 12 个变换器
- 早期配置 - 决定本插件装哪几个变换器的 4 个开关
- Debug 配置 - 运行期诊断开关