<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://mineplugin.org/index.php?action=history&amp;feed=atom&amp;title=Paper%2F%E4%BA%8B%E4%BB%B6%E7%9B%91%E5%90%AC%E5%99%A8</id>
	<title>Paper/事件监听器 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://mineplugin.org/index.php?action=history&amp;feed=atom&amp;title=Paper%2F%E4%BA%8B%E4%BB%B6%E7%9B%91%E5%90%AC%E5%99%A8"/>
	<link rel="alternate" type="text/html" href="https://mineplugin.org/index.php?title=Paper/%E4%BA%8B%E4%BB%B6%E7%9B%91%E5%90%AC%E5%99%A8&amp;action=history"/>
	<updated>2026-05-31T05:44:20Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://mineplugin.org/index.php?title=Paper/%E4%BA%8B%E4%BB%B6%E7%9B%91%E5%90%AC%E5%99%A8&amp;diff=18079&amp;oldid=prev</id>
		<title>Poikcue：​创建页面，内容为“&lt;code&gt;Events&lt;/code&gt;（事件）是在游戏中监听某一特定行为发生的有效方式。它们可以被服务器（或插件）触发。&lt;br /&gt; 例如某名玩…”</title>
		<link rel="alternate" type="text/html" href="https://mineplugin.org/index.php?title=Paper/%E4%BA%8B%E4%BB%B6%E7%9B%91%E5%90%AC%E5%99%A8&amp;diff=18079&amp;oldid=prev"/>
		<updated>2022-11-26T05:21:16Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“&amp;lt;code&amp;gt;Events&amp;lt;/code&amp;gt;（事件）是在游戏中监听某一特定行为发生的有效方式。它们可以被服务器（或插件）触发。&amp;lt;br /&amp;gt; 例如某名玩…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;code&amp;gt;Events&amp;lt;/code&amp;gt;（事件）是在游戏中监听某一特定行为发生的有效方式。它们可以被服务器（或插件）触发。&amp;lt;br /&amp;gt;&lt;br /&gt;
