事件 API
EmakiStorage 对外公开三个 Bukkit 事件,第三方插件可以监听它们来拦截或记录存入、取出与付费扩容流程。事件类位于 emaki.jiuwu.craft.storage.api.event 包。
以下三个事件都是普通 Bukkit 事件,用于第三方消费,不是 CoreLib gameplay fact。用标准的 @EventHandler 监听。三个事件都实现 Cancellable。
| 事件 | 触发时机 | 取消效果 |
|---|---|---|
StorageDepositEvent | 归属实体线程上,紧接在扣减背包与修改条目表之前。 | 中止整个事务:背包不扣减,条目不变。 |
StorageWithdrawEvent | 归属实体线程上,在扣减条目数量之前。由 GUI、命令与 Action 路径触发;EmakiStorageApi.withdraw 不触发。 | 中止整个事务:存量不变。 |
StorageUnlockEvent | 价格已算出、但还没扣任何货币或物品之前。 | 取消不花费玩家任何代价。 |
StorageDepositEvent
| 方法 | 说明 |
|---|---|
playerId() | 仓库归属玩家。 |
template() | 被存入物品的副本,amount 归一化为 1。修改它不影响存储数据。 |
requestedAmount() | 调用方请求存入的数量。 |
source() | 来源:gui / command / api / action。 |
StorageWithdrawEvent
| 方法 | 说明 |
|---|---|
playerId() | 仓库归属玩家。 |
template() | 被取出物品的副本,amount 归一化为 1。 |
requestedAmount() | 调用方请求取出的数量。 |
storedAmount() | 本次操作前该条目的存量。 |
source() | 来源标识。 |
EmakiStorageApi.withdraw 直接扣减条目,不触发本事件;GUI、命令与 Action 路径走的事务实现会触发。这是当前实现的事实,与 StorageDepositEvent 不对称。若你的插件依赖取出事件做校验,请注意 API 路径不会被拦截。
StorageUnlockEvent
| 方法 | 说明 |
|---|---|
playerId() | 仓库归属玩家。 |
slotAmount() | 本次解锁的槽位数。 |
purchasedSlotsBefore() | 玩家此前已购买的槽位数。 |
currencyCost() | 汇总货币价格,按逐格计价求和得出。 |
source() | 来源标识。 |
监听示例
java
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import emaki.jiuwu.craft.storage.api.event.StorageDepositEvent;
public final class StorageListener implements Listener {
@EventHandler
public void onDeposit(StorageDepositEvent event) {
if (event.template().getType() == org.bukkit.Material.BEDROCK) {
event.setCancelled(true);
}
}
}相关页面
- API 与集成:
EmakiStorageApi静态方法与StorageResult语义。 - PlaceholderAPI 占位符:对外读取容量与存量的另一条路径。
- 付费扩容档位:
StorageUnlockEvent中currencyCost()的计价规则。