Spigot插件最常用的功能之一是拦截各种事件。 本教程将演示如何开始监听和拦截事件以及如何创建自己的事件。

一、创建事件监听器

1.1 创建一个Spigot工程

或者使用现有的项目,本教程继续使用CmdDemo的插件,在其基础上添加EventAPI。

1.2 创建一个新类

名字随意,记住这个新类是用来监听事件的,命名最好直观的能看出这个类的功能,否则后续插件功能多了以后自己都找不清,大大增加了维护难度。

1.3 准备监听器

监听器必须实现 org.bukkit.event.Listener接口,以下是我创建的监听器:

package com.xuchaoji.spigot.commanddemo;

import org.bukkit.event.Listener;

public class ListenerDemo implements Listener {
    //do sth. here
}

1.4 注册监听器

还记得命令的注册方式吗,与命令一样,监听器也需要在main class的onEnable()方法中进行注册。在添加了监听器注册代码后,onEnable()方法代码如下:

public void onEnable() {
    getServer().getConsoleSender().sendMessage(ChatColor.AQUA+"[CmdDemo]已加载");
    //注册cjcmd这个命令
    this.getCommand("cjcmd").setExecutor(new CjCmd());
    getServer().getConsoleSender().sendMessage(ChatColor.AQUA+"[CmdDemo]cjcmd命令注册成功!");
    //注册事件监听器
    getServer().getPluginManager().registerEvents(new ListenerDemo(), this);
}

做好以上准备工作,就可以开始向事件监听器中添加事件了。

1.5 监听事件

要侦听侦听器类中的任何给定事件,必须创建一个附加了org.bukkit.event.EventHandler批注(@)的方法,并且该方法的参数中的类型指定了监听的事件。 该方法名可以随意设置。 比如最简单的,监听用户加入服务器的事件(PlayerJoinEvent),代码如下:

package com.xuchaoji.spigot.commanddemo;

import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;

public class ListenerDemo implements Listener {
    @EventHandler
    public void onPlayerJoin(PlayerJoinEvent event) {

    }
}

这里的onPlayerJoin(PlayerJoinEvent event)方法中,传入的参数是一个事件,PlayerJoinEvent,即玩家加入事件,监听其他事件的话,请自行查阅开发文档。以玩家加入服务器的事件来说,这个事件包含了:玩家、加入的时间...等等,而且可以通过玩家,进一步获取玩家所在的世界、坐标、玩家手持物品等等,只要你脑洞够大,能写出很多很有意思的插件。
这里我们仅做一个展示,向登录的玩家发送一个欢迎信息,并向服务器广播'xxx手持xxx进入了服务器。',监听器代码如下:

package com.xuchaoji.spigot.commanddemo;

import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.inventory.ItemStack;

import net.md_5.bungee.api.ChatColor;

public class ListenerDemo implements Listener {
    @EventHandler
    public void onPlayerJoin(PlayerJoinEvent event) {
        //获取玩家ID并发送欢迎消息
        Player player = event.getPlayer();
        String playerName = player.getName().toString();
        player.sendMessage(ChatColor.AQUA+playerName+"欢迎加入服务器。");
        //获取玩家手持物品,并向全服务器广播
        ItemStack item = player.getInventory().getItemInMainHand();
        //ItemStack传入参数包含Material类型和数量,下面获取material的类型
        String itemName = item.getType().name();
        //向服务器发送公告
        Bukkit.broadcastMessage(ChatColor.AQUA+playerName+"手持"+itemName+"来到了这个世界!");
    }
}

1.6运行效果

13-join-Event.png

1.7 可以监听哪些事件

完整事件列表见org.bukkit.event包。 请参阅Spigot JavaDocs

以上即为事件监听器的简单使用教程,涉及的代码见Github:CmdDemo。接下来将深入介绍一下监听器的高级功能以及如何创建自己的监听器。

二、高级功能

2.1 EventHandler参数

org.bukkit.event.EventHandler批注接受几个参数。

  • priority:表示侦听器的优先级。 按执行顺序有六种不同的优先级:LOWEST,LOW,NORMAL [默认],HIGH,HIGHEST,MONITOR。 这些常量引用org.bukkit.event.EventPriority枚举。注意:MONITOR优先级仅应用于只读。 此优先级对于记录插件以查看事件的结果非常有用,修改值可能会干扰这些类型的插件。
  • ignoreCancelled:一个布尔值,指示如果事件在侦听器处理事件之前已被取消,是否应该触发侦听器。 默认为False。