Mod 修复框架
基本信息
| 属性 | 值 |
|---|---|
| 包 | com.dreammaster.modfixes(3 框架文件 + 4 实现文件) |
| 接口 | IModFix(5 个方法) |
| 抽象基类 | ModFixBase(ModFixBase.java:11) |
| 注册表 | ModFixesMaster(ModFixesMaster.java:11) |
| 注册点 | MainRegistry.registerModFixes()(MainRegistry.java:436-448) |
| 实际注册的修复 | 2 |
| 开关 | CoreModConfig.ModFixes 分类(2 项) |
功能
一个轻量的「修复注册表」:修复类在 init() 前注册,随后由框架统一 init(),并按需自动挂到 Forge 或 FML 事件总线。
IModFix 接口
5 个方法,其中 4 个由修复类实现(IModFix.java:7-17):
| 方法 | 返回 | 作用 |
|---|---|---|
needsForgeEventBus() |
boolean |
是否注册到 MinecraftForge.EVENT_BUS |
needsFMLEventBus() |
boolean |
是否注册到 FMLCommonHandler.instance().bus() |
getModFixName() |
String |
修复名,ModFixBase 设为 final 实现 |
getIsActive() |
boolean |
是否处于激活状态(OilGeneratorFix 用它判断 BuildCraft 石油方块是否找到) |
init() |
boolean |
初始化,返回 false 表示失败 |
ModFixBase 自动挂总线
protected ModFixBase(String pModFixName) {
_mModFixName = pModFixName;
if (needsForgeEventBus()) {
MinecraftForge.EVENT_BUS.register(this);
}
if (needsFMLEventBus()) {
FMLCommonHandler.instance().bus().register(this);
}
}
(ModFixBase.java:15-24)—— 事件总线注册在构造器里完成,所以修复类一旦 new 出来就已挂好总线,之后 init() 只做实际初始化。getModFixName() 被声明为 final(ModFixBase.java:27),子类无法改名。
ModFixesMaster 的两道保护
| 保护 | 行为 |
|---|---|
| 晚注册 | registerModFix 时若 mEnabled 已为 true,记 error 日志并忽略该修复(ModFixesMaster.java:19-24) |
| 重名 | 同名修复已存在时记 error 日志(ModFixesMaster.java:28-32) |
| 重复 enable | enableModFixes() 被调用第二次时记 error 并返回(ModFixesMaster.java:36-39) |
enableModFixes() 遍历注册表逐个 init(),成功记 ModFix [X] initialized and enabled,失败记 ModFix [X] could not be initialized(ModFixesMaster.java:41-47),最后置 mEnabled = true(:48)。
实际注册的两个修复
registerModFixes() 只注册 2 个(MainRegistry.java:436-448):
| 修复 | 开关 | Forge 总线 | FML 总线 | getIsActive() |
|---|---|---|---|---|
OilGeneratorFix |
ModFixes.GenerateOil(默认 false) |
true |
false |
return _mBuildCraftOilBlock != null(OilGeneratorFix.java:114-116) |
MinetweakerFurnaceFix |
ModFixes.MinetweakerFurnaceFixEnabled(默认 true) |
true |
false |
true |
(总线声明见 MinetweakerFurnaceFix.java:22-29、OilGeneratorFix.java:130-137;getIsActive 见 MinetweakerFurnaceFix.java:32-34)
registerModFixes 还附带一个不属于本框架的动作:若 ZTones 加载,把 tile.glaxx 方块硬度设为 0.3F(MainRegistry.java:443-447,先判空 if (block != null))。
⚠️ 两个「看起来像死代码」但其实活着的类
FrankenskullFix 与 BlockHarvestToolFix 没有实现 IModFix,也不继承 ModFixBase,因此不出现在 registerModFixes() 里。初看像未注册的死代码,但:
$ grep -rn 'FrankenskullFix\|BlockHarvestToolFix' --include=*.java src/main/java
src/main/java/com/dreammaster/gthandler/GT_CustomLoader.java:9:import com.dreammaster.modfixes.biomesoplenty.BlockHarvestToolFix;
src/main/java/com/dreammaster/gthandler/GT_CustomLoader.java:10:import com.dreammaster.modfixes.enderIO.FrankenskullFix;
src/main/java/com/dreammaster/gthandler/GT_CustomLoader.java:143: FrankenskullFix.fixEnderIO();
src/main/java/com/dreammaster/gthandler/GT_CustomLoader.java:146: BlockHarvestToolFix.fixBOPHarvestTools();
它们被 GT_CustomLoader.run() 的前两步调用(GT_CustomLoader.java:142-147),各自带 isModLoaded 守卫:
| 类 | 触发条件 | 动作 |
|---|---|---|
FrankenskullFix.fixEnderIO() |
EnderIO.isModLoaded() |
通过 FMLInterModComms 给 EnderIO 的 recipe:soulbinder 发送一条配方 NBT(FrankenskullFix.java:31-32) |
BlockHarvestToolFix.fixBOPHarvestTools() |
BiomesOPlenty.isModLoaded() |
把 BoP 的 flesh 方块采集等级改为 shovel 0(BlockHarvestToolFix.java:10-14) |
结论:两者都是活的,不计入死代码。 它们只是放在 modfixes 包下的普通静态工具类,不走 IModFix 注册流程。
数值
| 数值名 | 值 |
|---|---|
IModFix 方法数 |
5 |
IModFix 实现类 |
2(OilGeneratorFix、MinetweakerFurnaceFix) |
registerModFixes() 注册数 |
2 |
modfixes 包下不在框架内的类 |
2(活代码,见上) |
| 包内文件总数 | 3 框架 + 4 实现 = 7 |
| 使用 Forge 总线的修复 | 2 |
| 使用 FML 总线的修复 | 0 |
| 默认启用的修复 | 1(MinetweakerFurnaceFixEnabled 默认 true) |
交互
| 修复 | 玩家侧效果 |
|---|---|
MinetweakerFurnaceFix |
允许 Minetweaker 脚本覆盖原版熔炉燃料处理器,使木质物品燃烧值可改(配置注释,CoreModConfig.java:68) |
OilGeneratorFix |
本 mod 额外生成石油;必须同时关闭 BuildCraft 的 Oil-Spawn(配置注释,CoreModConfig.java:72) |
FrankenskullFix |
EnderIO 灵魂绑定台多出一条配方(跨模组通信,无 GUI) |
BlockHarvestToolFix |
BoP flesh 方块可用铲子采集 |
所有修复均无独立 GUI / 指令,均由配置开关或前置模组决定是否生效。
相关条目
- CoreModConfig -
ModFixes分类的 2 个开关 - GT 配方加载器 - 调用两个静态修复类的
GT_CustomLoader.run() - 指令 - 本框架不注册任何指令