自定义事件
创建自定义事件是为你的插件添加功能的好方法。 这将允许其他插件监听你的自定义事件并为你的插件添加功能。
创建自定义事件
要创建自定义事件,你需要创建一个继承 Event 的类。
每个事件都需要一个 HandlerList,它将包含所有监听该事件的监听器。
这个要求的唯一例外是当你有一个不能被触发但作为其他事件的父类的事件类时。
一个例子就是 BlockPistonEvent,它不能被直接监听。
这个列表用于在事件被调用时调用监听器。
信息
虽然 getHandlerList 不是从 Event 继承的,但你需要添加一个静态的 getHandlerList() 方法并返回你的事件的 HandlerList。
这两个方法都是你的事件正常工作所必需的。
PaperIsCoolEvent.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;
}
}
现在我们已经创建了我们的事件,我们可以为它添加一些功能。 也许这将包含一个在事件被调用时广播到服务器的消息。
PaperIsCoolEvent.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 Component getMessage() {
return this.message;
}
public void setMessage(Component message) {
this.message = message;
}
public static HandlerList getHandlerList() {
return HANDLER_LIST;
}
@Override
public HandlerList getHandlers() {
return HANDLER_LIST;
}
}
调用事件
现在我们已经创建了我们的事件,我们可以调用它了。
ExamplePlugin.java
public class ExamplePlugin extends JavaPlugin {
// ...
public void callCoolPaperEvent() {
PaperIsCoolEvent coolEvent = new PaperIsCoolEvent(Component.text("Paper 很酷!"));
coolEvent.callEvent();
// 插件可能在它们的监听器中改变了消息。所以我们需要再次获取消息。
// 这个事件结构允许其他插件根据他们的喜好改变消息。
// 比如,一个为所有消息添加前缀的插件。
Bukkit.broadcast(coolEvent.getMessage());
}
}
实现取消功能
如果你想允许你的事件被取消,你可以实现 Cancellable 接口。
PaperIsCoolEvent.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;
}
}
现在,当事件被调用时,你可以检查它是否被取消并相应地采取行动。
ExamplePlugin.java
public class ExamplePlugin extends JavaPlugin {
// ...
public void callCoolPaperEvent() {
PaperIsCoolEvent coolEvent = new PaperIsCoolEvent(Component.text("Paper 很酷!"));
coolEvent.callEvent();
if (!coolEvent.isCancelled()) {
Bukkit.broadcast(coolEvent.getMessage());
}
}
}
当一个事件是可取消的时,Event#callEvent()
如果事件被取消,将返回 false。这允许你直接在你的 if 语句中使用 callEvent,
而不是必须手动检查 Cancellable#isCancelled()。
ExamplePlugin.java
public class ExamplePlugin extends JavaPlugin {
// ...
public void callCoolPaperEvent() {
PaperIsCoolEvent coolEvent = new PaperIsCoolEvent(Component.text("Paper 很酷!"));
if (coolEvent.callEvent()) { // 直接从 callEvent 获取输出
Bukkit.broadcast(coolEvent.getMessage());
}
}
}