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 完全一致。