弩箭配方
弩箭是双材料部件(DualMaterialToolPart:手柄一种材料 + 箭头另一种材料),
所以它有两条完全独立的获取路径,分别对应工作台与 GregTech 流固机。
两条路径都在 TGregRecipeRegistry.registerBoltRecipes() 里注册,且都有门控。
门控
| 顺序 | 条件 | 不满足时 |
|---|---|---|
| 1 | TConstruct.pulsar.isPulseLoaded("Tinkers' Weaponry") |
整个方法直接 return,工作台版与流固机版都没有 |
| 2 | PHConstruct.alternativeBoltRecipe |
不注册 TGregAlternateBoltRecipe(工作台版) |
| 3 | TConstruct.pulsar.isPulseLoaded("Tinkers' Smeltery") |
第二个 return——工作台版已注册,流固机版全无 |
所以流固机版弩箭需要 Smeltery 加载(因为要用 TConstructRegistry.getTableCasting() 反查浇铸配方)。
路径 1:工作台无序合成(TGregAlternateBoltRecipe)
PHConstruct.alternativeBoltRecipe(TiC 自身配置)打开时注册,
用 RecipeSorter.register("TGregworks:part", TGregAlternateBoltRecipe.class, SHAPELESS, "") 注册为无序配方。
matches(InventoryCrafting, World) 的逻辑:
- 遍历全部格子(
getSizeInventory(),不是 2×2 也不是 3×3,因此只在工作台可用); - 空槽跳过;
isEqualType(PartTypes.ArrowHead, slot.getItem())命中 → 记为head,已有 head 则 return false(只允许一个箭头);isEqualType(PartTypes.ToolRod, slot.getItem())命中 → 记为rod,已有 rod 则 return false;- 其他任何物品 → return false;
rod == null || head == null→ return false;- 输出 =
DualMaterialToolPart.createDualMaterial(TinkerWeaponry.partBolt, rod材料ID, head材料ID)。
isEqualType(part, input) = input instanceof ItemTGregPart ? part == ((ItemTGregPart) input).getType() : input == part.getCounterpart()
——与 TGregToolRecipe.isEqualType 完全同构,所以 GT 箭头 + TiC 手柄、TiC 箭头 + GT 手柄都能用。
getRecipeSize() 返回 2(只是显示用,实际遍历全部格子)。
路径 2:GT 流固机
registerBoltRecipes() 主体(详见 流固机配方 的配方 5)。
要点:
- 遍历
FluidType.fluidTypes里所有isToolpart == true的流体型 ×TConstructRegistry.toolMaterials.keySet()里全部 TiC 材料; - 至少一端必须是 GT 的(
!materialIDMap.containsKey(id) && !(fluidType instanceof TGregFluidType)→ 跳过); useNonGTFluidsForBolts/useNonGTToolRodsForBolts两个开关(默认都true)是最终过滤;- 输出材料顺序是
createDualMaterial(partBolt, 手柄ID, 箭头ID)—— 手柄在前、箭头在后, 与TGregAlternateBoltRecipe的createDualMaterial(partBolt, mat1=rod, mat2=head)一致; - 时长 =
80 + (手柄耐久 + 箭头耐久) × 2; - 电压 =
max(getPowerRequired(手柄), getPowerRequired(箭头)), 这里getPowerRequired(ToolMaterial t)判的是t.harvestLevel < 3(与部件配方的Materials.mToolQuality判据不同)。
第三个副作用:删除 TiC 的动态弩箭配方
方法结尾会遍历 TConstructRegistry.getTableCasting().getCastingRecipes(),
把满足「cr.cast.getItem() == TinkerTools.toolRod 且该手柄的材料 ID 属于
materialIDMap」的 CastingRecipe 全部 removeAll。
目的是消除"砧台浇铸弩箭"与"流固机造弩箭"的重复产出。
详见 流固机配方 末节。
箭与弩箭不是一回事
TGregRecipeRegistry.addRecipesForToolBuilder() 里注册了一条箭的配方
(TGregAmmoRecipe(箭头, 手柄, 箭羽, arrowAmmo) + addHandleItem(partArrowShaft)),
见 工具配方表。箭是单材料工具,弩箭是双材料部件——
两者在本 mod 里是不同代码路径,不要混淆。