覆盖模块 Override
整个 mod 的数值都可通过一组独立于主配置的覆盖文件改写,用于整合包做深度平衡。这是 IguanaOverride 提供的扩展点。
- 模块:
Override(脉冲Override) - 默认状态:
defaultEnable = false——覆盖模块默认关闭(由PulsarCFG/Modules.cfg控制) - 执行时机:
FMLPostInitializationEvent(postInit)——必须在所有 mod 都注册完材料后执行 - 分类:
override/(8 个类)
类头注释给出的设计范围
/**
* Allows to override: - All material properties - Mining Levels of all tools - Harvest Levels of all oredict Entries -
* Harvest Levels of all blocks (overrides oredict)
*/
前置动作
new ForgeHooks(); // 触发 ForgeHooks 静态初始化,防止 initTools() 覆盖我们的改动
与 挖掘等级系统 中 modifyVanillaBlocks 开头做的事完全相同,注释:// new ForgeHooks() needed to avoid ForgeHooks.initTools() overwriting our changes。
5 组覆盖
doOverride(type, overrider) 对每组做两阶段处理:
- 用
<Type>Defaults.cfg生成默认文件(overrider.createDefault)——失败时通过IMCHandler.bigWarning打印警告并记日志,不中断; - 读入
<Type>Override.cfg(overrider.processConfig),有变更则config.save()写回。
| type | 文件 | 实现类 | 覆盖内容 |
|---|---|---|---|
Material |
MaterialOverride.cfg |
override/MaterialOverride.java |
全部材料属性:挖掘等级、耐久、速度、攻击、手柄系数 |
Tool |
ToolOverride.cfg |
override/ToolOverride.java |
所有工具(物品)的挖掘等级 |
Block |
BlockOverride.cfg |
override/BlockOverride.java |
所有方块的挖掘等级(含 OreDict 分类) |
BonusModifier |
BonusModifierOverride.cfg |
override/ModifierOverride.java |
全部 随机奖励 权重与有用性标记 |
HarvestLevelNames |
HarvestLevelNameOverride.cfg |
override/HarvestLevelNameOverride.java |
10 档 挖掘等级 的显示名与颜色 |
因此配置目录下会生成 10 个文件:5 个 *Defaults.cfg(只读参考)+ 5 个 *Override.cfg(实际生效)。
附加注册
MinecraftForge.EVENT_BUS.register(new ExtraHarvestLevelHandler());
override/ExtraHarvestLevelHandler 解决「同一方块部分 meta 需要工具」的漏洞,见 挖掘等级系统 的「混合等级方块的补充判定」一节。
BlockOverride 分类
BlockOverride.cfg 的 generaloredict 分类存放 10 档的通用 OreDict 材料名后缀(覆盖 HarvestLevelTweaks.oreDictLevels),oredict 分类存放完整的「前缀+材料 → 等级」组合(对应 8 个 oreDictPrefixes:ore, denseore, oreNether, denseoreNether, block, stone, brick, orePoor),blocks_<toolclass> 分类存放按工具类别划分的具体方块条目。
与主配置的关系
覆盖模块不改主配置。主配置的数值(见 各配置分类等条目)在覆盖模块关闭时生效;覆盖模块开启时,*Override.cfg 提供的值优先。
错误处理
所有 IOverride.processConfig 调用都包在 try { } catch (RuntimeException e) 中。IMCHandler.bigWarning 是 Tinkers’ 自己的告警通道(会打进日志并在某些情况下提示玩家),因此整合包写坏覆盖文件不会导致游戏崩溃。