Legacy Metal Pattern 兼容层
vexatos.tgregworks.integration.smeltery.CastLegacy。
当 Tinkers’ Smeltery 模块没有加载时,本 mod 自带一个 TiC 的 MetalPattern 实例,
让 23 个部件的 pattern 在没有熔炼模块时依然可用。
触发条件
TGregworks.preInit:
if (!TConstruct.pulsar.isPulseLoaded("Tinkers' Smeltery")) {
CastLegacy.preInit();
}
CastLegacy.metalPattern 是 public static Item,初始为 null,只有满足条件时才被赋值。
这个字段被三处读取:
| 读取点 | 用途 |
|---|---|
Pattern.MetalPatterns.getPatternItem() |
TinkerSmeltery.metalPattern != null ? TinkerSmeltery.metalPattern : CastLegacy.metalPattern |
Pattern.WeaponryPatterns.getPatternItem() |
无条件返回 TinkerWeaponry.metalPattern,不读本字段 |
TGregRecipeRegistry.addGregTechPartRecipes |
castExtruderRecipes 配置项的默认值 CastLegacy.metalPattern != null |
preInit 做了什么
metalPattern = new MetalPattern("cast_", "materials/").setUnlocalizedName("tconstruct.MetalPattern");
GameRegistry.registerItem(metalPattern, "metalPattern");
new MetalPattern("cast_", "materials/") —— 前缀 + 目录两个参数,
直接复用 TiC 的类,所以纹理路径是 tconstruct:materials/cast_<n>。
setUnlocalizedName("tconstruct.MetalPattern") 复用 TiC 的语言键 →
没有 Smeltery 时这些语言条目可能不存在,物品名会退化成注册名。
然后 23 个 subtype 逐个 TConstructRegistry.addItemStackToDirectory("<name>Cast", new ItemStack(metalPattern, 1, i))。
完整对照表见 部件铸件。
remap:唯一的跨存档迁移
TGregworks.remap(FMLMissingMappingsEvent e) → CastLegacy.remap(e):
if (TinkerSmeltery.metalPattern == null) return; // Smeltery 仍然没加载 → 无事可做
for (FMLMissingMapping mapping : e.get())
if (mapping.name.equalsIgnoreCase("TGregworks:metalPattern") // 忽略大小写
&& mapping.type == GameRegistry.Type.ITEM)
mapping.remap(TinkerSmeltery.metalPattern);
| 要素 | 值 |
|---|---|
| 触发事件 | FMLMissingMappingsEvent(不是 @Mod.EventHandler 的常规生命周期,是 FML 的特殊回调) |
| 方法签名 | public void remap(FMLMissingMappingsEvent e)(TGregworks 上的 @EventHandler 无注解标注) |
| 匹配名 | TGregworks:metalPattern(equalsIgnoreCase) |
| 类型过滤 | GameRegistry.Type.ITEM |
| 目标 | TinkerSmeltery.metalPattern |
条件很反直觉:remap 只在 TinkerSmeltery.metalPattern != null 时才干活,
即 Smeltery 后来又被装上了的存档才会重映射。
如果 Smeltery 一直没装,CastLegacy.metalPattern 继续有效,无需重映射。
这条路径解决的是"先用 smelteryless 配置建档,后来才装 Smeltery"的迁移问题:
23 个 subtype 的铸件会整体转交给 TiC 的 MetalPattern,
MetalPattern 内部的 pattern 编号在两个实现间是兼容的(都是同一份
MetalPatterns 枚举顺序)。
对配方的影响
Pattern.MetalPatterns.getPatternItem() 的三元是关键:
- 有 Smeltery → pattern 是 TiC 官方
metalPattern,metadata 0–22 对应 23 个部件, 剩余 5 个(nothing1/nothing2/arrowhead/gem/nugget)也有 TiC 的实现; - 无 Smeltery → pattern 是本 mod 的 legacy 实例,同样 0–22。
后 5 个在 legacy 模式下没有对应实现——但实际无影响:没有任何
PartTypes引用这 5 个枚举值, 5 个武器部件走WeaponryPatterns(不读本字段),Chunk的pattern是null。
对配置的影响
addCastExtruderRecipes 的默认值 = CastLegacy.metalPattern != null:
| 场景 | 字段值 | castExtruderRecipes 默认 |
后果 |
|---|---|---|---|
| 装了 Smeltery | null |
false | GT 不再压铸件(TiC 官方铸件可用) |
| 无 Smeltery | 非 null |
true | GT 必须压铸件,否则 23 个 legacy 铸件无法获得 |
同时 tinkersconstructcastrecipe 里"黄铜板 + 黑曜石碎片 → 碎片铸件"这条配方的注册条件是
brassstack != null && !addCastExtruderRecipes,即只在"铸件系统不可用"时才补。
两个条件互斥,永远只存在一条。