サーチ…


イベントリスナーの作成

メソッドを登録するには、EventHandlerを含むクラスがListenerインターフェイスを実装する必要があります。

import org.bukkit.event.Listener;

public final class ListenerClass implements Listener {
}

JavaPluginを拡張するクラスのonEnableメソッドへの次の呼び出しを追加して、イベントリスナーを登録する必要があります。

getServer().getPluginManager().registerEvents(new ListenerClass(), this);

リスナークラスの任意のイベントをリッスンするには、メソッドの@EventHandlerアノテーションを使用してメソッドを作成する必要があります。イベントタイプは、メソッドの唯一の引数のTypeによって指定されます。このメソッドの名前は任意です。

import org.bukkit.event.Listener;
import org.bukkit.event.EventHandler;
import org.bukkit.event.player.PlayerLoginEvent;  

public class ListenerClass implements Listener {
    @EventHandler
    public void onPlayerLogin(PlayerLoginEvent event) {
        event.getPlayer().sendMessage("Welcome to the server!");
    }
}

EventHandlerのパラメータ

org.bukkit.event.EventHandlerアノテーションは、2つのパラメータを受け入れます。

priority - リスナーの優先度を示します。実行の順番には、LOWEST、LOW、NORMAL [デフォルト]、HIGH、HIGHEST、MONITORの6つの優先順位があります。これらの定数は、 org.bukkit.event.EventPriority enumを参照します。

イベントの結果を変更したい場合は、LOWESTからHIGHESTまで非常に慎重に選択してください。 NORMALのLOWEST、より具体的なプラグインの一般化された保護プラグインを提案し、HIGHのプラグインをオーバーライドしました。イベントが発生したときに行動し、結果を変更しない場合は、MONITORを使用します。

注意:MONITORの優先度は、読み取り専用に使用してください。この優先順位は、イベントの結果を表示するためにプラグインをログに記録し、値を変更するとこれらのタイプのプラグインに干渉する可能性があります。

ignoreCancelled - リスナーがイベントを処理する前にイベントがキャンセルされた場合にリスナーが起動するかどうかを示すブール値です。デフォルトではFalseです。

import org.bukkit.event.Listener;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.player.PlayerLoginEvent;

public final class LoginListener implements Listener {
    @EventHandler
    public void normalLogin(PlayerLoginEvent event) {
        // Some code here
    }    

    @EventHandler(priority = EventPriority.HIGH)
    public void highLogin(PlayerLoginEvent event) {
        // Some code here
    }
}

カスタムイベントの作成

他のプラグインが聞くことができるイベント(Vault、他のプラグインの中でもこれを行うイベント)を作成し、キャンセルすることもできます。 BukkitのEvent APIは、これを可能にします。新しいクラスを作成し、 Event拡張し、ハンドラとイベントに必要な属性(Playerやメッセージなど)を追加するだけです。

import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;

public final class CustomEvent extends Event {
    private static final HandlerList handlers = new HandlerList();
    private String message;

    public CustomEvent(String example) {
        message = example;
    }

    public String getMessage() {
        return message;
    }

    public HandlerList getHandlers() {
        return handlers;
    }

    public static HandlerList getHandlerList() {
        return handlers;
    }
}

あなたのカスタムイベントを呼び出す

イベントの作成と呼び出しを制御しています。イベントは完全にあなたのものです。ここに例があります

// Create the event here
CustomEvent event = new CustomEvent("Sample Message");
// Call the event
Bukkit.getServer().getPluginManager().callEvent(event);
Bukkit.getServer().broadcastMessage(event.getMessage());

覚えておいてください:あなたはあなたの出来事をコントロールしています。あなたがそれを呼び出すことなく、それに基づいて行動すれば、それは起こりません!

カスタムイベントのリッスン

カスタムイベントを聞くことは、通常のイベントを聞くことと同じです。

import org.bukkit.event.Listener;
import org.bukkit.event.EventHandler;

public final class CustomListener implements Listener {
    
    @EventHandler
    public void onCustomEvent(CustomEvent event) {
    // Some code here
    }
}

CustomEventをCancellableにする

イベントを取り消し可能にしたい場合は、 implements Cancellableboolean cancelled 、getter and setterを追加してください:

import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Cancellable;

public final class CustomEvent extends Event implements Cancellable {
    private static final HandlerList handlers = new HandlerList();
    private String message;
    private boolean cancelled;

    public CustomEvent(String example) {
        message = example;
    }

    public String getMessage() {
        return message;
    }

    public boolean isCancelled() {
        return cancelled;
    }

    public void setCancelled(boolean cancel) {
        cancelled = cancel;
    }

    public HandlerList getHandlers() {
        return handlers;
    }

    public static HandlerList getHandlerList() {
        return handlers;
    }
}

その後、プラグインがカスタムイベントをキャンセルしたかどうかを確認します。

// Create the event here
CustomEvent event = new CustomEvent("Sample Message");
// Call the event
Bukkit.getServer().getPluginManager().callEvent(event);
// Check if the event is not cancelled
if (!event.isCancelled()) {
    Bukkit.getServer().broadcastMessage(event.getMessage());
}

イベントまたはリスナーの登録を解除する

個々のイベント、リスナークラス全体、またはプラグインによって登録されたすべてのイベント、または他のプラグインの登録を解除することができます!

特定のイベントの登録を解除する

各イベントクラスにはgetHandlerList()静的メソッドがあり、それを呼び出すと、.unregister()メソッドを使用できます。

PlayerInteractEvent.getHandlerList().unregister(plugin);
// this will unregister all PlayerInteractEvent instances from the plugin
// you can also specify a listener class instead of plugin.

これで、カスタムイベントでgetHandlerList()が必要な理由が分かりました。

すべてのイベントの登録を解除する

HandlerListクラスとそのunregisterAll()静的メソッドを使用すると、リスナークラスまたはプラグインからイベントを簡単に登録解除できます。

HandlerList.unregisterAll(plugin);
// this will unregister all events from the specified plugin
// you can also specify a listener class instead of plugin.


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow