弩箭配方

弩箭是双材料部件(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) 的逻辑:

  1. 遍历全部格子(getSizeInventory(),不是 2×2 也不是 3×3,因此只在工作台可用);
  2. 空槽跳过;
  3. isEqualType(PartTypes.ArrowHead, slot.getItem()) 命中 → 记为 head,已有 head 则 return false(只允许一个箭头);
  4. isEqualType(PartTypes.ToolRod, slot.getItem()) 命中 → 记为 rod,已有 rod 则 return false;
  5. 其他任何物品 → return false;
  6. rod == null || head == null → return false;
  7. 输出 = 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 里是不同代码路径,不要混淆。

相关条目