Skip to content

事件 API

EmakiItem 对外公开 Bukkit 事件,外部插件可以监听这些事件来拦截、改写或记录物品流程。事件类位于 emaki.jiuwu.craft.item.api.event 包,使用标准 HandlerList 样板。

事件触发时机可取消可改写
EmakiItemCreateEvent自定义物品创建后、返回调用方之前setResult
ItemRepairEvent修复扣费与耐久恢复之前setRestoreAmount
ItemSetBonusChangeEvent套装激活件数变化之后只读

EmakiItemCreateEvent

在自定义物品创建后、返回给调用方之前触发。该事件不可取消,但可以通过 setResult 替换最终物品。

事件特性

  • 不可取消,但可改写产物(setResult)。传入 null 会被忽略。
  • 在物品已创建、尚未返回调用方时触发。
  • 只在全局主线程所有权成立时触发;不满足时创建流程直接返回物品,不触发事件。

方法列表

方法返回值说明
getId()String物品定义 id。
getAmount()int解析出的数量。
getPlayer()Player物品创建对象玩家。当前创建流程不传入玩家,实际始终为 null,监听器必须判空。
getResult()ItemStack产出物品(可能已被监听器替换)。
setResult(ItemStack)void替换返回给调用方的物品;传 null 会被忽略。

监听示例

java
@EventHandler
public void onItemCreate(EmakiItemCreateEvent event) {
    // 给指定物品追加自定义 NBT 或 Lore
    if (event.getId().equals("starter_sword")) {
        ItemStack result = event.getResult();
        // ... 修改 result ...
        event.setResult(result);
    }
}

ItemRepairEvent

在物品修复的扣费与耐久恢复之前触发。

事件特性

  • 可取消(Cancellable):取消后不扣费、不修复。
  • 可改写恢复的耐久量(setRestoreAmount)。值小于等于 0 会抑制本次修复。
  • 只在当前线程拥有该玩家实体所有权时触发;不满足时按未取消、恢复量不变继续修复。
  • 材料修复与货币修复都会触发,通过 getSource() 区分。

方法列表

方法返回值说明
getPlayer()Player执行修复的玩家。
getEquipment()ItemStack被修复的装备。
getItemId()StringEmakiItem 定义 id。
getSource()String修复来源(如 materialeconomy)。
getCurrentDamage()int修复前当前损耗。
getMaxDamage()int最大损耗。
getRestoreAmount()int将恢复的耐久(除非改写或取消)。
setRestoreAmount(int)void改写恢复耐久量;值小于等于 0 抑制修复。
isCancelled()boolean是否已取消。
setCancelled(boolean)void取消或恢复事件。

监听示例

java
@EventHandler
public void onItemRepair(ItemRepairEvent event) {
    // 货币修复时翻倍恢复量
    if (event.getSource().equals("economy")) {
        event.setRestoreAmount(event.getRestoreAmount() * 2);
    }
}

方法命名

改写恢复量的方法是 setRestoreAmount(int),配套 getter 是 getRestoreAmount(),不是 setRepairAmount

ItemSetBonusChangeEvent

在套装激活件数实际发生变化后触发的信息型事件。仅当激活件数变化时触发(边沿触发)。

事件特性

  • 不可取消,仅用于通知。
  • 套装加成已经应用,本事件用于外部插件感知变化。
  • 只在激活件数实际变化时触发,且要求当前线程拥有该玩家实体所有权;不满足时状态仍会更新,但不发事件。
  • 每个发生变化的套装 ID 各触发一次。

方法列表

方法返回值说明
getPlayer()Player套装状态变化的玩家。
getSetId()String套装 id。
getOldActiveCount()int变化前激活件数。
getNewActiveCount()int变化后激活件数。
getTotalPieces()int套装总件数。
getActiveThresholds()List<Integer>当前激活的各档位所需件数(不可变列表)。
getTrigger()String触发刷新的来源。

监听示例

java
@EventHandler
public void onSetBonusChange(ItemSetBonusChangeEvent event) {
    if (event.getNewActiveCount() > event.getOldActiveCount()) {
        event.getPlayer().sendMessage("套装激活:" + event.getSetId()
            + " (" + event.getNewActiveCount() + "/" + event.getTotalPieces() + ")");
    }
}

注意事项

  • EmakiItemCreateEvent 不可取消,若要阻止物品产出请在调用方层处理。
  • ItemSetBonusChangeEventgetActiveThresholds() 返回不可变列表,不要尝试修改。