端盖(Cap)造价倍率表

基本信息

属性 值
注册方式 TCWandAPI.regCap(new CapWrapper(name, costMultiplier))
无条件注册 6 个(GTWandRegistry.java:44-49)
条件注册 13 个(5 个附属块内)
研究 key 默认 "CAP_" + name(CapWrapper.java:20)

⚠️ 端盖的第二个参数不是造价,而是「造价乘数」。 CapWrapper(String name, int costMultiplier)(:12-14)会去 thaumcraft.api.wands.WandCap.caps.get(name) 取原版已注册端盖的物品, 本 mod 不新增端盖物品,只改它们的合成代价权重。

无条件注册(6 个)

端盖 tag costMultiplier 研究 key
iron 0 CAP_iron
copper 1 CAP_copper
gold 2 CAP_gold
silver 3 CAP_silver
thaumium 5 CAP_thaumium
void 7 CAP_void

⚠️ iron 的乘数是 0 —— 铁端盖的 cap 项贡献为 capCost × 0 = 0,即完全免去端盖部分的 vis 成本。 这是本 mod 中最极端的一档,不要写成 1。

条件注册(13 个)

所属模组 端盖 tag costMultiplier
Forbidden Magic manasteel 6
Forbidden Magic terrasteel 1
Forbidden Magic elementium 7
Forbidden Magic vinteum 5
Forbidden Magic alchemical 6
Thaumic Tinkerer ICHOR 8(全表最高)
Blood Arsenal blood_iron 6
Tainted Magic cloth 3
Tainted Magic crimsoncloth 6
Tainted Magic shadowcloth 5
Tainted Magic shadowmetal 8
Thaumic Bases thauminite 6
Thaumic Exploration SOJOURNER 5
Thaumic Exploration MECHANIST 5

(表中 14 行,其中 Forbidden Magic 5 + TT 1 + BA 1 + TM 4 + TB 1 + TE 2 = 14; CompatibleMods 覆盖 6 个模组。)

Tainted Magic 的两步覆写

GTWandRegistry.java:89-107 对 shadowcloth / crimsoncloth 先改 Thamcraft 侧参数、再包一层 CapWrapper,顺序不能颠倒:

端盖 makeCap 的 discount makeCap 的 cost 随后 regCap 的乘数
shadowcloth 0.85F 7 5
crimsoncloth 0.80F 9 6
  • discount(0–1)是 Thamcraft 侧的要素折扣系数(越小越便宜)
  • cost 是 Thamcraft 侧的端盖基础造价
  • costMultiplier 是本 mod 自己的端盖项乘数

makeCap 还会设置 ResourceLocation 贴图,指向 taintedmagic:textures/models/ModelWAND_CAP_{SHADOW,CRIMSON}_CLOTH.png (引用的是别的模组的资源域,本仓库内无这些贴图)。

源码核对(2026-10-01 审计)

  • ⚠️ CapWrapper 构造会 NPE:new CapWrapper(name, costMultiplier) 直接 WandCap.caps.get(name).getItem()(:13), 不判空。若某端盖未被 Thamcraft(或对应附属)注册, 此行抛 NullPointerException 且没有任何可读的报错信息。
  • capTagToWrapper(TCWandAPI.java:32)是 Map<String, CapWrapper>, 同名 regCap 会静默覆盖先前的条目(Map.put 语义), 而 caps 列表里两条都在 ⇒ getCaps() 与 getWrapperForCap() 可能不一致。 当前 GTWandRegistry 中无同名重复。
  • 端盖也要求完成研究才能合成(GTNHWandRecipe.checkCaps,:63)。
  • 合成时两个端盖格必须放同一种端盖: OreDictionary.itemMatches(cap, inv.getStackInSlot(SLOT_CAP[1]), true)(:64)。 权杖则是三个端盖格全同(GTNHScepterRecipe.checkCaps,:55-56)。