ThE 与第三方模组的集成

基本信息

属性 值
集成核心类 thaumicenergistics.common.integration.IntegrationCore(init() 由 ThaumicEnergistics.load() 调用,ThaumicEnergistics.java:129)
模组清单枚举 thaumicenergistics.common.integration.ModsList
声明的必需依赖 required-after:appliedenergistics2@[rv3-beta-817,)、required-after:Thaumcraft@[4.2.3.5,)、after:Waila(ThaumicEnergistics.java:45)
mcmod.info 依赖 appliedenergistics2、thaumcraft(mcmod.info)

功能

IntegrationCore.init() 负责服务端/通用集成,客户端 mod 的集成单独放在 integrateWithClientMods() 且仅在客户端执行(IntegrationCore.java:38-44):

if (EffectiveSide.isClientSide()) {
    IntegrationCore.integrateWithClientMods();
}

集成总表

模组 类型 检测方式 实现类 作用
Applied Energistics 2 必需 @Mod(dependencies=...) 全 mod ThE 全部部件/机器的基础
Thaumcraft 4 必需 @Mod(dependencies=...) 全 mod 要素、研究、奥术配方
Waila 可选(软) Loader.isModLoaded("Waila") ModuleWaila HUD 信息显示
NotEnoughItems 可选(软) Loader.isModLoaded("NotEnoughItems") ModuleNEI 配方显示与隐藏
ComputerCraft 可选(软) Loader.isModLoaded("ComputerCraft") ModuleCC 要素供应器的 Lua 外设
Thaumic Tinkerer 单向通信 FMLInterModComms.sendMessage IntegrationCore 请求 TT 排除本 mod 的方块
Thaumcraft NEI Plugin 仅查询 ModsList.THAUMCRAFT_NEI_PLUGIN.isLoaded() ModsList 只读检测
Aspect Recipe Index 仅查询 ModsList.ASPECT_RECIPE_INDEX.isLoaded() ModsList 只读检测

注意 Waila 在 @Mod(dependencies) 中是 after:Waila(不带 required-after:),因此是软依赖;AE2 与 Thaumcraft 才是 required-after: 硬依赖。

ComputerCraft 集成

ModuleCC.ThEPeripherals implements IPeripheralProvider 为 Essentia Provider 提供 Lua 外设(ModuleCC.java:19-38):

if (te instanceof TileEssentiaProvider) {
    return new EssentiaProviderPeripheral(world, x, y, z);
}

外设实现 IPeripheral 且 IEssentiaProviderWatcher(EssentiaProviderPeripheral.java:41)—— 后者是关键:外设把自己注册为供应器的观察者,从而在要素网络变化时收到回调。相关方法链:addComputerWatch(:281)、removeComputerWatcher(:446)、onProviderBroken(:355)、postChange(:365)、onListUpdate(:437)、onProviderPowerChange。

暴露的 Lua 方法(CCMethods 枚举,EssentiaProviderPeripheral.java:179-207,另加动态方法 events,见 :174):

方法 说明(源码注释)
isOnline Is the provider active and online?
getAspects Gets the list of aspects stored in the network. Stored in pairs of (name,amount)
getAmount Gets how much of the specified essentias are in the network. Args: Param array of aspect names
registerAsWatcher Register for network changes Args: aspect names, can be null for all aspects
unregisterAsWatcher Unregister for network changes Args: aspect names, can be null for all aspects
help Gets help object.
events 动态追加的方法名(getMethodNames 中 names[staticLen] = "events",:174)

单向排除机制:ThE 主动通知 Thaumic Tinkerer 把 Essentia Provider 加入其 CC 黑名单(IntegrationCore.java:49):

FMLInterModComms.sendMessage("ThaumicTinkerer", "AddCCBlacklist", TileEssentiaProvider.class.getName());

这样避免 TT 也为该方块生成一份外设,造成玩家在 CC 中看到两个功能重叠的外设。

Waila 集成

ModuleWaila 实现 IWailaDataProvider,通过 FMLInterModComms.sendMessage("Waila", "register", ... + ".callbackRegister") 注册(ModuleWaila.java:45)。Waila 随后回调 callbackRegister(IWailaRegistrar),注册 3 个 body provider(:55-64):

注册目标 类型
AbstractBlockProviderBase.class 三种 provider 方块
BlockArcaneAssembler.class 奥术装配机
TileEssentiaVibrationChamber.class 要素振动室

getWailaBody 的实现是通用的:若 tile 实现 IWailaSource 就调用 addWailaInformation(tooltip)(:74-86)。getWailaHead / getWailaStack / getWailaTail 全部原样返回(:98-116)—— ThE 不改标题栏与物品图标,只追加正文行。

这也解释了为什么 Essentia Provider、Arcane Assembler、Essentia Vibration Chamber 这几个方块在 HUD 上有额外信息(要素存量、已存 Vis 等)。

