Skip to content

公开 API

编译依赖

xml
<repositories><repository><id>jiuwu-releases</id><url>https://repo.crypticlib.com/repository/maven-public/</url></repository></repositories>
<dependency><groupId>emaki.jiuwu.craft</groupId><artifactId>emaki-storage-api</artifactId><version>1.0.6</version><scope>provided</scope></dependency>
kotlin
repositories { maven("https://repo.crypticlib.com/repository/maven-public/") }
dependencies { compileOnly("emaki.jiuwu.craft:emaki-storage-api:1.0.6") }

仅编译依赖

runtime 已内嵌未 relocate 的 API 类。不要安装、bundle、shade 或 relocate API Jar;重复 ClassLoader 类型会破坏事件与 bridge。

门面

检查 EmakiStorageApi.status().usable()。唯一业务层为非 null 的 operations()installuninstallBridge 只属于 runtime。

全部异步方法

openGui 外,当前公开读写方法均带 Async 并返回 CompletableFuture<EmakiResult<...>>

方法语义
readSnapshotAsync(UUID)读取分离的 StorageSnapshot,未缓存时从文件 lane 加载。
depositAsync(UUID,ItemStack,long)向仓库增加,不从调用方库存扣物。
withdrawAsync(UUID,ItemStack,long)从仓库扣减并交付给在线 owner。
countOfAsync(UUID,ItemStack)返回真实数量,包括合法的 0。
countAllAsync(UUID,Collection<ItemStack>)一次统计多个模板,返回 Map<ItemStack,Long>。仓库里没有的模板映射为 0L 而不是缺键。对离线玩家可用。
applyBatchAsync(UUID,StorageBatchRequest)原子批量增减。allOrNothingStorageBatchRequest 内声明,不是独立参数。载荷为 StorageBatchResult。操作数超出 behavior.batch_max_ops 时返回 INVALID_INPUTbatch_too_large,不执行任何操作。
reserveAsync(UUID,StorageBatchRequest,Duration)只挂住请求中的扣减侧,载荷是 ReservationHandle。请求里的存入操作被忽略:预留只锁库存,不预订容量。ttl 非正数被拒绝;预留跨重启存活,载入时超过 ttl 即释放。
commitAsync(ReservationHandle)提交预留,载荷为 StorageBatchResult。只有 handle 一个参数,没有 UUID。提交会重跑存入侧预检。
releaseAsync(ReservationHandle)释放预留,载荷为 Unit。只有 handle 一个参数。幂等:未知或已释放的 handle 返回 NOT_FOUND 而不是报错。
grantSlotsAsync(UUID,int)调整管理型 granted-slot 池。
setStackLimitAsync(UUID,long)设置玩家默认单槽上限;0 恢复配置继承。
setSlotStackLimitAsync(UUID,int,long)设置逻辑 entry 上限;0 恢复玩家默认继承。

这些 future 可从任意线程提交;runtime 会在文件 lane 或玩家 owner thread 完成实际工作,但 future callback 不保证位于 Bukkit owner thread。触碰玩家、库存或世界前必须重新调度。

openGui(Player) 是唯一同步操作,必须在 viewer/owner 的 entity-owner thread;错误线程返回 WRONG_THREAD,不会替调用方延迟打开。

StorageSnapshot 是不可变分离快照。StorageAmount 含 requested、applied、remaining()complete();容量不足可返回携带实际 applied 的 Partial。

事件边界

异步 API 在其实际 transaction path 中触发对应同步事件;不要因方法名相似就假定所有底层编辑都有事件。特别是 direct async withdraw 的当前实现路径应以 runtime transaction service 为准,事件页列出确切覆盖。

结果语义

无负载成功使用 EmakiResult<Unit>;可选负载使用 optionalValue()FailureKind 只有 UNAVAILABLENOT_FOUNDINVALID_INPUTREJECTEDCANCELLEDTARGET_OFFLINEWRONG_THREADINTERNAL_ERROR。普通业务失败由结果表示,不依赖 future 异常。