对外 API(api 包)

基本信息

属性 值
发布包 apiPackage = api(gradle.properties:102)
入口类 com.gtnewhorizons.tcwands.api.TCWandAPI
面向对象 其他模组(本 mod 自身除 GTWandRegistry 外不消费自己的 API)

gradle.properties 的 apiPackage = api 意味着构建脚本会把 com.gtnewhorizons.tcwands.api 整包注册为 mod 的 API 包, 供其他 mod 静态依赖(compileOnly + api 传递)。

TCWandAPI 公开方法

方法 作用
regRod(IWandRegistry) 向 WandRecipeCreator 注册一个杖身
regCap(IWandRegistry) 注册一个端盖及其造价乘数
removeTCWands() 删光 ThaumcraftApi 里的全部杖/权杖配方(内部使用)
makeWands() 注册那 2 条动态配方(内部使用)
getWands() / getSceptres() 供研究页取配方的静态列表
getWrapperForRod(ItemStack, boolean) 按物品查杖身包装器,boolean = 是否 staff
getWrapperForCap(ItemStack) 按物品查端盖包装器
getWrapperForRodByTag(String, boolean) 按 tag 查杖身
getWrapperForCapByTag(String) 按 tag 查端盖
getProgressionForCap(IWandRegistry) 端盖→所需杖身集合(研究页用)
getProgressionForCapTag(String) 同上,按 tag
makeCap(...) / makeWand(...) 覆写 Thamcraft 侧 WandCap / WandRod 的原始参数(物品/贴图/折扣/造价)

⚠️ makeCap / makeWand 会改写 Thamcraft 自己的注册表, 本 mod 的 Tainted Magic 块正是用它把 crimsoncloth / shadowcloth 的折扣改成 0.80F / 0.85F。

供其他 mod 使用的 4 个类型

类型 用途
WandRecipeCreator 链式构建一个杖身的全部配方
CapWrapper 端盖包装器(自动从 WandCap.caps 取物品)
IWandRegistry 上述两者的公共接口,便于解耦
GTNHWandRecipe / GTNHScepterRecipe 2 条动态配方,直接可 new 出来加进 ThaumcraftApi.addArcaneCraftingRecipe

WandRecipeCreator 的 8 个链式方法: regWandRecipe(两个重载)、regSceptreRecipe、 regStaffRecipe、regUpwardStaffRecipe、regStaffSceptreRecipe、 regDepSceptreRecipe、regStaffDepSceptreRecipe。

使用流程(源码给出的范式)

new WandRecipeCreator("mytag")
    .regWandRecipe(baseCost, capCost, GTTier.HV)
    .regSceptreRecipe(1.5F)
    .regStaffDepSceptreRecipe(1.2F);
new CapWrapper("mycap", 4);

⚠️ 顺序要求:必须先 regWandRecipe / regStaffRecipe, 之后才能调 regUpwardStaffRecipe(它需要读 wandDetails.tier())。

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

  • ⚠️ 源码缺陷:NPE 风险不一致。WandRecipeCreator 中 regSceptreRecipe(:75-80)与 regDepSceptreRecipe(:102-107) 在 wandDetails == null 时抛带说明的 IllegalStateException; 但 regUpwardStaffRecipe(:97-100) 直接 wandDetails.tier(),无判空 ⇒ 顺序写错时是裸 NPE。
  • ⚠️ 源码缺陷:customResearchName 被消费、customCraftingRod 不被消费。 applyCustomizations(:114-137)在处理完后把 customResearchName 置 null,而 customCraftingRod 保持不变。 源码 Javadoc 明确这是设计(同一 creator 做的权杖与杖共用同一根自定义杖身), 属有意的不对称,不是 bug,但改写时容易误判。
  • ⚠️ 源码缺陷:CapWrapper 构造对 WandCap.caps.get(name) 不判空(:13),缺失端盖会 NPE 且无可读报错。
  • ⚠️ 源码缺陷:TCWandAPI.capTagToWrapper 是普通 HashMap, 同名 regCap 会静默覆盖;而 caps 列表是 ArrayList,两条并存。 ⇒ getCaps() 与 getWrapperForCap() 可能返回不同结果。
  • ⚠️ TCWandAPI 的 wandRecipe / sceptreRecipe / caps / progressionForCap 全是可变 public 静态字段, 其他 mod 可直接改写,无任何封装。
  • GTWandRegistry 不在 api 包内(包根 com.gtnewhorizons.tcwands), 是本 mod 私有的配方注册实现。