监听器

每个平台都有监听器(Listener)部分,但 TabooLib 自身不处理监听器。本文所描述的内容仅限监听器的运用,事件的定义请参考 事件 部分。

注册监听器

任何平台的事件都通过同样的方式注册。基于 依赖注入,监听器需要在单例或伴生类中定义。

object MyListener {

    /**
     * 监听器仅接受一个参数,为事件的类型
     */
    @SubscribeEvent
    fun e(e: PlayerJoinEvent) {
        e.player.sendMessage("HelloWorld")
    }
}

不需要实现任何接口以及添加多余的注解,一步到位。

@SubscribeEvent 的属性中包含了各个平台所需要的监听器参数,具体表现为:

Bukkit, Nukkit

属性

作用

示例

priority

优先级

EventPriority.NORMAL

ignoreCancelled

忽略已被取消的事件

false

BungeeCord

属性

作用

示例

level

优先级

0

ignoreCancelled

忽略已被取消的事件

false

Velocity

属性

作用

示例

postOrder

优先级

PostOrder.NORMAL

Sponge 7/8

属性

作用

示例

order

优先级

EventOrder.DEFAULT

beforeModifications

在其他服务器修改前调用监听器

false

可能不存在的事件

假设我们监听了第三方插件中的事件,若这个插件并未安装,那么就会导致整个类无法加载。但往往很多时候,我们不会使用 depend 来解决这个问题。在 TabooLib 中我们可以使用 OptionalEvent 事件来代替。

在 Bukkit 1.8 没有副手也没有 PlayerSwapHandItemsEvent 事件,直接监听会导致插件无法在 1.8 版本使用。

@SubscribeEvent(bind = "org.bukkit.event.player.PlayerSwapHandItemsEvent")
fun onSwap(ope: OptionalEvent) {
    val e = ope.get<PlayerSwapHandItemsEvent>()
    // ...
}

使用 bind 属性指向完整的类名,即可定义一个 可能不存在的事件,同等于直接监听。