AE 要素赋予(AE2 物品获得 Thaumcraft 要素)

基本信息

属性 值
实现类 thaumicenergistics.common.registries.AEAspectRegister(单例 AEAspectRegister.INSTANCE)
类注释 Gives items from AE2 aspects when scanned.(AEAspectRegister.java:36)
调用时机 ThaumicEnergistics.postInit → AEAspectRegister.INSTANCE.registerAEAspects()(ThaumicEnergistics.java:163-167)
异常处理 整个过程被 try/catch 包裹,失败时仅记警告日志 Unable to finish aspect registration due to exception:%n%s%n(ThaumicEnergistics.java:165-167)
辅助挂钩 AspectHooks.hook_AspectInit(Aspect) 记录每个要素的归属 mod(integration/tc/AspectHooks.java:26-32)

功能

这是 ThE 与 Thaumcraft 最重要的机制级集成(而非内容级集成):它让 AE2 的所有物品与方块都能被 ThA 扫描出要素,从而在 ThA 的扫描台、蒸馏、注魔等系统中正常参与要素逻辑。没有它,AE2 物品在 ThA 玩家眼中是「无要素的外来物」。

三条要素推导路径

buildAspects() 按优先级尝试(AEAspectRegister.java:276-297):

顺序 路径 方法 数据源
1 AE2 研磨机配方 buildAspectsFromGrinder() GRINDER_RECIPES(IGrinderEntry 集合)
2 AE2 压印机配方 buildAspectsFromInscriber() INSCRIBER_RECIPES(IInscriberRecipe 集合)
3 普通合成配方 buildAspectsFromNormal() NORMAL_RECIPES(CraftingManager.getRecipeList(),registerAEAspects 内 :1154)

任一路径成功即停止。匹配方式为 ThEUtils.areStacksEqualIgnoreAmount(recipeOutput, this.itemStack)(忽略数量的 ItemStack 比较)。

递归解析依赖

findAspectsForIngredients() 在遇到「本身也是 AE2 物品」的配方成分时,会递归注册该成分以取得其要素,并主动防止无限递归:

if (!AEAspectRegister.this.DEPENDENCY_CHAIN.contains(ingInfo)) {   // 依赖链去重
    ingInfo.registerItem(this.pass);
}

(AEAspectRegister.java:378-383)

两轮扫描(registerAEAspects,:1176-1193)

for (int pass = 1; pass <= 2; pass++) {
    while (this.ITEMS_TO_ADD.size() > 0) { ... }
    if (pass == 1) {
        this.ITEMS_TO_ADD.addAll(this.UNREGISTERABLE);   // 第 1 轮失败的第 2 轮重试
        this.UNREGISTERABLE.clear();
    }
}

第 1 轮无法解析的物品进入 UNREGISTERABLE,第 2 轮再试一次(此时第 1 轮已注册的物品要素已可用,故很多原本失败的物品第 2 轮能成功)。最后 registerThEItems() 单独处理 ThE 自己的物品(:1196)。

覆盖范围为 AE2 的四个注册表(:1167-1170):

getItemsFromAERegistryClass(AEApi.instance().definitions().materials());
getItemsFromAERegistryClass(AEApi.instance().definitions().items());
getItemsFromAERegistryClass(AEApi.instance().definitions().blocks());
getItemsFromAERegistryClass(AEApi.instance().definitions().parts());

研磨机特殊处理

研磨机产物额外获得 ENTROPY 1 并移除 EARTH(AEAspectRegister.java:119-125)—— 因为研磨本质是「把固体磨成粉」,这一修正反映在要素上。

硬编码的要素修正表

对特定 AE2 物品,源码给出固定的要素加减(addPredefinedBonuses(),:113-272):

AE2 物品 要素修正
分子装配机 molecularAssembler +CRAFT 4 +ENERGY 6 +MECHANISM 2 +CRYSTAL 1(:128-134)
天空石 skyStone +DARKNESS 3(:137-140)
天空箱 skyChest +VOID 4,−EARTH(:142-148)
石英玻璃 quartzGlass +CRYSTAL 4(:151-154)
ME 控制器 controller +MECHANISM 3 +SENSES 1 +MIND 9,−FIRE −ORDER(:156-167)
ME 驱动器 drive +VOID 4,−FIRE −ORDER −SENSES −MECHANISM(:169-177)
ME 箱子 chest +VOID 4,−FIRE −ORDER −SENSES −MECHANISM(:179-187)
ME IO 口 iOPort +EXCHANGE 4,−FIRE −ORDER −SENSES −MECHANISM(:189-197)
集束器 condenser +VOID 10(:199-202)
红石卡 cardRedstone +SENSES 2(:204-207)
电池工作台 cellWorkbench +CLOTH 2(:209-212)
ME 接口 iface +EXCHANGE 6(:214-217)
逻辑处理器 logicProcessor −METAL −FIRE −ORDER,+MIND 3 +METAL 1(:219-232)
计算处理器 calcProcessor −METAL −FIRE −ORDER,+MIND 6 +METAL 1(:234-247)
工程处理器 engProcessor −METAL −FIRE −ORDER,+MIND 9(:249-262)
合成加速器 4x +ENERGY 2(:260)
合成加速器 16x +ENERGY 4(:262)
合成加速器 64x +ENERGY 8(:264)
合成加速器 256x +ENERGY 16(:266)
合成加速器 1024x +ENERGY 32(:268)

ThE 自身物品的要素

registerThEItems()(:991-1041)的策略值得注意:它复制 AE2 1K 电池的要素列表,裁剪到不超过 4 条(超出时按 getAspectsSortedAmount() 移除最低的),再追加 MAGIC 3 + AURA 5:

cellAspects.add(Aspect.MAGIC, 3);
cellAspects.add(Aspect.AURA, 5);

(:1022-1023)随后把同一份要素列表注册给全部 10 种要素电池:1k/4k/16k/64k/256k/1024k/4096k/16384k/Quantum/Singularity(:1024-1033)。若 AE2 1K 电池取不到,则记录 Could not register "Essentia Cells" for TC scanning.(:1039)。

数值

数值名 值 来源
扫描轮数 2 for (int pass = 1; pass <= 2; pass++)(AEAspectRegister.java:1176)
覆盖的 AE2 注册表 4(materials / items / blocks / parts) :1167-1170
要素推导路径优先级 研磨机 > 压印机 > 普通合成 buildAspects()(:276-297)
电池要素条数上限 4(裁剪后追加 MAGIC/AURA) :1004-1019
电池追加要素 MAGIC 3 + AURA 5 :1022-1023
硬编码修正的 AE2 物品数 20 类(见上表) :113-272
最低研磨机要素 ENTROPY 1 :121
最低集束器要素 VOID 10 :201

交互

触发 行为
游戏进入 PostInit 自动执行 registerAEAspects(),玩家无需操作
玩家用扫描台扫描 AE2 物品 返回推导出的要素列表
AE2 研磨配方产物 获得 ENTROPY 1 并移除 EARTH
扫描 ThE 自己的要素电池 返回 AE2 电池要素(裁剪至 4 条)+ MAGIC 3 + AURA 5
加载失败 仅警告日志,不崩溃(ThaumicEnergistics.java:165-167)
记忆卡 GUI 中有「Reset the aspects」按钮,可重置左侧要素表到初始状态(thaumicenergistics.tooltip.button.reset.aspect=Reset the aspects)

合成配方

本条目描述的是系统级行为,不涉及本 mod 的物品配方。可被赋予要素的 ThE 自身物品见 ME Essentia Storage Cell。

相关条目