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,即只在"铸件系统不可用"时才补。 两个条件互斥,永远只存在一条。

相关条目