温馨提示: 这篇文章于2928天前编写,现在可能不再适用或落后.

监听器是什么?

监听器是什么?监听器就是当玩家破坏方块、放置方块或者世界天气改变、怪物出生等多种事件触发即监听,就好比如说,玩家破坏了某个方块,插件并且监听到了是谁破坏的,并且是哪个位置、破坏的是什么方块都可以获取。从而进行我们自己接下来需要实现的内容。

Bukkit的监听器非常的简单,BukkitAPI文档提供了很多监听事件有玩家监听、实体监听、服务器监听、背包监听、方块监听、天气监听、世界监听等多种包。

Bukkit实现监听事件首先需要加上@EventHandler标识符让插件知道这个是监听事件。

@EventHandler也是有优先级的。优先级就是谁先执行,谁后执行。

只有一个@EventHandler是代表默认优先级。

//最高优先级,也就是这个事件只要触发了,第一个就执行他
@EventHandler(priority = EventPriority.LOWEST)
//最低优先级,也就是如果存在多个相同事件,先执行其他时间,最后执行他
@EventHandler(priority = EventPriority.HIGHEST)
//如果存在多个相同优先级的话,就会按照默认来执行

| 名称
            | 类型 | 默认值 | 描述 | 值
            | | --- | --- | --- | --- | --- | | priority | EventPriority | EventPriority.NORMAL | 设置监听事件的优先级 | 事件优先级

EventPriority.LOWEST
EventPriority.LOW
EventPriority.NORMAL
EventPriority.HIGH
EventPriority.HIGHEST
EventPriority.MONITOR | | ignoreCancelled | boolean | false | 设置监听事件是否取消,默认为false,设置为true后将不会执行
    | true
       false |

第一个执行EventPriority.LOWEST
第二个执行EventPriority.LOW
第三个执行EventPriority.NORMAL
第四个执行EventPriority.HIGH
第五个执行EventPriority.HIGHEST
第六个执行EventPriority.MONITOR

一般没有特殊情况,我们都用默认值就行了。你可以视为MONITOR是用来查看监听的结果的.

比如我们监听玩家的加入游戏事件,加入游戏的监听事件在 org.bukkit.event.player包中,该包提供了很多玩家事件。

加入游戏事件就是PlayerJoinEvent如此就可以在主类中写下

@EventHandler
public void onPlayerJoin(PlayerJoinEvent event){
    //监听后需要实现的代码
}

onPlayerJoin是自定义的名称可以任意,PlayerJoinEvent则是BukkitAPI提供的监听事件,event则是监听获取的数据。

具体的监听数据可以在BukkitAPI文档的org.bukkit.event.player中的PlayerJoinEvent中查看

由此看来获得了玩家加入游戏的数据后就可以进行操作了,就比如说当玩家加入游戏后向全服的玩家发送一条消息 xxx加入了游戏。

@EventHandler
public void onPlayerJoin(PlayerJoinEvent event){
    //监听后需要实现的代码
    Bukkit.broadcastMessage("§e玩家"+event.getPlayer().getName()+"加入了游戏");
}

Bukkit.broadcastMessage方法的意思是向服务器发送一条信息,并且所有玩家都可以看到。

写好监听器后就可以实现了吗?当然不可以咯。你还需要注册监听器,在onEnable()方法中进行注册监听器。不注册的话插件是不会监听该事件的。

首先必须让主类Test实现Listener接口,然后才在onEnable()方法中进行注册监听器。也就是说,你的类只要有监听事件,就必须实现Listener接口

所以最后的代码就是:

package com.acgxt.test;

import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;

public class Test extends JavaPlugin implements Listener{
    @Override
    public void onEnable(){
        getLogger().info("插件已加载完毕");
        //注册监听
        Bukkit.getPluginManager().registerEvents(this,this);
    }
    @Override
    public void onDisable(){
        getLogger().info("插件已卸载");
    }
    @EventHandler
    public void onPlayerJoin(PlayerJoinEvent event){
        //监听后需要实现的代码
        Bukkit.broadcastMessage("§e玩家"+event.getPlayer().getName()+"加入了游戏");
    }
}

使用Bukkit.getPluginManager().registerEvents()方法进行注册监听器。

