对外 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 私有的配方注册实现。