IntegrationType(appeng.integration.IntegrationType)

基本信息

属性 值
源码 appeng/integration/IntegrationType.java
枚举声明 13
常量数 27(IntegrationType.java:15-66)
构造器声明 :72 —— 不是常量,不计入
字段声明 :68 side、:69 dspName、:70 modID —— 均非常量
所属 modid appliedenergistics2

计数方法(集合运算)

用正则 ^\s*([A-Za-z0-9_]+)\(IntegrationSide\. 扫全文得 27。 构造器(:72)签名是 IntegrationType(final IntegrationSide side, ...), ( 后紧跟 final 而非 IntegrationSide.,不匹配,故被正确排除。

这正是本 wiki 反复强调的陷阱:把构造器声明当枚举常量会多算 1。

27 个常量全表

# 常量 行号 side modID 显示名
1 IC2 15 BOTH IC2 Industrial Craft 2
2 RotaryCraft 17 BOTH RotaryCraft Rotary Craft
3 RC 19 BOTH Railcraft Railcraft
4 BuildCraftCore 21 BOTH `BuildCraft Core`
5 BuildCraftTransport 23 BOTH `BuildCraft Transport`
6 BuildCraftBuilder 25 BOTH `BuildCraft Builders`
7 RF 27 BOTH CoFHAPI RedstoneFlux Power - Tiles
8 RFItem 29 BOTH CoFHAPI RedstoneFlux Power - Items
9 CoFHWrench 30 BOTH CoFHAPI CoFHWrench
10 MFR 32 BOTH MineFactoryReloaded Mine Factory Reloaded
11 DSU 34 BOTH null Deep Storage Unit
12 FZ 36 BOTH factorization Factorization
13 FMP 38 BOTH McMultipart Forge MultiPart
14 RB 40 BOTH RotatableBlocks Rotatable Blocks
15 Waila 42 BOTH Waila Waila
16 InvTweaks 44 CLIENT inventorytweaks Inventory Tweaks
17 NEI 46 CLIENT NotEnoughItems Not Enough Items
18 CraftGuide 48 CLIENT craftguide Craft Guide
19 Mekanism 50 BOTH Mekanism Mekanism
20 ImmibisMicroblocks 52 BOTH ImmibisMicroblocks Immibis Microblocks
21 BetterStorage 54 BOTH betterstorage BetterStorage
22 OpenComputers 56 BOTH OpenComputers OpenComputers
23 PneumaticCraft 58 BOTH PneumaticCraft PneumaticCraft
24 GT 60 BOTH gregtech GregTech
25 Chisel 62 BOTH chisel Chisel
26 Jabba 64 BOTH JABBA Jabba
27 ThaumicTinkerer 66 BOTH ThaumicTinkerer Thaumic Tinkerer

三个 modID 复用:CoFHAPI

RF(:27)、RFItem(:29)、CoFHWrench(:30)共用 modID CoFHAPI。 因为它们都依赖 CoFH Core API,而不是各自的 mod。

由此:27 个常量只对应 24 个不同的 modID (27 − 3 个 CoFHAPI 合并成 1 个 = 减 2;DSU 的 modID 为 null 不计入)。 集合运算结果:|{modID}| = 24。

DSU 的 modID 是 null

IntegrationType.java:34 的第三参数是 null。这在 IntegrationNode 的判定里有专门分支:

// IntegrationNode.java:77-78
enabled = this.modID == null || apiManager.hasAPI(this.modID)
        || Loader.isModLoaded(this.modID);

modID == null → 恒为 enabled,即 DSU 的启用不取决于任何 mod 是否安装, 完全交给用户配置(AUTO 时默认开,OFF 可关)。 DSU 实际接的是 MFR 的 DSU 方块,但其 modID 未填 MineFactoryReloaded。

两个死常量:RB 与 CraftGuide

集合运算:IntegrationType 常量 27 个 vs integration/modules/*.java 25 个文件。 差集正好是这两个:

常量 行号 对应模块文件
RB 40 不存在 appeng/integration/modules/RB.java
CraftGuide 48 不存在 appeng/integration/modules/CraftGuide.java

后果:IntegrationNode.call(PRE_INIT) 的 loadClass(this.name)(IntegrationNode.java:82)抛 ClassNotFoundException → 被 :102 的 catch (Throwable) 吞掉 → state = FAILED → 日志打 Rotatable Blocks - Integration Disabled(:111)。

所以这两个目标在运行时永远无法启用,但它们仍然占用 getStatus() 输出里的两个位置(IntegrationRegistry.java:60-68 遍历 modules map,而 add 已经把它们放进去了)。

全仓库对 CraftGuide / RotatableBlocks 的引用仅限 IntegrationType.java 的这两行(已用 grep -rn 确认无其它引用)。

真正的兼容目标数 = 27 + 4

27 个常量不是全部兼容目标。RF.java:52-74 引用了 4 个没有 IntegrationType 常量的 mod,只做 P2P 调律(attunement):

mod 引用行 注册的物品
Extra Utilities RF.java:52-55 extractor_base ×1、pipes ×2、generator ×1
Thermal Expansion RF.java:57-58 Cell、Dynamo
Thermal Dynamics RF.java:61-69 ThermalDynamics_0 damage 0/1/2/4/6
Ender IO RF.java:71-74 itemPowerConduit、blockCapBank、blockPowerMonitor、itemPowerConduitEndergy

这 4 个没有 IntegrationType 常量,因此不在 IntegrationRegistry 里, 不受 ModIntegration 配置开关控制。但它们是安全跳过的 —— registerRFAttunement(RF.java:77-89)用 GameRegistry.findItemStack(mod, name, 1)(:84)并对 null 做了判空(:85):

final ItemStack modItem = GameRegistry.findItemStack(mod, name, 1);
if (modItem != null) {
    modItem.setItemDamage(dmg);
    AEApi.instance().registries().p2pTunnel().addNewAttunement(modItem, TunnelType.RF_POWER);
}

mod 没装 → findItemStack 返回 null → 整段跳过。

因此:

  • 27 = IntegrationType 常量数(可加载模块数)
  • 24 = 不同 modID 数
  • 31 = 源码中实际出现兼容逻辑的外部 mod 数(27 个模块目标 + 4 个仅调律的 mod)

modid 大小写不一致

位置 字符串 vs IntegrationType.modID
IntegrationType.java:50 Mekanism 基准(大写 M)
Mekanism.java:42 mekanism 小写(sendMessage 目标)
Mekanism.java:49 mekanism 小写

Mekanism.java:42 / :49 的 FMLInterModComms.sendMessage("mekanism", ...) 与注册用的 "Mekanism" 大小写不一致。FML 的 mod 列表查找通常大小写敏感, 这有可能是真实缺陷(详见交付报告第 ⑤ 节)。

对比:BuildCraftTransport.java:165 用 "BuildCraft|Transport"、 Waila.java:65 用 "Waila"、NEI.java:339 用 "NotEnoughItems" —— 这 3 处与 IntegrationType 的 modID 完全一致。

相关条目