純規の暇人趣味ブログ

首を突っ込んで足を洗う

[Bukkitプラグイン制作講座-其之十二]MOBスポナーから湧いた敵か判定する

      HimaJyun

前回の記事ではメタデータを取り扱いました。

これを利用するとMOBスポナーから湧いた敵を簡単に判定出来るので、紹介しておきましょう。(小ネタかも知れませんがね)

前回の記事は「[Bukkitプラグイン制作講座-其之十一]メタデータを扱う」です。

君、どこ出身?

MOBがスポナーから湧いたかどうかを判定したい、なんて状況はきっといずれ訪れる事でしょう。

しかし、BukkitにはどうやらそのMOBがスポナーから湧いたかどうかを判定出来る機能はないみたいです。

だったらそれを自分でやっちまえば良い、それがプログラミングです。

実家はスポナー?

スポナーからMOBが発生すると「SpawnerSpawnEvent」が発生します。

もう答えが見えていますね。

「SpawnerSpawnEvent」が発生した際に「こいつの実家はスポナーだぜ!!」と言う目印を付けてしまえば良いのです。

でもって、判定が必要な時にその目印があるかどうかを見る!!それだけ。

目印

メタデータの出番です。

目印はメタデータを利用する事で管理をBukkitに丸投げしてしまいましょう。

サーバが終了すると目印が消えますが、その程度は無視して構わないでしょう。

ダチョウアルゴリズムって奴ね。

実際にやってみる

簡単すぎますね、簡単、楽勝ともいう。

メタデータのキーはメタデータ使い方の記事に倣って定数化しておきます。

private final static String KEY = UUID.randomUUID().toString();
// こっちの方がコンパイル時に展開されるので少し早いかもしれない(変数のUUIDは適当にツールで作った)
//private final static String KEY = "50BC7B80-995A-498C-A589-2C79C8CCF80F";

今回はキーの他プラグインとの衝突チェックはしませんので、UUIDを利用する事でそれを回避しようと思います。

目印を付ける

SpawnerSpawnEventでメタデータを付けるだけです。

entity.setMetadata(
		KEY, // キー
		new FixedMetadataValue(
				this, // Plugin型
				true // 何でも良い
		)
);

上の例ではメタデータの値にはtrueを指定していますが、これは実際には使わないので何でも良いです。

ただ、booleanなら1bitで済むから早くなるかな?、と思ってtrueにしているだけですので。(未確認、Bukkitの実装によってはそうじゃないかも)

目印を確認する

メタデータがあるかどうか、すなわち「hasMetadata」で確認するだけです。

/**
 * 指定したエンティティがスポナーから沸いたエンティティか確認する
 * @param entity 確認するエンティティ
 * @return スポナーから沸いたのであればtrue、そうでなければfalse
 */
public boolean isSpawnerSpawn(Entity entity) {
	return entity.hasMetadata(KEY);
}

超簡単、値なんて使わないぜ!!

KEYが他のプラグインと同じだと衝突しますが、UUIDとかを使ってKEYの衝突をなくせば良し

ダチョウアルゴリズム万歳!!

サンプル

サンプルとして、エンティティ(と言うよりMOB)を殺害した際に

スポナーから沸いたMOBであれば「このMOBはスポナーから沸いたMOBです。」

そうでなければ「このMOBはスポナーから沸いたMOBではありません。」

と表示する例です。

// 動作確認用
@EventHandler(ignoreCancelled = true)
public void kill(EntityDeathEvent e) {
	// 殺されたエンティティ
	LivingEntity entity = e.getEntity();
	// エンティティを殺したプレイヤー
	Player player = entity.getKiller();

	// null=プレイヤーが殺したのではないなら
	if (player == null) {
		return; // 何もしない
	}

	// 出力する
	player.sendMessage("このMOBはスポナーから沸いたMOB" +
			(isSpawnerSpawn(entity) ? "です。" : "ではありません。")); // <-三項演算子、説明は要らないよね?
}

うむ、とっても簡単、簡単すぎて記事のボリュームが足りないくらい。

実際のソースコードがGitHubにありますので、参考にしてみて下さい。

 - プログラミング , ,