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 没装时是否安全跳过
是,两条路径都安全:
- 类加载:
ic2.api.*的 import 只在IC2.class真正被加载时解析, 而IntegrationNode只在enabled时loadClass(integration/IntegrationNode.java:82)。 - 判定:
Loader.isModLoaded("IC2")为false→ModNotInstalled(:87)→catch (Throwable)(:102)→FAILED→ 仅打 info(:112)。