NEI 集成

ModuleNEI 注册 GUI overlay 与处理器(ModuleNEI.java:247-305),其中两项对本 mod 可见性有直接影响:

行为 源码
隐藏 Aspect 物品 API.hideItem(ItemEnum.CRAFTING_ASPECT.getStack())(:276)
注册 ACTSlotPositioner 自定义槽位定位器 public static class ACTSlotPositioner implements IStackPositioner(:196)—— 修正 Arcane Crafting Terminal GUI 的槽位定位
注册 NEI GUI 处理器 API.registerNEIGuiHandler(new NEIGuiHandler())(:273)
注册 5 组催化剂信息 registerCatalystInfo(...)(:292-305),其中一处显式指向 "thaumicenergistics:part.base:5"(即 meta 5 = Arcane Crafting Terminal,:298)

催化剂信息通过 FMLInterModComms.sendMessage("NotEnoughItems", "registerCatalystInfo", nbt) 发送(:316)。

ModsList:只读检测的两个模组

ModsList 枚举只有两个条目(ModsList.java:5-8):

THAUMCRAFT_NEI_PLUGIN("thaumcraftneiplugin"),
ASPECT_RECIPE_INDEX("aspectrecipeindex");

isLoaded() 惰性求值并缓存到 Boolean isLoaded(:15-20)。这两个模组只被查询、不被集成 —— 存在它们意味着 ThE 感知这两个 mod 的存在(用于展示或兼容性判断),但本仓中未找到进一步的动作。

AE2 升级卡注册

IntegrationCore.init() 中最大的一块是向 AE2 注册本 mod 物品的可用升级卡(:52-83):

升级类型 适用物品 上限
SPEED Arcane Assembler MAX_SPEED_UPGRADES = 4
VOID_OVERFLOW 要素电池 1k–16384k + Quantum 1
DISTRIBUTION 要素电池 1k–16384k 1
STICKY 要素电池 1k–16384k + Quantum + Singularity 1

总线部件的升级卡(Import/Export/Storage Bus)不在此处注册,而在 ItemAEPart 构造函数中通过遍历 AEPartsEnum.VALUES 调用 upgrade.registerItem(...) 完成(ItemAEPart.java:50-60)。

物品字典

CommonProxy.registerItems() 额外做两件事(CommonProxy.java:48-54):

  • OreDictionary.registerOre("gearIron", IronGear) —— 使 Iron Gear 可被其他 mod 的 gearIron 配方使用
  • OreDictionary.registerOre("materialAspectShard", new ItemStack(ConfigItems.itemShard, 1, WILDCARD_VALUE)) —— 注册 Thaumcraft 的全部碎片为 materialAspectShard,使 AE2 能提示可替代物品

数值

数值名 值 来源
软依赖检测的模组数 3(Waila / NEI / ComputerCraft) IntegrationCore.java:24-47
单向 FMLInterModComms 消息 1(ThaumicTinkerer / AddCCBlacklist) IntegrationCore.java:49
硬依赖数 2(AE2、Thaumcraft) ThaumicEnergistics.java:45
软依赖数 1(after:Waila) 同上
ModsList 条目数 2 ModsList.java:6-7
Waila body provider 数 3 ModuleWaila.java:56-62
CC 外设方法数 6 静态 + 1 动态(events) EssentiaProviderPeripheral.java:166-207
注册的升级类型数 4 IntegrationCore.java:52-83
注册的物品字典名 2(gearIron、materialAspectShard) CommonProxy.java:49、:52-54

交互

触发 行为
安装 Waila HUD 上 ThE 的 provider / 装配机 / 振动室显示额外信息行
安装 NEI Arcane Crafting Terminal 槽位定位修正;Aspect 物品被隐藏
安装 ComputerCraft Essentia Provider 可被 CC 计算机识别为外设,可用 7 个 Lua 方法
安装 Thaumic Tinkerer TT 收到消息后把 Essentia Provider 加入 CC 黑名单(避免双外设)
未安装上述任一 相关 Loader.isModLoaded 返回 false,跳过集成,mod 正常运行
关闭 AE2 特性 要素电池无 VOID_OVERFLOW / DISTRIBUTION / STICKY 升级;电池槽不可用时 FeatureCells 整体不注册
关闭 Thaumcraft 特性 伪研究 MIRROR/JAR、WARDED 依 ThA 配置条件注册

合成配方

本条目描述集成机制。与集成相关的配方:

  • Force TC Facades 开关为真时,FeatureThaumcraftFacades 会覆写 AE2 的 facade 设置,使部分 Thaumcraft 方块的外贴面可被合成 —— 这是 ThE 对 AE2 配置的主动修改,属配置驱动的行为而非固定配方
  • materialAspectShard 物品字典注册使 AE2 能为碎片提示替代品(CommonProxy.java:51-54)

相关条目