Densyakunのブログ

Qiitaもやってます: https://qiita.com/Densyakun

【Spigot】Bukkitプラグインの作り方講座 - Eventシステムの利用

 

Eventシステムとは、「プレイヤーがログインした」、「ブロックが破壊された」、「エンティティがダメージを受けた」などといったイベント発生時に行う処理を記載できます。

 

 

Eventシステムを使う

 

まず、org.bukkit.event.Listenerインターフェースを継承したクラスを作成して下さい。

(メインクラスに継承しても構いません)

 

そしたら、onEnable()内に以下のコードを書いて下さい。

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

第一引数はListener、第二引数はJavaPlugin(メインクラス)です。

これでプラグインにEventシステムが使えるようになりました。

 

 

次に、「Listenerを継承したクラス」にイベントを追加します。

新しく関数を追加します。この時の関数名はなんでも良いです。

新しく追加した関数の引数にはイベントのクラスを書きます。

イベントの一覧はこちら http://www.jias.jp/blog/?85

 

最後に関数に@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());
	}
}

 

 

これでイベントを追加することが出来ました。

 

 

エクスポートして、プラグインをサーバーに入れます。

f:id:Densyakun:20180211191510p:plain

このように表示されていれば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);

これを使ってブロックの素材を砂に設定します。

 

マテリアルの一覧はこちら(バージョンにより異なる可能性があります)

 

 

 

実際にやってみます。

 

 

f:id:Densyakun:20180211191535p:plain

※暗い。

 

 

f:id:Densyakun:20180211191609g:plain

 

 

 

今回はEventシステムの活用について解説しました。

 

記事一覧に戻る

 

f:id:Densyakun:20180211191630p:plain