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())。