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 行。