IC2 模块(appeng.integration.modules.IC2)

基本信息

属性 值
源码 appeng/integration/modules/IC2.java
类声明 31,public class
实现接口 IIC2(integration/abstraction/IIC2.java:16)+ IIntegrationModule
静态单例 public static IC2 instance(:34)
modID IC2(IntegrationType.java:15)
side BOTH
本 wiki 收录情况 Industrial Craft 2 未被本 wiki 收录 —— 写全名 Industrial Craft 2

生命周期

阶段 行号 动作
init() 43 注册 2 个 part layer(受 isEnabled 自门控,:47)
postInit() 54 11 个 P2P 调律(:56-66)+ 1 个可搬运白名单(:68-70)

注入内容 1:两个 part layer

// IC2.java:47-50
if (IntegrationRegistry.INSTANCE.isEnabled(IntegrationType.IC2)) {
    partHelper.registerNewLayer("appeng.parts.layers.LayerIEnergySink", "ic2.api.energy.tile.IEnergySink");
    partHelper.registerNewLayer("appeng.parts.layers.LayerIEnergySource", "ic2.api.energy.tile.IEnergySource");
}
AE2 侧 layer IC2 侧接口
appeng.parts.layers.LayerIEnergySink ic2.api.energy.tile.IEnergySink
appeng.parts.layers.LayerIEnergySource ic2.api.energy.tile.IEnergySource

⚠️ 这两行在 init() 内部又判了一次 isEnabled(:47), 与 IntegrationNode 的判定重复。属于冗余但无害的防御。

注入内容 2:11 个 P2P 调律(TunnelType.IC2_POWER)

IC2.java:56-66,全部经 getItem(name)(:87-89 → ic2.api.item.IC2Items.getItem):

# IC2 物品名 行号
1 copperCableItem 56
2 insulatedCopperCableItem 57
3 goldCableItem 58
4 insulatedGoldCableItem 59
5 ironCableItem 60
6 insulatedIronCableItem 61
7 insulatedTinCableItem 62
8 glassFiberCableItem 63
9 tinCableItem 64
10 detectorCableItem 65
11 splitterCableItem 66

即 IC2 的全部 11 种电缆都能当 P2P 电力隧道的调律物。

⚠️ getItem 没有判空。IC2 版本若删掉某个物品名, 会得到 null 并直接传给 addNewAttunement(null, ...)。

注入内容 3:可搬运白名单

// IC2.java:68-70
try {
    AEApi.instance().registries().movable()
            .whiteListTileEntity((Class<? extends TileEntity>) Class.forName("ic2.core.crop.TileEntityCrop"));

让 IC2 作物(田)方块能被 ME 搬运系统搬走。包在 try 里。

IIC2 的 4 个方法全部实现

IC2.java 的完整方法表:

方法 行号 转发到
构造器 37
init() 43 见上
postInit() 54 见上
addToEnergyNet(TileEntity) 77 把 AE2 方块接入 IC2 电网
removeFromEnergyNet(TileEntity) 82 移出 IC2 电网
getItem(String) 87 ic2.api.item.IC2Items.getItem(name)(:88)
maceratorRecipe(ItemStack, ItemStack) 92 ic2.api.recipe.Recipes.macerator.addRecipe(...)(:93)

IIC2 声明的 4 个方法一个不缺。

AE2 侧的消费者

IIC2 被两处 getInstance(IntegrationType.IC2) 拿到(均在本分片外):

消费者 位置 用途
appeng/tile/powersink/IC2.java :63 / :85 IC2 能源方块桥,接 / 离电网
appeng/recipes/handlers/Macerator.java :51 向 IC2 粉碎机推送配方

⚠️ 这两处用的是 getInstance(integration/IntegrationRegistry.java:79), 未启用时会 throw new IllegalStateException(:85)。 所以调用侧必须先 isEnabled 判一次。

mod 没装时是否安全跳过

是,两条路径都安全:

  1. 类加载:ic2.api.* 的 import 只在 IC2.class 真正被加载时解析, 而 IntegrationNode 只在 enabled 时 loadClass (integration/IntegrationNode.java:82)。
  2. 判定:Loader.isModLoaded("IC2") 为 false → ModNotInstalled (:87)→ catch (Throwable)(:102)→ FAILED → 仅打 info(:112)。

相关条目