例如某名玩家加入了服务器，抑或是某个方块被破坏时，都将触发对应事件。&amp;lt;br /&amp;gt;&lt;br /&gt;
插件能够触发自定义事件，例如玩家完成了某个插件自定义的任务，以供其它插件监听。&lt;br /&gt;
&lt;br /&gt;
== 你的监听器类 ==&lt;br /&gt;
&lt;br /&gt;
要进行监听，你需要创建一个类并实现 &amp;lt;code&amp;gt;Listener&amp;lt;/code&amp;gt; 接口。&amp;lt;br /&amp;gt;&lt;br /&gt;
类名可任取，不过建议使用与该类所监听的事件相关的名称。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ExampleListener implements Listener {&lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;eventhandler&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== &amp;lt;code&amp;gt;@EventHandler&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
要监听某一个事件，你需要创建一个含有 &amp;lt;code&amp;gt;@EventHandler&amp;lt;/code&amp;gt; 注解 ( &amp;lt;code&amp;gt;annotation&amp;lt;/code&amp;gt; ) 的方法。&amp;lt;br /&amp;gt;&lt;br /&gt;
同理，方法名可任取，不过建议使用与该方法所监听的事件相关的名称，并避免无意义方法名。&lt;br /&gt;
&lt;br /&gt;
== 监听器方法 ==&lt;br /&gt;
&lt;br /&gt;
方法体无需返回任何值，因此建议使用 &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; 作为返回类型。&amp;lt;br /&amp;gt;&lt;br /&gt;
监听器方法有且仅有一个参数，其类型为该方法所监听的事件的类型。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ExampleListener implements Listener {&lt;br /&gt;
&lt;br /&gt;
    @EventHandler&lt;br /&gt;
    public void onPlayerJoin(PlayerJoinEvent event) {&lt;br /&gt;
        // ...&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;由于插件可以自定义事件，这里无法列出一份包括所有可监听事件的列表。不过在[https://jd.papermc.io/paper/1.19/org/bukkit/event/Event.html 这里]可以了解 Paper 所提供的 &amp;lt;code&amp;gt;Event&amp;lt;/code&amp;gt; 类的全部子类。&lt;br /&gt;
&lt;br /&gt;
仅有实现了静态 &amp;lt;code&amp;gt;getHandlerList&amp;lt;/code&amp;gt; 方法的事件才能被监听。&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
== 注册监听器 ==&lt;br /&gt;
&lt;br /&gt;
要注册监听器，你需要调用 &amp;lt;code&amp;gt;Bukkit.getPluginManager().registerEvents()&amp;lt;/code&amp;gt; 并传入监听器类的实例和你的插件主类的实例。&lt;br /&gt;
&lt;br /&gt;
这一方法将会注册监听器，并允许它监听事件。&amp;lt;br /&amp;gt;&lt;br /&gt;
这一方法通常写在你的插件主类的 &amp;lt;code&amp;gt;onEnable()&amp;lt;/code&amp;gt; 方法中，此时监听器将在服务器开始计算游戏刻 (tick) 时注册。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ExamplePlugin extends JavaPlugin {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onEnable() {&lt;br /&gt;
        getServer().getPluginManager().registerEvents(new ExampleListener(), this);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;eventpriority&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== EventPriority ==&lt;br /&gt;
&lt;br /&gt;
你也可以指定事件监听器的优先级。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class ExampleListener implements Listener {&lt;br /&gt;
&lt;br /&gt;
    @EventHandler(priority = EventPriority.HIGH)&lt;br /&gt;
    public void onPlayerJoin(PlayerJoinEvent event) {&lt;br /&gt;
        // ...&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
你可以选择六个不同的优先级： - &amp;lt;code&amp;gt;EventPriority.LOWEST&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;EventPriority.LOW&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;EventPriority.NORMAL&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;EventPriority.HIGH&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;EventPriority.HIGHEST&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;EventPriority.MONITOR&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
实际上优先级的顺序与直觉相反。优先级 &amp;#039;&amp;#039;&amp;#039;越高&amp;#039;&amp;#039;&amp;#039;，事件被调用就 &amp;#039;&amp;#039;&amp;#039;越晚&amp;#039;&amp;#039;&amp;#039;。&amp;lt;br /&amp;gt;&lt;br /&gt;
例如：你的插件需要对某个事件一锤定音，此后不希望被其他监听器再作覆盖，则需要使用&amp;lt;code&amp;gt;EventPriority.HIGHEST&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;#039;&amp;#039;&amp;#039;注意&amp;#039;&amp;#039;&amp;#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;MONITOR&amp;lt;/code&amp;gt; 的优先级常常用于获得其他插件对事件的修改结果，而不是亲自修改它。具有此优先级的监听器在所有监听器中排在最后。&amp;lt;br /&amp;gt;&lt;br /&gt;
因此这样的监听器可获悉先前插件对事件的修改，例如事件是否被取消（cancellation）和对事件中某些字段的修改（modification）。&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
== 取消事件 ==&lt;br /&gt;
&lt;br /&gt;
一些事件可以取消，阻止某些行为发生。这些事件类实现了 &amp;lt;code&amp;gt;Cancellable&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
译注：事件的触发时机是在某个行为发生以前，当事件监听器全部运行完毕后，被插件所修改过的事件结果才会真正发生。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ExampleListener implements Listener {&lt;br /&gt;
&lt;br /&gt;
    @EventHandler&lt;br /&gt;
    public void onPlayerJoin(PlayerJoinEvent event) {&lt;br /&gt;
        event.setCancelled(true);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;在你的插件取消某事件之前，请思考一下其它插件是否已经取消或更改了该事件。&amp;lt;br /&amp;gt;&lt;br /&gt;
请先检查事件的各个字段再进行修改！&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
上面的例子会取消事件，这意味着玩家无法加入到服务器中。当一个事件被取消后，其他监听器将继续按顺序被调用下去，除非某个监听器在 &amp;lt;code&amp;gt;@EventHandler&amp;lt;/code&amp;gt; 注解中添加了 &amp;lt;code&amp;gt;ignoreCancelled = true&amp;lt;/code&amp;gt; 以忽略已取消的事件。&lt;br /&gt;
&lt;br /&gt;
如欲忽略已取消的事件，可以这样写：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class ExampleListener implements Listener {&lt;br /&gt;
&lt;br /&gt;
    @EventHandler(ignoreCancelled = true)&lt;br /&gt;
    public void onPlayerJoin(PlayerJoinEvent event) {&lt;br /&gt;
        // ...&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Poikcue</name></author>
	</entry>
</feed>