Skip to content

事件 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);
        }
    }
}

相关页面