材料逐项开关 enable.<材料>

这是"为什么我装了的材料没有 TGregworks 工具部件"的第一排查点。

键名与位置

TGregRegistry.registerToolParts() 里:

TGregworks.config.get(Config.Category.Enable, m.mName, true).getBoolean(true)

Config.Category.Enable = "enable",m.mName 是 GT Materials 枚举名。 所以键形如 enable.Iron / enable.Osmiridium / enable.SteelMagnetic, 分类 enable(没有第二段——与 enable.recipe.* 是同级的两棵子树)。

这些键是代码在遍历 Materials.values() 时按需创建的,配置文件里实际出现的材料集合 完全取决于装了哪些 GregTech 模块与哪个 MC 版本。

材料入选的完整判定

一个 GT 材料 m 会被注册成 TGregworks 工具材料,当且仅当同时满足 4 个条件 (TGregRegistry.registerToolParts 的 for 循环条件):

# 条件 源码 能否配置
1 (m.mTypes & 64) == 64 GT 材料的 mTypes 位 6(Materials 里表示"可作工具材料") 否
2 !doesMaterialExist(m) !addMaterialsAnyway && TConstructRegistry.toolMaterialStrings.containsKey(m.mName) 间接(addMaterialsAnyway)
3 gtMaterials.contains(m) GregTech_API.sGeneratedMaterials 列表内 否
4 config.get("enable", m.mName, true) 本页的逐项开关 是

doesMaterialExist 里被注释掉的第二段是 && Arrays.asList(GregTech_API.sGeneratedMaterials).contains(m) ——它与条件 3 重复,所以源码把它去掉了。

4 个条件的后果

条件 1:mTypes & 64

GT 侧的材料类型位。这一条把"熔融后是液体"(bit 0)之类的材料直接筛掉, 只有被 GT 标记为可作工具/工具材料的才进来。具体位含义由 GregTech 本体定义, 本 mod 只是位测试。

条件 2:TiC 同名材料

默认(addMaterialsAnyway = false)下,如果 TiC 已经有同名工具材料,该 GT 材料被整体跳过。 TiC 自带的材料名有 Iron / Gold / Diamond / Steel / Copper / Cobalt 等一批, 而 GT 的 Materials 也用同名枚举——两者重合的部分不会被 TGregworks 接管, 这些材料只能用 TiC 自己的部件配方。

⚠️ doesMaterialExist 只看名字,不看 ID。所以两个 mod 各自加了一个叫 Foo 的材料时, 后加载的那个会被静默吞掉,除非开 addMaterialsAnyway。

条件 3:GregTech_API.sGeneratedMaterials

GT 生成的材料列表,通常在 GT 的 postInit 阶段填充。这是 mod 加载顺序的硬依赖: 本 mod 在 preInit 读它,所以 GT 必须已经跑过 sGeneratedMaterials 的填充。

条件 4:本页开关

唯一能逐材料"手动摘除"的手段。设为 false 的材料会从 TGregworks.registry.toolMaterials 里消失,因此连带失去: 对应的 28 个部件实例、全部挤压/流固/抽取/合金炉配方、弩箭配方、 TGregFluidType 流体型、客户端渲染映射、材料 ID 分配。

addMaterialsAnyway 的联动

general.addMaterialsAnyway = true 会让条件 2 恒为 false(!addMaterialsAnyway 短路), 即无视 TiC 同名冲突强行注册。配置注释的原文警告: “Register Materials even if a material with the same name already exists. May override any material with the same name added by other mods.”

因为 TiC 的 toolMaterialStrings 是按名字索引的,重名注册的实际后果取决于 TiC 内部用哪个值覆盖, 源码无法保证——这是本 mod 唯一一处明确承认"可能覆盖别人的内容" 的地方。

相关条目