配置项

本 mod 有两个配置文件,都在 config/SuperTiC/ 下(SuperTic.java:37-38)。

一、main.cfg

属性 值
路径 config/SuperTiC/main.cfg(SuperTic.java:38)
读取时机 postInit(SuperTic.java:53)
无 GUI @Mod 未声明 guiFactory,只能手改文件

Compat_Thaumcraft 分类

键 类型 默认值 取值范围 源码注释 源码
Thaumcraft boolean true — “Enables/Disables Thaumcraft support” Config.java:76
ThaumcraftLevel int 2 1 ~ 3(读取后再双向 clamp) “Difficulty for Thaumcraft modifier” Config.java:79

Compat_Bloodmagic 分类

键 类型 默认值 取值范围 源码注释 源码
Bloodmagic boolean true — “Enables/Disables Bloodmagic support” Config.java:77
RitualLP int 100000 1 ~ 80000000 “LP amount for the Spell of the diligent Tinkerer” Config.java:80-86

⚠️ 分类名大小写不一致:boolean 用 Compat_Bloodmagic(小写 m,Config.java:77), int 用 Compat_BloodMagic(大写 M,Config.java:82)。Forge 的 Configuration 分类名 是大小写敏感的,因此 main.cfg 里会出现两个不同的小节,玩家很容易只改到其中一个。

二、effects.cfg

属性 值
路径 config/SuperTiC/effects.cfg(SuperTic.java:37)
读取时机 postInit,在 mainConfig 之前(SuperTic.java:52-53)
结构 每个 TConstruct 材料一个分类,分类名 = TConstructRegistry.toolMaterials.get(i).materialName

每个材料分类下的 4 个键

键 类型 默认值 范围 源码注释 源码
Effect int 0 -255 ~ 255 “Effect id (if negative gets applied to player)” Config.java:29-35
Duration int 200 1 ~ Integer.MAX_VALUE ""(空注释) Config.java:38-44
Amplifier int 1 1 ~ Integer.MAX_VALUE ""(空注释) Config.java:47-53
Probability int 1 1 ~ Integer.MAX_VALUE “Chance effect gets applied 1 in X” Config.java:56-62

材料遍历范围

Config.idConfig 的循环是 for (int i = 0; !(i == 3000); i++),即遍历材料 id 0 ~ 2999 (Config.java:26)。每轮:

  • 若 TConstructRegistry.toolMaterials.get(i) != null → 读上面 4 个键入 map
  • 否则 → 四个值全部硬编码为 0 并入 map(Config.java:63-68)

Duration = 0 / Amplifier = 0 / Probability = 0 这些 0 值仍会被写入 map。 由于 addEffect 只在 id_eff != 0 时被调用(PotionEventHandler.java:57-76), 未配置材料的 0 值不会被使用;但如果某个材料只把 Effect 改成非 0 而 Probability 仍是 0,nextInt(0) 会抛 IllegalArgumentException——见 工具材料触发药水效果。

旧配置迁移

preInit 里若 event.getSuggestedConfigurationFile()(即旧的 config/SuperTic.cfg) 存在,用 com.google.common.io.Files.move 移动到 config/SuperTiC/effects.cfg (SuperTic.java:40-45)。

⚠️ 这是无条件覆盖移动:若目标 effects.cfg 已存在,Files.move 会抛 IOException,被 catch 后仅 printStackTrace()(SuperTic.java:43-45), 旧配置既没迁移成功也没有任何用户可读的报错(只有堆栈)。 且迁移目标只指向 effects.cfg,main.cfg 没有对应的迁移逻辑。

配置与兼容模块的联动

postInit 里两个兼容模块的启用条件是 Loader.isModLoaded(X) && Config.开关 双条件 (SuperTic.java:54-55):

if (Loader.isModLoaded("AWWayofTime") && Config.BM) BMCompat.bloody();
if (Loader.isModLoaded("Thaumcraft") && Config.TC) TCCompat.thaumic();

即:装了对应 mod 且开关为 true 才注册。这两个 Loader.isModLoaded 的 modid (AWWayofTime、Thaumcraft)与 @Mod 注解 dependencies 里写的 after:AWWayofTime / after:Thaumcraft(SuperTic.java:23)一致—— 血魔法在这里用的是 Blood Magic 1.7.10 fork 的 modid AWWayofTime。

配置类字段的可见性问题

Config.TC / Config.BM 是 package-private static(Config.java:17-18), idConfig / mainConfig 两个方法也是 package-private(Config.java:23、72), 外部包无法调用;TC_lvl / BM_LP 则是 public static(Config.java:20-21)。 TC_lvl / BM_LP 在 mainConfig 之前是 0,任何早于 postInit 读取它们的代码 都会拿到 0——InfusionModifierRecipe 依赖 TC_lvl,因此必须在 postInit 之后构造。