首页 > 其他分享 >使用事件API

使用事件API

时间:2023-08-18 23:45:33浏览次数:49  
标签:bukkit import public API 事件 使用 org event

使用事件 API

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

创建你的第一个监听器

假设已经初始化创建好 Spigot 插件开发的基本代码框架,若没有,可以参考本文章: 用 Gradle Groovy 构建你的 Spigot 插件

准备监听器

监听器必须实现 org.bukkit.event.Listener 接口。你的监听器类现在应该看起来像这样:

import org.bukkit.event.Listener;

public class MyListener implements Listener {

}

注册监听器

现在有必要注册这个类的一个实例,这样 Spigot 就能把事件传递给你的插件。在主类的 onEnable() 方法中,是创建一个新的监听器实例并注册它的常见区域。例如如下高亮行:

    @Override
    public void onEnable() {
        getServer().getPluginManager().registerEvents(new MyListener(), this);
    }

现在你已经准备好继续向你的监听器添加事件了。

监听事件

要在您的监听器类中监听任何给定的事件,您必须创建一个附加有 org.bukkit.event.EventHandler 注解的方法,并且该事件是由方法参数中的类型指定。该方法可以任意命名。例如:

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

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

     }
}

只要有玩家加入服务器,这个方法就会启动。让接下来实现全服广播。

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

public class MyListener implements Listener {
     @EventHandler
     public void onPlayerJoin(PlayerJoinEvent event) {
         Bukkit.broadcastMessage("Welcome to the server!");
     }
}

操纵事件

你可以修改大多数事件发生的情况,也可以获得有关给定事件的信息。这些功能都存储在你的方法中的事件对象中。让我们来修改一个玩家加入服务器时广播的信息。

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

public class MyListener implements Listener {
     @EventHandler
     public void onPlayerJoin(PlayerJoinEvent event) {
         event.setJoinMessage("Welcome, " + event.getPlayer().getName() + "!");
     }
}

可监听的事件

浏览 org.bukkit.event 包,以获得你可以监听的全部事件列表。请阅读 Spigot JavaDocs

高级功能

事件处理程序参数

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

priority - 表示你的监听器的优先级。有六个不同的优先级,按执行顺序排列。LOWEST, LOW, NORMAL[默认], HIGH, HIGHEST, MONITOR。这些常量参考了 org.bukkit.event.EventPriority 枚举。

注意

MONITOR 的优先级只能用于读取。这个优先级对于日志插件查看事件的结果很有用,修改数值可能会干扰这些类型的插件。

ignoreCancelled - 一个布尔值,表示如果事件在轮到监听器处理之前被取消了,你的监听器是否应该启动。默认为 false

例如:

import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;

public class MyListener implements Listener
{
     // Executes before the second method because it has a much lower priority.
     @EventHandler (priority = EventPriority.LOWEST)
     public void onPlayerChat1(AsyncPlayerChatEvent event) {
         event.setCancelled(true);
     }

     // Will not execute unless another listener with a  lower priority has uncancelled the event.
     @EventHandler (priority = EventPriority.HIGHEST, ignoreCancelled = true)
     public void onPlayerChat2(AsyncPlayerChatEvent event) {
         System.out.println("This shouldn't be executing.");
     }
}

取消注册监听器

不幸的是,取消监听器的注册并不像注册那样简单,尽管它一点也不难。它是这样做的:

// import org.bukkit.event.HandlerList
//import (your listener)
HandlerList.unregisterAll(Listener);

创建自定义事件

有时你需要创建你自己的事件,一个其他插件可以监听的事件,甚至可以取消。

创建事件

首先,你的类必须扩展 Event。

import org.bukkit.event.Event;

public class ExampleEvent extends Event {

}

乍一看,这似乎是你需要做的所有事情,但在运行你的程序后,你会收到 Spigot 的错误信息。这是因为,虽然没有大量的文档,但你需要在你的事件类中加入以下方法:

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

public class ExampleEvent extends Event {

    private static final HandlerList HANDLERS = new HandlerList();

    public static HandlerList getHandlerList() {
        return HANDLERS;
    }

    @Override
    public HandlerList getHandlers() {
        return HANDLERS;
    }

}

你需要这些方法,因为 Spigot 使用 HandlerList 类将其他 EventHandlers 与监听其他事件分开。

我们现在可以添加一些实现来使我们的事件完整:

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

public class ExampleEvent extends Event {

    private static final HandlerList HANDLERS = new HandlerList();
    private final String playerName;

    public static HandlerList getHandlerList() {
        return HANDLERS;
    }



    public ExampleEvent(String playerName) {
        this.playerName = playerName;
    }


    @Override
    public HandlerList getHandlers() {
        return HANDLERS;
    }

    public String getPlayerName() {
        return this.playerName;
    }

}

发送和监听事件

发送事件相对容易些:

ExampleEvent exampleEvent = new ExampleEvent("Msrules123"); // 初始化事件
Bukkit.getPluginManager().callEvent(exampleEvent); // 这将触发该事件,并允许任何监听器监听该事件。
Bukkit.getPlayer("Msrules123").sendMessage(exampleEvent.getPlayerName()); // 使用自定义的事件数据

而监听它和其他事件是一样的:

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

