铸造格与造价公式
基本信息
| 属性 | 值 |
|---|---|
| 配方类 | 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)
逐条判定,任一不过即失败:
- 中心格非空,且能被
TCWandAPI.getWrapperForRod(rod, false)识别 - 杖身研究已完成(
ResearchManager.isResearchComplete,用getResearchName()) - 螺丝格:4 格都非空,且每一格的 ore dict 都含
details.getScrew() - 导体格:2 格都匹配
details.conductor()(itemMatches(..., true)宽松匹配) - 端盖格:同一种端盖、且该端盖研究已完成
- 权杖额外:
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,不写进研究页的配方列表。