integration/modules 兼容模块实现(modules)

覆盖范围

appeng.integration.modules 包根目录的 25 个 .java 文件。

实测:find integration/modules -maxdepth 1 -name '*.java' | wc -l = 25。 (子包 BCHelpers/ 5 + NEIHelpers/ 17 + helpers/ 11 + waila/ 22 另立维度,见 bc-helpers、 nei-helpers、 helpers、waila。)

25 vs 27:两个目标没有实现类

IntegrationType 有 27 个常量,本目录只有 25 个类。 差集 = RB(Rotatable Blocks)与 CraftGuide(Craft Guide), 两者运行时必定 FAILED。详见 IntegrationType。

常量 模块类 状态
其余 25 个 存在 取决于 mod 是否安装

全部 25 个模块一览

「安全跳过」列 = mod 未安装时是否静默跳过而不崩溃。 25 / 25 全部为「是」(依据:IntegrationNode.java:77-78 的 Loader.isModLoaded 判定 + :102 的 catch (Throwable) + :112 对 ModNotInstalled 的免上报处理)。

# 模块类 声明行 init 行 postInit 行 实现接口 modID side 注入内容 安全跳过
1 BetterStorage 25 49(空) 53 IBetterStorage betterstorage BOTH BSCrateHandler 外部存储 是
2 BuildCraftBuilder 44 59 68(空) — BuildCraft|Builders BOTH initBuilderSupport()(:70)登记可定向方块进 BC 蓝图注册表;异常被吞(:62-64) 是
3 BuildCraftCore 29 59(空) 63 IBuildCraftCore BuildCraft|Core BOTH registerPowerP2P()(:66-72)注册 3 项 engineBlock damage 0/1/2 → TunnelType.RF_POWER 是
4 BuildCraftTransport 49 211 217 IBuildCraftTransport BuildCraft|Transport BOTH init:initPipeConnection() + initFacades()(:212-213);postInit:3 个 register*P2P() 共 25 项调律 + BCPipeHandler(:229)+ facade IMC(:165) 是
5 Chisel 12 40 60(空) — chisel BOTH quartz / quartzPillar / quartzChiseled / skyStone 登记为 Chisel 变体(:43-56) 是
6 CoFHWrench 7 17(空) 20(空) — CoFHAPI BOTH 空壳,什么都不注入 是
7 DSU 25 46(空) 50 IDSU null BOTH MFRDSUHandler 外部存储 是
8 FMP 48 93 124 IFMP, IPartFactory, IPartConverter McMultipart BOTH 7 个 multipart 方块 + converter + part 表 + AEMultiTile 透传(:96-114);postInit 挂 Forge 事件(:125) 是
9 FZ 32 128 139 IFZ factorization BOTH init 反射抓 TileEntityDayBarrel 的 4 个成员(:129-134);postInit FactorizationHandler 是
10 GT 20 33 42 IGT gregtech BOTH 构造器(:26-30):GT6-MC1710 版本排除(:28-29);init:LayerIEnergyConnected(:35-37);postInit:NBTSpatialHandler(:43) 是
11 IC2 31 43 54 IIC2 IC2 BOTH init 2 个 part layer(:48-49);postInit 11 个 P2P 调律(:56-66)+ 可搬运白名单(:68-70) 是
12 ImmibisMicroblocks 35 53 74(空) IImmibisMicroblocks ImmibisMicroblocks BOTH 反射抓 MicroblockAPIUtils.mergeIntoMicroblockContainer(:55-67),失败只 AELog.debug(:69) 是
13 InvTweaks 22 35 40 IInvTweaks inventorytweaks CLIENT init 从 Loader.getIndexedModList().get("inventorytweaks").getMod() 取 API(:36);postInit 若 null 抛 IllegalStateException(:42) ⚠️ 见下
14 Jabba 15 34(空) 38 — JABBA BOTH JabbaStorageHandler 外部存储 是
15 MFR 17 30(空) 33(空) — MineFactoryReloaded BOTH 纯空壳 是
16 Mekanism 22 33(空) 36(空) IMekanism Mekanism BOTH 无主动注入;只有被动 addCrusherRecipe(:39)/ addEnrichmentChamberRecipe 是
17 NEI 82 122 207(空) INEI, IContainerTooltipHandler, IContainerObjectHandler NotEnoughItems CLIENT 构造期反射探测 NEI API(:101-173);init 反射注册 4 个 recipe handler + 2 个 usage handler + 2 个 filter + 6 个 bookmark GUI(:123-168);加快捷键 gui.pattern_view = P 是
18 OpenComputers 25 41 53 — OpenComputers BOTH init LayerSidedEnvironment(:46-48);postInit 8 个物品 → TunnelType.COMPUTER_MESSAGE(:56-63) 是
19 PneumaticCraft 28 44 56 — PneumaticCraft BOTH init LayerPressure(:49-51);postInit 2 个压力管道调律(:57-58) 是
20 RC 22 40(空) 43(空) IRC Railcraft BOTH 纯空壳 是
21 RF 27 41 51 — CoFHAPI BOTH init LayerIEnergyHandler(:46);postInit 调律 4 个外部 mod 共 15 项(:52-74) 是
22 RFItem 17 28(空) 31(空) — CoFHAPI BOTH 空壳 是
23 RotaryCraft 17 29(空) — — RotaryCraft BOTH 空壳 是
24 ThaumicTinkerer 11 22(空) 25(空) IThaumicTinkerer ThaumicTinkerer BOTH 无主动注入;只有被动 isTransvectorInterface(:28) 是
25 Waila 25 64 69(空) — Waila BOTH 发一条 FMLInterModComms.sendMessage("Waila", "register", ...)(:65) 是

