マインクラフトver1.21.10のPaperプラグインを作る方法を解説します。

第5回はPaperプラグインにおけるイベント処理について説明します。
イベント処理とは
プラグインサーバーでは、特定の出来事が起こった時に、独自の処理を行うように設定することができます。
プラグインサーバーにおけるイベント処理がどういうものか整理しましょう。
サーバーはイベントオブジェクトを作成する
例として、「エンティティがアイテムを拾う」というイベントについて取り上げて説明していきます。
エンティティがアイテムを拾った直後、サーバー内ではEntityPickupItemEventクラスオブジェクトが作成されます。
これは、「エンティティがアイテムを拾う」というイベントに対応するイベントオブジェクトです。そこには以下のような情報が格納されています。
- アイテムを拾ったエンティティに対応するLivingEntityクラスオブジェクト
- 拾われたアイテムに対応するItemクラスオブジェクト
- 拾われた結果、地面に残っているアイテムの個数
また、このオブジェクトのsetCancelled関数を用いて、このイベントをキャンセルすることでエンティティがアイテムを拾わないようにすることもできます。
プラグインはイベントリスナを使ってイベントオブジェクトに干渉する
私たちはプラグインを使って、このイベントオブジェクトを受け取り、様々な処理を施すことにより、サーバーに新たな動作を組み込むことができます。
まず、プラグイン側でEntityPickupItemEventインスタンスを引数として受け取る関数を用意します。この関数を一般にイベントリスナ(もしくはイベントハンドラ)と呼びます。
そして、APIを介してサーバーに作成したイベントリスナを登録します。サーバー側はこのイベントリスナを預かり、イベントが発生した時に実行してくれます。
具体例1: サーバー入場メッセージ
具体例として、サーバーに入った時に「ようこそ!」とプレイヤーにメッセージを送信してみます。
★ToDo com.example.papertutorialパッケージ下に、listenerパッケージを作成
★ToDo com.example.papertutorial.listenerパッケージ下に、PlayerEventListenerクラスを作成
★ToDo PlayerEventListenerクラスを以下のように編集
package com.example.papertutorial.listener;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
public class PlayerEventListener implements Listener {
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event){
var player = event.getPlayer();
player.sendMessage("ようこそ!");
}
}
★ToDo PaperTutorialクラスのonEnable関数に以下のコードを追加
getServer().getPluginManager().registerEvents(new PlayerEventListener(), this);
★ToDo Gradleプロジェクトのjarタスクを実行
★ToDo jarタスクで生成された build/libs/PaperTutorial-1.0-SNAPSHOT.jar を、サーバーの plugins フォルダに配置する
★ToDo サーバーを起動
★確認 サーバーに入った時に、「ようこそ!」とチャット欄に表示されることを確認
★ToDo サーバーを停止

具体例2: アイテムドロップ2倍
★ToDo PlayerEventListenerクラスに以下のonPlayerDropItem関数を追加
@EventHandler
public void onPlayerDropItem(PlayerDropItemEvent event){
var player = event.getPlayer();
var item = event.getItemDrop();
player.getWorld().dropItemNaturally(player.getLocation(), item.getItemStack());
}
★ToDo Gradleプロジェクトのjarタスクを実行
★ToDo jarタスクで生成された build/libs/PaperTutorial-1.0-SNAPSHOT.jar を、サーバーの plugins フォルダに配置する
★ToDo サーバーを起動
★確認 ドロップしたアイテムが2倍の量になって落ちることを確認
★ToDo サーバーを停止

イベント処理をするには、
- Listenerインターフェースを実装するクラスを作成する
- EventHandlerアノテーションを付けた関数を作成する(名前は何でも良い)
- 受け取りたいEventクラスのサブクラスのオブジェクトを引数とする
- PluginManagerを取得し、登録する
まとめ
今回は、Paperプラグインでイベント処理を行う方法を学習しました。
次回は、タスク処理について説明します。

コメント