Skip to content

事件监听实例

所属:开发者 · 相关:事件大全 · API 配方集

事件大全 列签名,本页给每个事件一段完整可用的 listener(Java),含典型用例。

注册 listener:Bukkit.getPluginManager().registerEvents(new MyListener(), this);


QinhItemGenerateEvent —— 改实例数据

用例:物品全新生成时注入自定义初始值。

java
@EventHandler
public void onGenerate(QinhItemGenerateEvent e) {
    // 给所有新生成的传说物品打一个来源标记
    if ("LEGENDARY".equals(e.getDefinition().getTier())) {
        var data = e.getInstanceData();
        // instanceData 可改(var 字段);按需重建并回填
        // 例:记录生成时间戳到自定义存储
        myTracker.markGenerated(e.getDefinition().getId());
    }
}

可取消(阻止生成)。


QinhItemAssembleEvent —— 装配前/后干预

用例:装配后给特定物品追加自定义 NBT。

java
@EventHandler
public void onAssemble(QinhItemAssembleEvent e) {
    if (!e.isPre()) {                       // 装配后
        ItemStack stack = e.getItemStack();
        if ("boss_drop_blade".equals(e.getDefinition().getId())) {
            // 在 stack 上加你自己的 PDC 标记
            myNbt.tag(stack, "from_boss", true);
        }
    }
}

pre=true 装配前、false 装配后。可取消。


QinhItemsReloadEvent —— 重载后刷新缓存

用例:/qi reload 后重建你插件的物品缓存。

java
@EventHandler
public void onReload(QinhItemsReloadEvent e) {
    getLogger().info("QI 重载:物品 " + e.getItemCount()
        + " 动作 " + e.getActionCount() + " 段 " + e.getSetCount());
    myItemCache.invalidateAll();            // 重建缓存
}

不可取消。


QinhItemUseCheckEvent —— 自定义使用限制

用例:实现职业限制(class:战士)。

java
@EventHandler
public void onUseCheck(QinhItemUseCheckEvent e) {
    for (String r : e.getRestrictions()) {
        if (r.startsWith("class:")) {
            String need = r.substring(6);
            if (!myClassSystem.hasClass(e.getPlayer(), need)) {
                e.setCancelled(true);
                e.setDenyReason("需要职业:" + need);
                return;
            }
        }
    }
}

取消 = 拒绝使用,可设 denyReason。物品里配 options.restrictions: ["class:战士"]


QinhEquipmentChangeEvent —— 装备变化响应

用例:玩家换装时刷新你插件的 UI / 计分板。

java
@EventHandler
public void onEquipChange(QinhEquipmentChangeEvent e) {
    Player p = e.getPlayer();
    // 装备的 QI 物品变了,重算你的展示
    myScoreboard.update(p);
}

不可取消。属性同步后触发。


QinhCombatSwingEvent —— 拦截 / 改写挥击

用例:对特定武器改命中目标或取消默认挥击。

java
@EventHandler
public void onSwing(QinhCombatSwingEvent e) {
    if ("legendary_sword".equals(e.getItemId())) {
        if ("heavy".equals(e.getSwingMode())) {
            // 重击改为范围效果,取消单体默认挥击
            myAoe.strike(e.getPlayer());
            e.setCancelled(true);
        }
    }
}

可取消;target 字段可改。


QinhActionTriggerEvent —— 派发前拦截

用例:全局限制某触发器(如战斗中禁用传送类动作)。

java
@EventHandler
public void onTrigger(QinhActionTriggerEvent e) {
    if (myCombatTag.isInCombat(e.getPlayer())
        && e.getTrigger().contains("recall")) {
        e.setCancelled(true);               // 阻止派发
        e.getPlayer().sendMessage("§c战斗中无法使用");
    }
}

可取消(阻止整个派发)。


QinhActionDispatchedEvent —— 派发后统计

用例:统计技能使用次数 / 审计。

java
@EventHandler
public void onDispatched(QinhActionDispatchedEvent e) {
    if (e.getResult() == ActionDispatchResult.HANDLED) {
        myStats.increment(e.getItemId(), e.getHandlerId());
    }
}

不可取消(信息性)。


QinhItemCompiledEvent —— 编译后处理

用例:物品编译成 ItemStack 后注册进外部系统。

java
@EventHandler
public void onCompiled(QinhItemCompiledEvent e) {
    // 读 provider 快照,做你自己的桥接
    var snap = e.getProviderSnapshot();
    if (snap.provider("myplugin") != null) {
        myExternal.register(e.getDefinition().getId(), e.getStack());
    }
}

可取消(setCancelled)。也可通过 QinhBridgeHook 接入,见 Provider 与桥


事件选择速查

我想…监听
改新物品初始数据QinhItemGenerateEvent
装配后加工 ItemStackQinhItemAssembleEvent
reload 后刷新缓存QinhItemsReloadEvent
自定义使用限制QinhItemUseCheckEvent
换装响应QinhEquipmentChangeEvent
改 / 拦挥击QinhCombatSwingEvent
拦动作派发QinhActionTriggerEvent
统计动作QinhActionDispatchedEvent
编译后桥接QinhItemCompiledEvent

下一步