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 / 指令,均由配置开关或前置模组决定是否生效。

相关条目