integration/modules/helpers 外部存储适配器(helpers)

覆盖范围

appeng.integration.modules.helpers 包,11 个 .java 文件。

实测:find integration/modules/helpers -name '*.java' | wc -l = 11。

这 11 个文件里藏着 4 个外部存储 handler + 2 个例外

文件 行号 职责 归属目标
BSCrateHandler.java 22 IExternalStorageHandler BetterStorage
BSCrate.java 27 IMEInventory<IAEItemStack> —— 单个 BetterStorage 箱 BetterStorage
BSCrateStorageAdaptor.java 25 extends InventoryAdaptor —— 把 BS 箱转成 AE 抽象 BetterStorage
FactorizationHandler.java 24 IExternalStorageHandler Factorization
FactorizationBarrel.java 27 IMEInventory<IAEItemStack> —— 单个 FZ 桶 Factorization
JabbaStorageHandler.java 15 IExternalStorageHandler Jabba
JabbaBarrel.java 15 IMEInventory<IAEItemStack> —— 单个 Jabba 桶 Jabba
MFRDSUHandler.java 24 IExternalStorageHandler Deep Storage Unit(MFR)
MinefactoryReloadedDeepStorageUnit.java 27 IMEInventory<IAEItemStack> —— 单个 DSU Deep Storage Unit(MFR)
FMPPacketEvent.java 17 extends Event(Forge 事件) Forge MultiPart
NullRFHandler.java 17 IEnergyReceiver —— 空实现 CoFH Core

4 个外部存储 handler 的注册点

IExternalStorageHandler 全仓库 6 个 addExternalStorageInterface 调用点, 其中 5 个在本目录,1 个在 AE2 核心:

handler 注册位置 目标
AEExternalHandler core/Registration.java:554 AE2 自带(me/storage)
BSCrateHandler integration/modules/BetterStorage.java:53 BetterStorage
FactorizationHandler integration/modules/FZ.java:139 Factorization
JabbaStorageHandler integration/modules/Jabba.java:38 Jabba
MFRDSUHandler integration/modules/DSU.java:50 Deep Storage Unit
BCPipeHandler integration/modules/BuildCraftTransport.java:229 BuildCraft Transport(在 bc-helpers)

5 个全部在 postInit() 阶段注册。

统一模式:Handler + 单容器 Inventory

每个外部存储都是两层:

IExternalStorageHandler            ← 注册进 AE2 外部存储注册表
  └─ canHandle(TileEntity, ...)    ← 「这是不是我能处理的方块」
  └─ getInventory(TileEntity, ...)  ← 返回 IMEInventory
       └─ IMEInventory<IAEItemStack>  ← 单个容器的 AE2 抽象
目标 handler 单容器 额外适配层
BetterStorage BSCrateHandler(:22) BSCrate(:27) BSCrateStorageAdaptor(:25,extends InventoryAdaptor)
Factorization FactorizationHandler(:24) FactorizationBarrel(:27) 靠 FZ.java:129-134 的反射句柄
Jabba JabbaStorageHandler(:15) JabbaBarrel(:15) —
DSU(MFR) MFRDSUHandler(:24) MinefactoryReloadedDeepStorageUnit(:27) —

IMEInventory<IAEItemStack> 是 AE2 自己的接口 (appeng/api/storage/IMEInventory.java), IAEItemStack 是 AE2 自己的物品栈抽象 —— 跨 mod 物品不会进 AE2 的类型系统。

两个例外

NullRFHandler(:17)—— P2P RF 隧道的空对象

// parts/p2p/PartP2PRFPower.java:39
private static final IEnergyReceiver NULL_HANDLER = new NullRFHandler();

NullRFHandler implements cofh.api.energy.IEnergyReceiver, 是 P2P 隧道(RF) 在没有真实 RF 接收端时的空对象(null object)。全仓库唯一使用点 是 PartP2PRFPower.java:39 的 static final 常量。

⚠️ 注意它与 integration/modules/RFItem.java(空壳)无关。 RFItem 目标什么都不注入;NullRFHandler 是 parts/ 侧独立需要的。

FMPPacketEvent(:17)—— Forge 事件

extends net.minecraftforge.event.Event,构造器 :21 收 EntityPlayerMP。

产生方 位置
integration/modules/FMP.java:179 return new FMPPacketEvent(sender);(newFMPPacketEvent,:178)
core/sync/packets/PacketMultiPart.java:44 MinecraftForge.EVENT_BUS.post(fmp.newFMPPacketEvent(sender))(不在本分片)
消费方 位置
appeng/fmp/FMPEvent.java:45 public void ServerFMPEvent(final FMPPacketEvent event)

⚠️ FMP.java:125 注册到 Forge 事件总线的是 appeng/fmp/FMPEvent.java:40 的 FMPEvent, 它与本目录的 FMPPacketEvent 是两个不同的类。

跨 mod 物品不混入 AE2

⚠️ 本目录所有 IMEInventory 实现只做单位换算与搬运, 它们不构造任何跨 mod 物品。 BSCrateStorageAdaptor / FactorizationBarrel 等把对方容器 映射成 IAEItemStack,走的是 AE2 的物品栈抽象。 对方物品只在 me/storage/MEIInventoryWrapper.java:33 的 InventoryAdaptor 层出现(不在本维度)。

相关条目