public class ExampleListener implements Listener {

   @EventHandler
   public void onExampleEvent(ExampleEvent event) {
       // Handle implementation here
   }

}

可撤销事件

为了使你的事件可被撤销,只需实现Cancellable。这很简单:

import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;

public class ExampleEvent extends Event implements Cancellable {

    private static final HandlerList HANDLERS = new HandlerList();
    private final String playerName;
    private boolean isCancelled;

    public static HandlerList getHandlerList() {
        return HANDLERS;
    }



    public ExampleEvent(String playerName) {
        this.playerName = playerName;
        this.isCancelled = false;
    }

    @Override
    public boolean isCancelled() {
        return this.isCancelled;
    }

    @Override
    public void setCancelled(boolean isCancelled) {
        this.isCancelled = isCancelled;
    }

    @Override
    public HandlerList getHandlers() {
        return HANDLERS;
    }

    public String getPlayerName() {
        return this.playerName;
    }

}

现在,你不是直接使用你的事件数据,而是在检查你的事件是否被撤销后使用:

ExampleEvent exampleEvent = new ExampleEvent("Msrules123");
Bukkit.getPluginManager().callEvent(exampleEvent);
if (!exampleEvent.isCancelled()) {
    Bukkit.getPlayer("Msrules123").sendMessage(exampleEvent.getPlayerName());
}

标签:bukkit,import,public,API,事件,使用,org,event
From: https://www.cnblogs.com/iloveworld/p/17641838.html

相关文章

  • 老问题了:idea中使用maven archetype新建项目时卡住
    背景作为一个后端Java打工人,idea就是最重要的打饭工具。创建项目,熟悉吧,但是,这么多年下来,因为idea换了版本,电脑换了等等,我还是时不时遇到根据mavenarchetype新建maven项目卡住。没错,我说的就是下面这样的场景:总之吧,就是停在上面这里,不动了:[INFO]---maven-archetype-plugin:......
  • 容器内部使用的比较函数书写方式
    例如:priority_queue为例子。#include<queue>std::priority_queue<Type,Container,Compare>pq;type:优先队列中存储的元素的数据类型。Container:存储元素的底层容器类型,默认为std::vector<Type>Compare:比较函数或函数对象,用于定义元素的比较原则,可以是一个函数指针、函数对象......
  • 容器内部使用的比较函数书写方式
    例如:priority_queue为例子。#include<queue>std::priority_queue<Type,Container,Compare>pq;type:优先队列中存储的元素的数据类型。Container:存储元素的底层容器类型,默认为std::vector<Type>Compare:比较函数或函数对象,用于定义元素的比较原则,可以是一个函数指针、函数对象......
  • 容器内部使用的比较函数书写方式
    例如:priority_queue为例子。#include<queue>std::priority_queue<Type,Container,Compare>pq;type:优先队列中存储的元素的数据类型。Container:存储元素的底层容器类型,默认为std::vector<Type>Compare:比较函数或函数对象,用于定义元素的比较原则,可以是一个函数指针、函数对象......
  • 容器内部使用的比较函数书写方式
    例如:priority_queue为例子。#include<queue>std::priority_queue<Type,Container,Compare>pq;type:优先队列中存储的元素的数据类型。Container:存储元素的底层容器类型,默认为std::vector<Type>Compare:比较函数或函数对象,用于定义元素的比较原则,可以是一个函数指针、函数对象......
  • 容器内部使用的比较函数书写方式
    例如:priority_queue为例子。#include<queue>std::priority_queue<Type,Container,Compare>pq;type:优先队列中存储的元素的数据类型。Container:存储元素的底层容器类型,默认为std::vector<Type>Compare:比较函数或函数对象,用于定义元素的比较原则,可以是一个函数指针、函数对象......
  • Vue中使用Element
    Vue中使用Element.UI菜单完成主体页面搭建一.搭建ElementUI基础环境(基于脚手架)1.新建空的文件夹,文件夹命名自定义2.在文件资源管理器上方输入cmd3.然后在控制台中输入vuecreate(自定义名称)注意:只支持小写输入完后按Enter4.在第一个选择项中选择Manuallyselectfeatures5.第......
  • uniapp中使用过滤器filters来格式化时间
    uniapp中使用过滤器filters来格式化时间看那个创云商城源码的时候看到的,觉得蛮有用的,扒下来备用,应该也能直接用于JS  <template><viewclass="mix-timeline"><viewclass="cell"v-for="(item,index)inlist":key="index">......
  • cf tool 使用指南
    本文作者使用powershell而非cmd。本文作者使用powershell而非cmd。本文作者使用powershell而非cmd。下载下载地址:https://github.com/woshiluo/cf-tool/releases/tag/v1.0.1这不是xalanq的原版,原版有bug。对于Windows系统,请下载cf.exe。配置开始首先,......
  • 20230818 CHAPTER 5 Thanks for the Memories arm64汇编内存使用
    .data段的内存引用实例十进制数不要以0开头,否则会被认为是8进制数一个数前面可以加-负号或者~取反符号; 申请一个内存块; 重复!转义字符!内存对齐  TheoffsetfromthePChas19bitsintheinstruction,whichgivesarangeof+/-1MB. Theoffsetaddress......