铸造格与造价公式

基本信息

属性 值
配方类 GTNHWandRecipe(杖)、GTNHScepterRecipe(权杖,继承前者)
配方数 2(动态配方,注册进 ThaumcraftApi.addArcaneCraftingRecipe)
实现接口 IArcaneRecipe + IMultipleResearchArcaneRecipe(SalisArcana,可选)

两种铸造格

杖 —— XSC / SRS / CSX(3×3)

格位 0 1 2 3 4 5 6 7 8
物品 X S C S R S C S X
  • X 导体 ×2 → SLOT_CONDUCTOR = {0, 8}
  • S 螺丝 ×4 → SLOT_SCREW = {1, 3, 5, 7}
  • C 端盖 ×2 → SLOT_CAP = {6, 2}
  • R 杖身 ×1 → SLOT_CORE = 4

权杖 —— XCP / SRC / CSX(3×3)

格位 0 1 2 3 4 5 6 7 8
物品 X C P S R C C S X
  • X 导体 ×2(继承 SLOT_CONDUCTOR)
  • C 端盖 ×3 → SLOT_CAP = {6, 5, 1}
  • S 螺丝 ×2 → SLOT_SCREW = {3, 7}(覆盖父类的 4 格)
  • P 原初护符 ×1 → SLOT_CHARM = 2, 物品为 new ItemStack(ConfigItems.itemResource, 1, 15)(Thamcraft 的原初护符)
  • R 杖身 ×1

⚠️ 权杖是「3 端盖 + 2 螺丝 + 1 原初护符」,杖是「2 端盖 + 4 螺丝」, 材料数量结构完全不同,合成时不要照搬。

匹配规则(matches,GTNHWandRecipe.java:29-44)

逐条判定,任一不过即失败:

  1. 中心格非空,且能被 TCWandAPI.getWrapperForRod(rod, false) 识别
  2. 杖身研究已完成(ResearchManager.isResearchComplete,用 getResearchName())
  3. 螺丝格:4 格都非空,且每一格的 ore dict 都含 details.getScrew()
  4. 导体格:2 格都匹配 details.conductor()(itemMatches(..., true) 宽松匹配)
  5. 端盖格:同一种端盖、且该端盖研究已完成
  6. 权杖额外:P 格匹配原初护符(GTNHScepterRecipe.checkPrimalCharm)

getWandWrapper 在权杖里被覆写为 getWrapperForRod(rod, **true**)(staff 模式), 所以杖类配方用普通杖身、权杖配方用 staff 杖身。

造价公式

权杖造价 = (int) ((base + cap × capMultiplier) × sceptreMultiplier)

由 AbstractWandWrapper.getRecipeCost(:31-33)与 WandWrapper.getRecipeCost(:22-25)分层实现: 父类先算 base + cap × capMultiplier,权杖子类再乘 sceptreMultiplier 并取整。

产出与数据

getCraftingResult(:76-81)→ wandWrapper.getItem(capWrapper):

  • NBT 写入 rod = 杖身 tag、cap = 端盖 tag
  • 权杖额外写 sceptre = 1(WandWrapper.getItem,:28-36)
  • ⚠️ 物品 durability = 造价(ItemWand.setMaxDamage(recipeCost))

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

  • ⚠️ getAspects 的语义:返回 AspectList, 对全部 6 个原初要素各加 recipeCost 点(:95-97)。 即六大要素等量消耗,总 vis = 6 × recipeCost。 写条目时不能说成「每种要素各 recipeCost」而不点明是 6 倍总量。
  • ⚠️ 返回 null 的三个方法(:106-118): getRecipeOutput() → null、无参 getAspects() → null、 getResearch() → ""(GTNHWandRecipe)。 权杖子类把 getResearch() 覆写成 "SCEPTRE"。 ⚠️ getRecipeOutput() 返回 null 对 IArcaneRecipe 而言是契约违反, 依赖该方法的研究页面存在 NPE 风险;本仓库内未复现, 标为潜在风险而非已确认 bug。
  • salisArcana$getResearches 杖返回长度 2、权杖返回长度 3 (杖身研究 / 端盖研究 / SCEPTRE),是 SalisArcana 的多研究关联。
  • GTNHWandRecipe 标注 @Optional.Interface(iface=IMultipleResearchArcaneRecipe.class, modid="salisarcana"), ⇒ 未装 SalisArcana 时该接口方法不会被调用。
  • 两个配方通过 CraftingManager 取出(TCWandAPI.makeWands,:74-79) 存入静态 wandRecipe / sceptreRecipe,不写进研究页的配方列表。