神秘学附魔配方(TINKERSAUGMENTATION)

基本信息

属性 值
研究 ID TINKERSAUGMENTATION
注册入口 TCCompat.thaumic(),postInit 且 Loader.isModLoaded("Thaumcraft") && Config.TC(SuperTic.java:55)
配方类 com.Zoko061602.SuperTic.compat.InfusionModifierRecipe extends InfusionRecipe

研究项注册

TCCompat.java:15-18:

AspectList al = new AspectList().add(Aspect.TOOL, 20).add(Aspect.MAGIC, 20);
new ResearchItem("TINKERSAUGMENTATION", "ARTIFICE", al, 7, 6, 7, new ItemStack(TinkerTools.titleIcon, 1, 4099))
        .setPages(new ResearchPage("STiC"), new ResearchPage(Thaumcraft.infusion)).setAutoUnlock()
        .registerResearchItem();
字段 值
分类 ARTIFICE
要素 TOOL 20 + MAGIC 20
复杂度三元组 7, 6, 7
图标 new ItemStack(TinkerTools.titleIcon, 1, 4099)(meta 4099)
页面 ResearchPage("STiC") + ResearchPage(Thaumcraft.infusion)
解锁方式 setAutoUnlock()——无需前置研究,完成即可自动解锁

页面前一个是本地化键 STiC,对应 lang 文件里的 STiC=... 行 (assets/supertic/lang/en_US.lang / zh_CN.lang)。中文为 “你可以通过注魔祭坛,为匠魂工具增加额外的升级槽.很遗憾,符文矩阵能力有限,每柄工具只能这样获得一次额外升级槽.”

配方覆盖的工具清单

Thaumcraft.tools 数组(Thaumcraft.java:23-29)共 26 个 Item, registerRecipes 为每一个注册一个 InfusionModifierRecipe(Thaumcraft.java:74-78):

来源类 工具
TinkerTools(18 个) pickaxe、shovel、hatchet、broadsword、longsword、rapier、dagger、cutlass、frypan、battlesign、chisel、mattock、scythe、lumberaxe、cleaver、hammer、battleaxe、excavator
TinkerWeaponry(8 个) shuriken、throwingknife、javelin、shortbow、longbow、crossbow、arrowAmmo、boltAmmo
infusion = new InfusionModifierRecipe(new ItemStack(tools[0]));   // 第 0 个被单独存进静态字段
recipes.add(infusion);
for (int i = 1; !(i == tools.length); i++) {
    recipes.add(new InfusionModifierRecipe(new ItemStack(tools[i])));
}

(Thaumcraft.java:74-78)recipes 取自 ThaumcraftApi.getCraftingRecipes()(Thaumcraft.java:73)。

注意 input1 / input2 / input3 三个数组的索引 0 对应 metalBlock 的 meta 7, 1 / 2 是金苹果。数组本身是 static 字段(Thaumcraft.java:34-37)。

配方的三档难度

Config.TC_lvl(默认 2,范围 1~3)决定配方强度与材料 (Thaumcraft.java:43-65、InfusionModifierRecipe.java:18-26):

TC_lvl InfusionRecipe 难度 要素 附加材料
1 TC_lvl * 2 = 2 list1 = TOOL 16 input1 = TinkerWorld.metalBlock meta 7 + 2 个 Items.golden_apple
2(默认) 4 list2 = TOOL 32 input2 = TinkerWorld.metalBlock meta 2 + 2 个 TinkerArmor.diamondApple
3 6 list3 = TOOL 64 input3 = Items.nether_star + 2 个 Items.golden_apple meta 1

难度是 Config.TC_lvl * 2 的乘算(InfusionModifierRecipe.java:22)。 getListfromLevel(int lvl) / getInputfromLevel(int lvl) 两个方法的形参 lvl 完全未被使用——方法体直接读 Config.TC_lvl(Thaumcraft.java:43-65)。

效果:升级槽 +1

InfusionModifierRecipe.getOutput(InfusionModifierRecipe.java:28-39):

NBTTagCompound nbt = out.getTagCompound();
nbt.setBoolean("STicTC", true);
int mod = nbt.getCompoundTag("InfiTool").getInteger("Modifiers") + 1;
nbt.getCompoundTag("InfiTool").setInteger("Modifiers", mod);

即:给匠魂工具的 InfiTool.Modifiers 加 1(多加一个升级槽), 并在 NBT 打上 STicTC = true 标记。lang 文本 “additional modifier” 说的就是这个。

匹配限制 matches

InfusionModifierRecipe.matches(InfusionModifierRecipe.java:41-66)在原版 InfusionRecipe.matches 之外加了 4 条限制:

顺序 检查 源码
1 in == null → false InfusionModifierRecipe.java:43
2 in.getItem() instanceof ToolCore 不成立 → false InfusionModifierRecipe.java:44
3 in.getTagCompound().getBoolean("STicTC") 为真 → false(每件工具只能附魔一次) InfusionModifierRecipe.java:45
4 !ThaumcraftApiHelper.isResearchComplete(player, "TINKERSAUGMENTATION") → false InfusionModifierRecipe.java:46
5 逐个比对 getComponents(),全部命中且输入列表被清空 → true InfusionModifierRecipe.java:52-65

比对时若组件的 getItemDamage() == 32767(即忽略 metadata), 会先把待比对项的 damage 也设成 32767(InfusionModifierRecipe.java:56)。 所有组件比对时传 areItemStacksEqual(i2, comp, true),第三参 true 表示比较 NBT。

getRecipeOutput 被 override 为直接调 getOutput(input) (InfusionModifierRecipe.java:68-71),即每次查询输出都基于传入的 input 现场计算,而不是用构造时传入的那个 getOutput(input) 结果。

Dreamcraft 影响

Thaumcraft.registerRecipes 开头有 Dreamcraft 检测(Thaumcraft.java:68-71):

if (Loader.isModLoaded("dreamcraft")) {
    appleeasy = applehard;
    applehard = new ItemStack(TinkerArmor.diamondApple);
}

即装 Dreamcraft 时把 diamondApple 与「虚弱/金苹果 meta 1」的配方位置对调 ——最低档改用 Items.golden_apple meta 1,中间档改用 TinkerArmor.diamondApple。

⚠️ 这段赋值是死代码:appleeasy / applehard 是两个静态字段 (Thaumcraft.java:31-32),而 input1 / input2 / input3 三个数组在类静态初始化 阶段就已经用当时的字段值构造完成(Thaumcraft.java:34-37)。之后重新赋值字段 不会回写已构造的数组内容。所以 Dreamcraft 的这段对调实际不产生任何效果, 除非该类从未被初始化(而 registerRecipes 是该类的静态方法调用,必然先触发初始化)。

兼容依赖

dependencies.gradle 中 Thaumcraft 是 compile 'thaumcraft:Thaumcraft:1.7.10-4.2.3.5:dev' ——从 CurseMaven 之外的仓库拉取的官方 1.7.10 包,同时 compile 了 cofh-core-69162:2388751(CoFH Core,用于 TConstruct 的 TinkerWorld / TinkerArmor 等类)。