欢迎来到Minecraft插件百科!
对百科编辑一脸懵逼?
帮助:快速入门
带您快速熟悉百科编辑!
因近日遭受攻击,百科现已限制编辑,有意编辑请加入插件百科企鹅群:223812289
查看“Paper/自定义事件”的源代码
←
Paper/自定义事件
跳转到导航
跳转到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于这些用户组的用户执行:
用户
、
自动确认用户
、
巡查者
您可以查看和复制此页面的源代码。
创建自定义事件是为你的插件添加新功能的不错的方式。<br /> 这将允许其它插件监听你的自定义事件并为你的插件添加新功能。 == 创建一个自定义事件 == 要创建一个自定义事件,你需要创建一个继承 <code>Event</code> 的类。每个事件都要求有一个 <code>HandlerList</code> 以存储所有监听该事件的监听器。<br /> 唯一一种例外情况是某个事件被有意设计为不可监听以便作其他事件的父类所用。比如 <code>BlockPistonEvent</code> 没有 <code>HandlerList</code>,所以不能被监听。<br /> HandlerList 用于在事件被触发时,调用所有的监听器。 译注:虽然不能直接监听“活塞事件”,但是可以监听“活塞推出事件”和“活塞收回事件”。同理,尽管无法直接监听“玩家事件”,但是可以监听“玩家加入事件”、“玩家退出事件”等等。 <code>BlockPistonEvent</code> 是一个抽象类,自然不会用于直接监听。即使其不是抽象类也不能用于直接监听。 <blockquote>'''关于<code>getHandlerList</code>的信息:'''<br /> 尽管这一方法不是从 <code>Event</code> 类继承来的,你仍需要添加一个静态 <code>getHandlerList()</code> 方法并返回一个 <code>HandlerList</code>。<br /> 若要使你的事件正常工作, <code>getHandlers</code> 和 <code>getHandlerList</code> 方法必须同时存在。 </blockquote> <syntaxhighlight lang="java"> public class PaperIsCoolEvent extends Event { private static final HandlerList HANDLER_LIST = new HandlerList(); public static HandlerList getHandlerList() { return HANDLER_LIST; } @Override public HandlerList getHandlers() { return HANDLER_LIST; } } </syntaxhighlight> 既然已经创建好了我们的事件,我们现在可以为它添加许多功能啦!<br /> 比如:我们想要在这个 <code>PaperIsCoolEvent</code> 事件被调用时,在服务器内发送一条广播。 <syntaxhighlight lang="java"> public class PaperIsCoolEvent extends Event { private static final HandlerList HANDLER_LIST = new HandlerList(); private Component message; public PaperIsCoolEvent(Component message) { this.message = message; } public static HandlerList getHandlerList() { return HANDLER_LIST; } @Override public HandlerList getHandlers() { return HANDLER_LIST; } public Component getMessage() { return this.message; } public void setMessage(Component message) { this.message = message; } } </syntaxhighlight> == 调用事件 == 既然我们已经创建好了这个事件,我们接下来就可以触发它。 <syntaxhighlight lang="java"> public class ExamplePlugin extends JavaPlugin { // ... public void callCoolPaperEvent() { PaperIsCoolEvent coolEvent = new PaperIsCoolEvent(Component.text("Paper is cool!")); coolEvent.callEvent(); // 插件可以通过监听器来对消息作出更改。所以在事件被调用后我们需要重新获取消息内容。 // 这一段代码允许其它插件按自己的需求更改广播消息。 // 举个例子:某一插件通过监听该事件来为所有广播消息添加前缀。 Bukkit.broadcast(coolEvent.getMessage()); } } </syntaxhighlight> == 取消实现 == 如果你想要让你的事件可被取消,则可以令其实现 <code>Cancellable</code> 接口。 <syntaxhighlight lang="java"> public class PaperIsCoolEvent extends Event implements Cancellable { private static final HandlerList HANDLER_LIST = new HandlerList(); private Component message; private boolean cancelled; // ... @Override public boolean isCancelled() { return this.cancelled; } @Override public void setCancelled(boolean cancelled) { this.cancelled = cancelled; } } </syntaxhighlight> 现在,当事件被调用后,你就可以检查它是否被正常取消了。 <syntaxhighlight lang="java">public class ExamplePlugin extends JavaPlugin { // ... public void callCoolPaperEvent() { PaperIsCoolEvent coolEvent = new PaperIsCoolEvent(Component.text("Paper is cool!")); coolEvent.callEvent(); if (!coolEvent.isCancelled()) { Bukkit.broadcast(coolEvent.getMessage()); } } } </syntaxhighlight> 当一个事件是可以被取消的,并且事件已经被取消了,<code>Event#callEvent</code> 方法会返回 <code>false</code>。这就允许你直接在 if 语句中使用 <code>callEvent</code> 方法的返回值,无需再调用 <code>Cancellable#isCancelled</code> 方法手动检查了。 <syntaxhighlight lang="java"> public class ExamplePlugin extends JavaPlugin { // ... public class ExamplePlugin extends JavaPlugin { // ... public void callCoolPaperEvent() { PaperIsCoolEvent coolEvent = new PaperIsCoolEvent(Component.text("Paper is cool!")); if (coolEvent.callEvent()) { // 直接通过 callEvent 方法获取结果。 Bukkit.broadcast(coolEvent.getMessage()); } } } </syntaxhighlight>
返回
Paper/自定义事件
。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
查看
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
编辑相关
百科公告
编辑帮助
互助客栈
贡献分数
测试沙盒
发布条目
插件分类
管理
安全
聊天
编程
经济
修正
娱乐
综合
信息
机械
角色
传送
网页
整地
创世
付费
其它
工具
链入页面
相关更改
特殊页面
页面信息
相关网站
MCMOD百科
Minecraft中文百科
Minecraft纪念论坛
Minecraft百度贴吧
虚无世界Wiki