自定义事件

你可以编写你自己的事件类,然后使用之前提到的方法去调度它们。一个事件类必须继承自 AbstractEvent 类,当然同时实现了 Event 接口。开发者应根据事件的不同性质实现不同的接口,如 Cancellable 表示该事件可以被取消,一些诸如 TargetPlayerEvent 的事件接口代表了事件发生时影响到的对象类型。

示例:自定义事件类

下面这个类描述了一个指示一个 :javadoc:Player 曾经接触过一个 FLARD 然后在即将变异时触发的事件。因为这个事件的目标是玩家,并且可以取消,所以它实现了 TargetPlayerEventCancellable 两个接口。

因为一般的自定义事件旨在使其他插件监听,所以最好的办法自然是把它们以合适的方式整理归类。我们可以在 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.event.cause.Cause;
import org.spongepowered.api.event.cause.EventContext;
import org.spongepowered.api.event.cause.EventContextKeys;
import org.spongepowered.api.Sponge;

PluginContainer plugin = ...;
EventContext eventContext = EventContext.builder().add(EventContextKeys.PLUGIN, plugin).build();

PlayerMutationEvent event = new PlayerMutationEvent(victim, PlayerMutationEvent.Mutation.ROTTED_SOCKS,
        Cause.of(eventContext, plugin));
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 cannot combust here, this is a non-smoking area!"));
    }
}