【Spigot】Bukkitプラグインの作り方講座 - Eventシステムの利用
Eventシステムとは、「プレイヤーがログインした」、「ブロックが破壊された」、「エンティティがダメージを受けた」などといったイベント発生時に行う処理を記載できます。
Eventシステムを使う
まず、org.bukkit.event.Listener
インターフェースを継承したクラスを作成して下さい。
(メインクラスに継承しても構いません)
そしたら、onEnable()
内に以下のコードを書いて下さい。
getServer().getPluginManager().registerEvents(this, this);
第一引数はListener、第二引数はJavaPlugin(メインクラス)です。
これでプラグインにEventシステムが使えるようになりました。
次に、「Listenerを継承したクラス」にイベントを追加します。
新しく関数を追加します。この時の関数名はなんでも良いです。
新しく追加した関数の引数にはイベントのクラスを書きます。
最後に関数に@EventHandler
アノテーションを追加して下さい。
今回はPlayerJoinEvent
を使用してプレイヤーのログインメッセージを変更します。
@EventHandler
public void onPlayerJoin(PlayerJoinEvent e) {
e.setJoinMessage("プレイヤーがログインしました: " + e.getPlayer().getName());
}
PlayerJoinEvent.setJoinMessage(String)でログインメッセージを変更しています。
e.getPlayer()でプレイヤーを取得し、getName()でプレイヤー名を取得しています。
getName()はプレイヤーの本来の名前です。プレイヤーの表示名はgetDisplayName()で取得できます。
プレイヤーの表示名を設定するにはsetDisplayName(String)を使用します。
メインクラスに書いた場合の例:
package io.github.densyakun.bukkit.test;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;
public class Main extends JavaPlugin implements Listener {
@Override
public void onEnable() {
getServer().getPluginManager().registerEvents(this, this);
System.out.println("プラグインが有効になりました");
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (label.equalsIgnoreCase("test")) {
sender.sendMessage("コマンドが実行されました");
}
return true;
}
@Override
public void onDisable() {
System.out.println("プラグインが無効になりました");
}
@EventHandler
public void onPlayerJoin(PlayerJoinEvent e) {
e.setJoinMessage("プレイヤーがログインしました: " + e.getPlayer().getName());
}
}
これでイベントを追加することが出来ました。
エクスポートして、プラグインをサーバーに入れます。
このように表示されていればOKです。
Eventシステムの活用
最後に、Eventシステムを活用します。
このようなイベントを追加して下さい。
@EventHandler
public void onPlayerJoin(BlockBreakEvent e) {
Block b = e.getBlock();
if (b.getType() == Material.GRASS) {
e.setCancelled(true);
b.setType(Material.SAND);
}
}
BlockBreakEvent
はプレイヤーがブロックを破壊した時に実行されるイベントです。
これを使って草ブロックを破壊すると砂に変わります。
ブロックに関係するイベントはBlockEvent
を継承しています。
BlockEvent.getBlock()
でブロックを取得できます。
Block.getType()
はブロックの素材をMaterial
型で返します。
if (b.getType() == Material.GRASS)
Material.GRASS
と判定して草ブロックであるかどうかを判別しています。
e.setCancelled(true);
イベントをキャンセルすることで砂に変える時にブロックを破壊されないようになります。
b.setType(material);
これを使ってブロックの素材を砂に設定します。
マテリアルの一覧はこちら(バージョンにより異なる可能性があります)
実際にやってみます。
※暗い。
今回はEventシステムの活用について解説しました。