サーチ…


前書き

Bukkitの内部で何かが起こると、イベントが呼び出されるので、何かが発生したときに何をすべきかを各プラグインが決めることができます。

プレイヤーがブロックを再生しようとしたとき、エンティティが誰かがログインしたときにブロックを再生しようとすると、イベントが呼び出されます。プラグインは、特定のイベントを聴いたり、さまざまな方法で処理したりできます。 PlayerLoginEventを介してPlayerにログインします。

構文

  • Bukkit.getPluginManager()。registerEvents(リスナl、プラグインp);

備考

イベントを登録するときは、2回登録していないかどうか確認してください。または、登録されたイベントに対してプラグインが2回動作します。

特定のイベントを処理する方法を詳しく見てみましょう:

Listenerクラス内のイベントを登録する

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

public class MyEventListener implements Listener {

    /**
     * Constructor
     */
    public MyEventListener(Main plugin){
        //register Events of this class
        //with methode: registerEvents(Listener, Plugin);
        plugin.getServer().getPluginManager().registerEvents(this, plugin);
    }      

    /**
     * A Event with HIGH priority
     */
    @EventHandler(priority = EventPriority.HIGH) //An EventHandler annotation
    public void onPlayerLogin(PlayerLoginEvent event){  //A bukkit event
        event.getPlayer().sendMessage("Welcome.");
    }
    /**
     * A Event with NORMAL (default) priority
     */
    @EventHandler    
    public void onPlayerQuit(PlayerQuitEvent event){ 
        Bukkit.broadcastMessage(event.getPlayer().getName() + " left the Server.");
    }
        

}

/**
 * Main class
 */
public class Main extends JavaPlugin {
    public void onEnable(){
        //Register Events
        new MyEventListener(this);
    }
}

Mainクラスへのイベントの登録

public class Main extends JavaPlugin {

    @Override
    public void onEnable() {
        Bukkit.getPluginManager().registerEvents(this, this);   
    }
  
    @EventHandler
    public void yourEvent(Event e) {
    //...
    }
}

イベントを聞く

Bukkitは、プラグイン開発者が世界中で発生したサーバーや特定のアクションと対話して変更することを可能にするイベントベースのシステムを使用します。


イベントハンドラの作成

イベントハンドラは、イベントが発生したときに呼び出されるメソッドです。それらは一般的に公開されており、慣例によりon{EventNameStem}名前が付けられon{EventNameStem}ます。ただし、すべてのハンドラは@EventHandlerアノテーションを持つ必要があります。また、そのイベントをONLYパラメータとして含める必要があります。次に、 PlayerJoinEventイベントハンドラの例をPlayerJoinEvent

@EventHandler
public void onPlayerJoin(PlayerJoinEvent event){
    //Run when a player joins
}

注: Bukkitイベントの命名フォーマットは{Source}{Action}({Target})Eventです。これらのイベント名の例は、 PlayerInteractEventまたはBlockBreakEventまたはPlayerJoinEventです。すべてのイベントのリストはSpigot Javadocsにあります


イベントの登録

単にイベントハンドラを作成するだけでは、Bukkitがあなたのメソッドにイベントコールを送信し始めることはできません。また、PluginManagerインタフェースを使用して登録する必要があります。

イベントを登録する最も一般的な方法は、Listenerインターフェイスを実装するクラスを作成し、イベントハンドラをラップすることです。

public class EventListener implements Listener { //Implements the Listener interface

    @EventHandler
    public void onPlayerJoin(PlayerJoinEvent event){
        //Run when a player joins
    }

}

このリスナークラスとそのすべてのイベントは、メインプラグインクラスに次のように登録できます。

@Override
public void onEnable(){
    Bukkit.getPluginManager().registerEvents(new EventListener(), this); //Register your listener and its event handlers
}

カスタムイベントの作成

他のプラグインが聞くことができるイベント(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());
}

基本的なイベント処理

Bukkitは、プラグイン開発者が世界中で発生したサーバーや特定のアクションと対話して変更することを可能にするイベントベースのシステムを使用します。


イベントハンドラの作成

イベントハンドラは、イベントが発生したときに呼び出されるメソッドです。それらは一般的に公開されており、慣例によりon{EventNameStem}名前が付けられon{EventNameStem}ます。ただし、すべてのハンドラは@EventHandlerアノテーションを持つ必要があります。また、そのイベントをONLYパラメータとして含める必要があります。次に、 PlayerJoinEventイベントハンドラの例をPlayerJoinEvent

@EventHandler
public void onPlayerJoin(PlayerJoinEvent event){
    //Run when a player joins
}

注: Bukkitイベントの命名フォーマットは{Source}{Action}({Target})Eventです。これらのイベント名の例は、 PlayerInteractEventまたはBlockBreakEventまたはPlayerJoinEventです。すべてのイベントのリストはSpigot Javadocsにあります


イベントの登録

単にイベントハンドラを作成するだけでは、Bukkitがあなたのメソッドにイベントコールを送信し始めることはできません。また、PluginManagerインタフェースを使用して登録する必要があります。

イベントを登録する最も一般的な方法は、Listenerインターフェイスを実装するクラスを作成し、イベントハンドラをラップすることです。

public class EventListener implements Listener { //Implements the Listener interface

    @EventHandler
    public void onPlayerJoin(PlayerJoinEvent event){
        //Run when a player joins
    }

}

このリスナークラスとそのすべてのイベントは、メインプラグインクラスに次のように登録できます。

@Override
public void onEnable(){
    Bukkit.getPluginManager().registerEvents(new EventListener(), this); //Register your listener and its event handlers
}

イベントの優先順位

Bukkitには、 イベント優先度と呼ばれるシステムがあり、プラグインが正しい古いイベントを処理するのを助けます。 7つの優先事項は(最初に実行されたものから最後に実行されたもの)

  • 最低
  • 低い
  • 標準(デフォルト)
  • 高い
  • 最高
  • モニター

多くのイベント(例えば保護プラグイン)をキャンセルする予定がある場合は、問題を回避するために優先度を低く(または最低)使用することをお勧めします。

MONITORでイベントの結果を決して変更するべきではありません。

@EventHandler //same as @EventHandler(priority = EventPriority.NORMAL)
public void onLogin(PlayerLoginEvent event) {
    // normal login
}

@EventHandler(priority = EventPriority.HIGH)
public void onLogin(PlayerLoginEvent event) {
    // high login
}

詳細情報:



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