registerEvents()方法有两个参数,第一个是代表监听事件在哪一个类中生效,第二个参数是插件主类

所以监听的事件可以写在另外一个类中,如果监听事件是写在插件主类中的话,那么就可以两个参数都写为this代表自身。

另一个类的话,就是用 new 那个类。

@Override
public void onEnable(){
    getLogger().info("插件已加载完毕");
    //注册监听
        //如果监听事件写在Events类中就可以使用new Events();写在主类就直接使用this
        Bukkit.getPluginManager().registerEvents(new Events(),this);//把监听事件写在Events中使用
    Bukkit.getPluginManager().registerEvents(this,this);//把监听事件写在当前类中使用(也就是主类)
}

如果是不想使用监听了呢?那就注销监听吧。
   注销监听有两种,一种是单个注销,另一个则是全部注销。

所谓单个注销也就是将一个监听事件注销,比如我设置了玩家移动事件,然后设置一个单个注销只将玩家移动注销即可。另一个全部注销,顾名思义,就是把监听事件的所有监听都注销。

//单个事件注销 PlayerJoinEvent为需要注销的事件名称。 PlayerJoinEvent.getHandlerList().unregister(Plugin);//指的是插件 PlayerJoinEvent.getHandlerList().unregister(Listener);
//全部事件注销
HandlerList.unregisterAll();//注销所有监听事件,参数可选,一个是注销插件监听事件,一个是注销Listener的事件
HandlerList.unregisterAll(参数);//这里面的参数可以选择Plugin或者是Listener

重要:关于如果你的代码出现有歧义的话可以强转类型传递

//将你的监听事件所在的类,或当前类(this)强制转换为Plugin类即可 Listener同样
PlayerJoinEvent.getHandlerList().unregister((Plugin)this);

关于注销监听事件如果不清楚的可以去查阅官方事件监听文档:https://wiki.bukkit.org/Event_API_Reference

使用BukkitAPI提供的监听事件就是这样,使用很简单。但是Bukkit提供的监听事件也是有限制的,比如当玩家没有移动1分钟后触发事件等,当然你也可以自行创建自定义的监听事件,创建也很简单。

自定义监听事件

这里先介绍一个监听事件的创建,之后的文章在详细讲解自定义监听事件的详细创建。

自定义监听事件必须实现一个静态的getHandlerList()方法和一个getHandlers()方法。

自定义监听需要继承Event类才能够实现。还可以设置监听事件的各种方法。

package com.acgxt.test;

import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;

public class LoginEvent extends Event{
    private static final HandlerList handlers = new HandlerList();
    private Player player;
    
    public PlayerEvent(Player player){
        this.player = player;
    }
    public HandlerList getHandlers() {
         return handlers;
    }
    public static HandlerList getHandlerList() {
        return handlers;
    }
    public Player getPlayer(){
        return player;
    }
}

上面的getPlayer()是一个自定义的方法。用于获取是谁执行了这个命令。

调用这个监听事件可以使用,注意,自定义监听器并不是随时都会用到的,我举个例子,比如你自己制作了一个登陆插件,但是不想每次把登陆成功后的东西继续写到代码后,那么你就可以创建一个自定义监听器来自己监听调用。

//创建一个LoginEvent事件
LoginEvent = new LoginEvent(player);
//触发事件这个(不触发这个监听器,怎么监听呢?)
Bukkit.getServer().getPluginManager().callEvent(event);

最后,就可以监听这个事件了。

@EventHandler
public void onLoginEvent(LoginEventevent){
    //你的代码
}

好了,以上就是监听事件的大部分内容了。

注意:Bukkit制作插件如果遇到疑难问题却找不到人解决怎么办?百度?百度基本都没有自己需要的,Bukkit论坛是最好的去处,什么不懂英文?百度翻译?百度翻译翻译httpss地址经常容易崩溃,英语渣的话可以翻墙上谷歌翻译是最好的。

毕竟BukkitAPI没有专业人员来翻译,百度也没有关于Bukkit更深层的教程。

2016-10-30 10:43:24加:mcbbs已有团队翻译

请勿直接转载该文章

    阁下需要登录后才可以查看评论哦~

    随便看看

      载入中...

      正在准备穿越次元,阁下请稍等片刻~