六个空壳模块

init() 与 postInit() 都是空的:

模块 空壳证据
CoFHWrench CoFHWrench.java:17 / :20
MFR MFR.java:30 / :33
RFItem RFItem.java:28 / :31
RotaryCraft RotaryCraft.java:29
Mekanism Mekanism.java:33 / :36(但有被动 API)
ThaumicTinkerer ThaumicTinkerer.java:22 / :25(但有被动 API)
RC RC.java:40 / :43

⚠️ 特别注意 RC(Railcraft)完全空壳。本机 /Users/evlos/a/mc117src/Railcraft/ 是 1.7.10 的参照源码, 但 AE2 侧对 Railcraft 没有任何注入。IRC.rockCrusher(IRC.java:17) 这个方法没有调用方。写条目时不要虚构 Railcraft 兼容内容。

⚠️ MFR(Mine Factory Reloaded)也空壳 —— 尽管 modules/helpers/MFRDSUHandler.java 存在,但那是 DSU 模块在用(DSU.java:50),不是 MFR 模块。 MFR 的 DSU 方块由 DSU 目标承载,而 IntegrationType.DSU.modID = null, 所以装 MFR 但没装别的也不会自动禁用 DSU。

init 空但 postInit 有事(6 个)

模块 init postInit
BetterStorage :49 空 :53 注册 BSCrateHandler
DSU :46 空 :50 注册 MFRDSUHandler
Jabba :34 空 :38 注册 JabbaStorageHandler
BuildCraftCore :59 空 :63 registerPowerP2P()
FZ :129-134 反射 :139 注册 FactorizationHandler
OpenComputers :46-48 layer :56-63 8 个调律
PneumaticCraft :49-51 layer :57-58 2 个调律

⚠️ 三个外部存储注册(BetterStorage / DSU / Jabba) 全在 postInit。BuildCraftTransport 的 BCPipeHandler 也在 postInit(:229)。 FZ 的 FactorizationHandler 同理(:139)。 全部 5 个外部存储 handler 都在 postInit 阶段注册。

注入的五种机制

机制 代表模块 注入点
part layer IC2、RF、GT、OpenComputers、PneumaticCraft AEApi.instance().partHelper().registerNewLayer(<AE 层名>, <外部接口名>)
P2P 调律 IC2、RF、OpenComputers、PneumaticCraft、BuildCraftCore、BuildCraftTransport registries().p2pTunnel().addNewAttunement(ItemStack, TunnelType.X)
外部存储 DSU、FZ、BetterStorage、Jabba、BuildCraftTransport registries().externalStorage().addExternalStorageInterface(...)
配方 / 变体 Chisel、BuildCraftBuilder、IC2、Mekanism、RC Chisel 变体表、BC 蓝图表、IC2 粉碎机、Mekanism IMC
方块 / part 注册 FMP MultiPartRegistry.registerConverter/registerParts
IMC 消息 Waila、NEI、BuildCraftTransport、Mekanism FMLInterModComms.sendMessage(...)

「不注入方块 / 物品」这一条要分清

⚠️ 本包 0 个模块向 AE2 注册方块或物品。 所有注入都是「能力 / 层 / 调律 / 存储 / 配方 / 变体」。 唯一的方块相关是 FMP 注册 multipart 变体(:96-102), 指的是 AE2 自己的 quartz / skyStone 方块的 FMP 外形,不是新增方块。

跨 mod 物品只出现在 P2P 调律里,且一律是读取对方物品 (GameRegistry.findItemStack / IC2Items.getItem / Items.get), 从不构造对方物品。唯一例外是 BuildCraftCore / BuildCraftTransport: 它们 new ItemStack(buildcraft.BuildCraftCore.engineBlock, 1, n) 引用的是对方静态字段(等价于读取),仍是对方物品。

反射约束全部满足

25 个模块全部有 public static <ClassName> instance 字段 (已逐个 grep 校验),满足 IntegrationNode 的约束 4。 因此唯一会导致 FAILED 的是模块类不存在(RB / CraftGuide)。

InvTweaks 是唯一的硬失败点

InvTweaks.postInit()(InvTweaks.java:40-43):

if (api == null) {
    throw new IllegalStateException("InvTweaks API Instance Failed.");
}

api 由 init()(:36)从 Loader.instance().getIndexedModList().get("inventorytweaks").getMod() 取得。 若 mod 列表里没有它,:36 本身就会 NPE / :41 会抛异常。 虽然 IntegrationNode 会捕获并置 FAILED,但日志里会出现 AELog.integration(...) 异常栈(:113,因为不是 ModNotInstalled), 而不是干净的 info 行。

反向链接