me/ 存储与库存处理(storage)
覆盖范围
appeng.me.storage 包,23 个 .java 文件 —— 是 me/ 下最大的一个子包。
实测:find me/storage -name '*.java' | wc -l = 23。
关键结论先说:这一层是接口的多层适配,不是「一个存储」
23 个文件里没有一个是「ME 存储本体」。真正的存储聚合发生在
GridStorageCache 持有的
NetworkInventoryHandler 上。本包提供的是围绕它的一圈适配器:
把 cell、把外部容器、把普通 IInventory、把流体 handler 统一包装成
IMEInventoryHandler<T>,让 NetworkInventoryHandler 能一视同仁地对待。
继承 / 实现关系图
本包 23 个类全部围绕 appeng/api/storage/ 下的 7 个接口展开:
把它们按「存储通道」分成三组,下面按组画出实现树。
IMEInventoryHandler<T> (api/storage/)
│
├── MEInventoryHandler<T> me/storage/MEInventoryHandler.java:37
│ │ 最常用的基类:白名单 / 访问权限 / 分区列表
│ ├── CellInventoryHandler<T> me/storage/CellInventoryHandler.java:30
│ │ ├── ItemCellInventoryHandler me/storage/ItemCellInventoryHandler.java:17
│ │ └── FluidCellInventoryHandler me/storage/FluidCellInventoryHandler.java:19
│ └── StorageBusInventoryHandler<T> me/storage/StorageBusInventoryHandler.java:15
│
├── MEPassThrough<T> me/storage/MEPassThrough.java:33
│ └── MEMonitorPassThrough<T> me/storage/MEMonitorPassThrough.java:33
│ 带观察者与 StorageFilter,转发给 setInternal() 换掉的对象
│
├── NullInventory<T> me/storage/NullInventory.java:23
├── SecurityInventory me/storage/SecurityInventory.java:31
├── VoidItemInventory me/storage/VoidItemInventory.java:24
├── VoidFluidInventory me/storage/VoidFluidInventory.java:24
└── MEMonitorIFluidHandler me/storage/MEMonitorIFluidHandler.java:43
唯一直接实现者(实现的是 IStorageBusMonitor<IAEFluidStack>,不是 IMEInventoryHandler)
IMENetworkInventory<T> (api/storage/)
└── NetworkInventoryHandler<T> me/storage/NetworkInventoryHandler.java:51
★ 真正的全网聚合器
ICellInventory<StackType> (api/storage/)
├── CellInventory<T> me/storage/CellInventory.java:46 (abstract)
│ ├── ItemCellInventory me/storage/ItemCellInventory.java:11
│ └── FluidCellInventory me/storage/FluidCellInventory.java:11
├── CreativeCellInventory<T> me/storage/CreativeCellInventory.java:38
└── VoidCellInventory<T> me/storage/VoidCellInventory.java:25
IMEInventory<T> (api/storage/)
├── MEInventoryWrapper<T> me/storage/MEInventoryWrapper.java:15
└── MEIInventoryWrapper me/storage/MEIInventoryWrapper.java:28
IStorageBusMonitor<IAEItemStack> (api/storage/IStorageBusMonitor.java)
└── MEMonitorIInventory me/storage/MEMonitorIInventory.java:41
IExternalStorageHandler (api/storage/)
└── AEExternalHandler me/storage/AEExternalHandler.java:27
IStackWatcher (api/networking/storage/)
└── ItemWatcher me/storage/ItemWatcher.java:25
逐个职责
| 文件 | 行号 | 职责 |
|---|---|---|
NetworkInventoryHandler.java |
51 | 全网存储聚合器。维护 handler 列表,跨 handler 分配注入 / 抽取,支持模糊匹配与优先级 |
MEInventoryHandler.java |
37 | 通用 handler 基类。持有白名单(getWhitelist :66)、AccessRestriction(:74)、注入分区(:89)、抽取分区(:85) |
CellInventory.java |
46 | cell 数据本体(抽象)。持有 ItemStack + ISaveProvider,负责 NBT 读写与字节记账。静态工厂 isCell(:149)/ getCell(:163) |
CellInventoryHandler.java |
30 | 把 ICellInventory 包装成 handler。额外暴露格式化状态:isPreformatted(:93)、isFuzzy(:98)、isDistribution(:103)、isOverflow(:108)、getIncludeExcludeMode(:113)、getStatusForCell(:117)、getTotalBytes(:133)、getFreeBytes(:138)、getUsedBytes(:143)、getTotalTypes(:148)、getFreeTypes(:153)、getUsedTypes(:158)、getCellStatus(:163)、getCellType(:168) |
ItemCellInventory.java |
11 | CellInventory<IAEItemStack>。NBT tag 名由 getStackTypeTag(:23)/ getStackCountTag(:28)给出 |
FluidCellInventory.java |
11 | CellInventory<IAEFluidStack>,同上(:23 / :28) |
ItemCellInventoryHandler.java |
17 | CellInventoryHandler<IAEItemStack>。覆写 setOreFilteredList(:24)、setPriorityList(:29)与 getStorageChannel(:47) |
FluidCellInventoryHandler.java |
19 | CellInventoryHandler<IAEFluidStack>。覆写 getStorageChannel(:55),返回 StorageChannel.FLUIDS |
CreativeCellInventory.java |
38 | 创造模式 cell。injectItems(:66)直接丢、extractItems(:76)凭空造、getAvailableItems(:86)返回配置清单 |
VoidCellInventory.java |
25 | 作废 cell。injectItems(:46)/ extractItems(:51)都是空转 |
StorageBusInventoryHandler.java |
15 | 存储总线专用。getAvailableItemsWithPriority(:63)返回 PrioritizedNetworkItemList |
MEMonitorIInventory.java |
41 | 把普通 InventoryAdaptor(即原版容器)包装成带观察者的 handler。onTick(:125)返回 TickRateModulation |
MEMonitorIFluidHandler.java |
43 | 同上,但针对 Forge 流体 IFluidHandler。onTick(:159) |
MEPassThrough.java |
33 | 转发壳。getInternal(:44)/ setInternal(:60)可在运行时换掉被包装对象 |
MEMonitorPassThrough.java |
33 | 带观察者 + StorageFilter(getMode :168 / setMode :164)的转发壳。setInternal(:49)会重挂观察者 |
MEInventoryWrapper.java |
15 | 泛型转发壳(IMEInventory<T>)。接受 IAEStackType<T> |
MEIInventoryWrapper.java |
28 | 专给原版 IInventory 用的转发壳,需要 InventoryAdaptor 做单位换算 |
NullInventory.java |
23 | 空实现。全部方法返回空 / 0 / false |
SecurityInventory.java |
31 | 安全站方块的 handler。构造器收 TileSecurity(:36) |
VoidItemInventory.java |
24 | 湮灭 / 废弃物品的 handler。构造器收 TileCondenser(:28) |
VoidFluidInventory.java |
24 | 同上,流体版,构造器也收 TileCondenser(:28) |
AEExternalHandler.java |
27 | AE2 自带的外部存储接口注册项 |
ItemWatcher.java |
25 | IStackWatcher 实现,由 GenericInterestManager 驱动 |
注册 / 注入点
| 注册项 | 位置 | 目标 |
|---|---|---|
AEExternalHandler |
core/Registration.java:554 |
registries.externalStorage() |
CreativeCellHandler |
core/Registration.java:557 |
registries.cell() |
VoidCellHandler |
core/Registration.java:558 |
registries.cell() |
⚠️ 源码注释明确写了:BasicCellHandler is built into the Registry, so there is no need to register it here.(core/Registration.java:556)—— 普通 cell 的
handler 是注册表内置的,不走 Registration。
外部存储接口的 6 个注册方
IExternalStorageHandler 的 addExternalStorageInterface 全仓库有 6 个调用点,
其中 1 个在 me/storage(AE2 自带),5 个在 integration/:
| 调用点 | handler | 目标 mod |
|---|---|---|
core/Registration.java:554 |
AEExternalHandler |
AE2 自带(本维度) |
integration/modules/DSU.java:50 |
MFRDSUHandler |
MFR / DSU |
integration/modules/FZ.java:139 |
FactorizationHandler |
Factorization |
integration/modules/BetterStorage.java:53 |
BSCrateHandler |
BetterStorage |
integration/modules/Jabba.java:38 |
JabbaStorageHandler |
Jabba |
integration/modules/BuildCraftTransport.java:229 |
BCPipeHandler |
BuildCraft Transport |
注意:integration/modules/ 这 5 个不产出方块或物品,
它们只让 AE2 的接口 / ME 端能读写别的 mod 的箱子与管道。
详见 integration/helpers 总览。
与既有维度的关系
| 关系 | 说明 |
|---|---|
| → 存储总线 part | StorageBusInventoryHandler 服务它 |
| → 接口 part | 同上,是主要的 handler 提供方 |
| → 存储监控 part | MEMonitorIInventory / MEMonitorIFluidHandler 的观察者出口 |
| → 存储胞体物品 | CellInventory 的载体 |
| → 创造模式存储胞体 | CreativeCellInventory |
| → 作废存储胞体 | VoidCellInventory |
| → 方块安全站 | SecurityInventory |
| → 方块湮灭器 | VoidItemInventory / VoidFluidInventory |
| → cell 相关开关 | AEFeature.StorageCells 门控 cell 工作 |