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 工作

反向链接