事件监听是Bukkit插件最主要的功能实现渠道,甚至是使用nms也是为其服务,甚至你自己写的操作口也和他的本质差不了多少。简单描述事件监听就是:Bukkit将游戏内的各种行为标出,在行为执行前后设置插入点来限制这些行为或者当做触发器用,例如着火了行为,我可以利用Bukkit在着火前取消、修改着火原因,在着火时让特定被着火物体灭火,着火后掉多少血(或者是更奇怪的浴火重生),都是可以依靠事件系统搞定的。
事件监听编写可以直接写到主类,也可以单独一个类,由于我们要监听的事件很多,所有我们只讲单独一个类的形式。仍然,为了方便管理,我们在主包下面建立一个监听子包,存放 事件监听类A.java →:
//事件监听类实现了Listener接口
public class 事件监听类A implements Listener {
//这句先不要在意
private static String smotd = "§6RNM退钱!!\n对得起我们吗?!";
//其内部的事件监听方法一个只能监听一个事件,使用@EventHandler修饰代表该方法是事件监听方法
@EventHandler
//此处监听的是PlayerLoginEvent,即玩家登陆事件,时间节点是玩家出现在游戏世界的前一瞬间
//参见https://bukkit.windit.net/javadoc/org/bukkit/event/player/PlayerLoginEvent.html
public void onLogin(PlayerLoginEvent e) {
//e作为方法唯一参,他可以轻松获取我们需要的对象并进行操作
//如果e.获取事件对应玩家.等同于(“sb”)
if(e.getPlayer().equals("sb")) {
//那么e.执行禁止登陆(人满为由,消息显示"sb不允许登入")
e.disallow(PlayerLoginEvent.Result.KICK_FULL, "sb不允许登入");
}
}
//同样修饰
@EventHandler
//监听刷新本服MOTD的事件
public void onPing(ServerListPingEvent e) {
//MOTD设置为smotd对象
e.setMotd(smotd);
//设置服务器图标,图标是出主类引来的
e.setServerIcon(CyanHoning.csi);
}
}
事件监听类是这样写的,写完我们需要对其注册一下,只需要在C1中的onEnable()方法中加入注册句即可:
@Override
public void onEnable() {
//初始化插件静态化
ins = this;
//输出配置文件config.yml,不用也还是输出好,创建个文件夹表明正常启动了
saveDefaultConfig();
//监听类注册,流程是:BukkitAPI调用.获取插件管理器.注册事件类(new 事件类, 本插件);
Bukkit.getPluginManager().registerEvents(new 事件监听类A, this);
Bukkit.getPluginManager().registerEvents(new 事件监听类B, this);
//加载成功信息
Bukkit.getConsoleSender().sendMessage(ChatColor.BLUE + "CyanHoning插件已经加载成功!");
}
这样,服务器现在多了两个功能,一个是禁止sb进入服务器,一个是设置服务器在多人游戏列表的刷新显示内容。