自定义事件
你可以编写你自己的事件类,然后使用之前提到的方法去调度它们。一个事件类必须继承自 AbstractEvent 类,当然同时实现了 Event 接口。开发者应根据事件的不同性质实现不同的接口,如 Cancellable 表示该事件可以被取消,一些诸如 TargetPlayerEvent 的事件接口代表了事件发生时影响到的对象类型。
示例:自定义事件类
下面这个类描述了一个指示一个 Player
曾经接触过一个 FLARD 然后在即将变异时触发的事件。因为这个事件的目标是玩家,并且可以取消,所以它实现了 TargetPlayerEvent
和 Cancellable
两个接口。
因为一般的自定义事件旨在使其他插件监听,所以最好的办法自然是把它们以合适的方式整理归类。我们可以在 Cause 类中找到一串对象用于表示事件的来源。在下面的示例中,我们虚构了一个 FLARDSource
类用于表示事件的来源信息,并作为根对象包含于事件原因(Cause)中。
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.event.Cancellable;
import org.spongepowered.api.event.cause.Cause;
import org.spongepowered.api.event.entity.living.humanoid.player.TargetPlayerEvent;
import org.spongepowered.api.event.impl.AbstractEvent;
public class PlayerMutationEvent extends AbstractEvent implements TargetPlayerEvent, Cancellable {
public enum Mutation {
COMPULSIVE_POETRY,
ROTTED_SOCKS,
SPONTANEOUS_COMBUSTION;
};
private final Cause cause;
private final Player victim;
private final Mutation mutation;
private boolean cancelled = false;
public PlayerMutationEvent(Player victim, Mutation mutation, Cause cause) {
this.victim = victim;
this.mutation = mutation;
this.cause = cause;
}
public Mutation getMutation() {
return this.mutation;
}
@Override
public boolean isCancelled() {
return this.cancelled;
}
@Override
public void setCancelled(boolean cancel) {
this.cancelled = cancel;
}
@Override
public Cause getCause() {
return this.cause;
}
@Override
public Player getTargetEntity() {
return this.victim;
}
}
示例:发布自定义事件
import org.spongepowered.api.Sponge;
PlayerMutationEvent event = new PlayerMutationEvent(victim, PlayerMutationEvent.Mutation.ROTTED_SOCKS,
Cause.source(flardSource).build());
Sponge.getEventManager().post(event);
if (!event.isCancelled()) {
// Mutation code
}
必须谨记,您必须提供一个非空的事件原因。如果您的事件是可取消的,请确保它在取消之前不会执行相应的操作。
示例:监听自定义事件
import org.spongepowered.api.event.Listener;
import org.spongepowered.api.text.Text;
@Listener
public void onPrivateMessage(PlayerMutationEvent event) {
if(event.getMutation() == PlayerMutationEvent.Mutation.SPONTANEOUS_COMBUSTION) {
event.setCancelled(true);
event.getTargetEntity().sendMessage(Text.of("You can not combust here, this is a non-smoking area!"));
}
}