Crate Storage API

基本信息

属性 值
包路径 net.mcft.betterstorage.api.crate
类数量 2
核心接口 ICrateStorage、ICrateWatcher
消费方 Applied Energistics 风格的其他存储模组

来源:src/main/java/net/mcft/betterstorage/api/crate/。

功能

这组接口让其它模组把 存储木箱 当作自己的存储目标使用,是本 mod 与大型存储模组(典型如 Applied Energistics)对接的契约。

接口本身不限定具体 mod——AE 或其它模组只需实现 ICrateStorage 并通过 ICrateWatcher 订阅变更。

ICrateStorage

存储侧接口,共 12 个方法(src/main/java/net/mcft/betterstorage/api/crate/ICrateStorage.java):

方法 行 用途
getCrateIdentifier() 33 返回该存储的唯一标识
getCapacity() 36 返回容量(槽位数)
getOccupiedSlots() 42 返回已占用槽位数
getUniqueItems() 52 返回不同物品种类数
getContents() 58 遍历全部内容
getRandomStacks() 65 随机顺序遍历(掉落用)
getItemCount(ItemStack) 68 查询某物品的数量
getSpaceForItem(ItemStack) 71 查询某物品的剩余空间
insertItems(ItemStack) 79 插入物品,返回未能插入的余量
extractItems(ItemStack, int) 86 取出指定数量的物品
registerCrateWatcher(ICrateWatcher) 92 注册观察者
unregisterCrateWatcher(ICrateWatcher) 95 注销观察者

getCapacity 的文档注释明确指出容量以「已占用槽位数」计(:45 注释:capacity by the number of occupied slots. Note that even if this...)。

本 mod 侧的实现是 TileEntityCrate:

  • getCapacity() 返回 isEnabled() ? getPileData().getCapacity() : 0(src/main/java/net/mcft/betterstorage/tile/crate/TileEntityCrate.java:371-373)
  • 底层容量 = 箱数 × 18(CratePileData.java:53-55)
  • 变更回调 onCrateItemsModified(ItemStack) 标记内容已修改(TileEntityCrate.java:277-280)

ICrateWatcher

观察者接口,仅一个方法(src/main/java/net/mcft/betterstorage/api/crate/ICrateWatcher.java:13):

public void onCrateItemsModified(ItemStack stack);

在木箱内容被修改时回调。TileEntityCrate 实现了它,被调用时执行 markContentsChanged()(src/main/java/net/mcft/betterstorage/tile/crate/TileEntityCrate.java:277-280)。

InventoryCrateBlockView 是本 mod 内的 ICrateWatcher 实现,它在构造时通过 data.addWatcher(this) 注册自己(src/main/java/net/mcft/betterstorage/inventory/InventoryCrateBlockView.java:33-37)。

InventoryCrateBlockView 维护一个 changed 标志(:25)与 accessed 标志(:29),accessed 在每次更新后重置,用于判断木箱是否被访问过。

相关配置

general.enableCrateStorageInterface 控制外部模组能否使用该接口(src/main/java/net/mcft/betterstorage/config/GlobalConfig.java:182-183),默认 true。

general.enableCrateInventoryInterface 控制的是方块视图(IInventory 侧),与本 API 是两套独立开关(GlobalConfig.java:180-181)。

木箱堆叠数据模型

理解本 API 需要了解木箱的堆叠模型:

类 职责
CratePileData 单个堆叠的数据:箱数、容量、已占用槽位
CrateItems 物品内容(Map<ItemIdentifier, ItemStack>)
CratePileCollection 世界内所有堆叠的集合,负责保存到磁盘
CratePileMap 坐标 → 堆叠的索引

来源:src/main/java/net/mcft/betterstorage/tile/crate/。

CratePileData.markDirty() / save() 控制落盘(CratePileData.java:103-119),并在 crateDebugMessages 开启时输出日志。

CratePileCollection 在世界 tick 时保存(src/main/java/net/mcft/betterstorage/proxy/CommonProxy.java:316-319:onWorldTick 中调用 CratePileCollection.getCollection(event.world).onTick())。

相关条目