なうびるどいんぐ

脳みそ常時-3dB

[Bukkit/Spigot]自作プラグインで/titleと同じ事をする

      2018/02/24    HimaJyun

Bukkitプラグイン開発者のみなさまこんにちは。こんにちはこんにちはこんにちは、@HimaJyunです。

今回は、みなさんが開発しているBukkitプラグインでも簡単に/titleコマンドと同じ事が出来るAPIもどきを公開紹介します。

スポンサーリンク

追記: BukkitのAPIが出来た

私の知らない間にBukkit APIのPlayerクラスにsendTitleresetTitleが追加されました。

つまりもうリフレクションなんて邪悪な手法は必要ないという事です。

以下は以前までの方法、もう使わなくて良い。

TitleSender

今回紹介するのは「TitleSender」と名付けられています。
前回紹介したプラグイン(ThisWorld)を作成する際に出来た副産物です。

[Bukkit/Spigot]別世界への移動時に/titleを表示するプラグイン作った

経緯

先程のプラグインを作成するにあたって、Minecraft 1.8から追加された/titleコマンドと同じ動作をBukkit側で行う必要がありました。

しかし、探せど探せどBukkitAPIにはそれらしき機能が見当たりません。
まぁ端折って言うと、それらの機能はBukkitAPIには存在しないようです。

そこで、動く大図書館Googleにお伺いを立てた所、以下の2つがヒットしました。

当初は前者の「TitleAPI」を利用していたのですが、ここで問題に気付く
「あれ、表示時間設定が効いてねぇ……」

色々と試行錯誤を繰り返したのですがダメ、諦めて後者の方を見たのですが
「毎度毎度newしてインスタンスを作成するのって……」

早い話、両者共に設計が僕の考え方と合わなかったのです。
そのため、両者を参考に自分で作成した、と言う訳です。

使い方

少々クソコードなのはご愛嬌……

  1. ソースをコピペ
  2. 変数を宣言->Bukkitが起動してからnew
  3. 使う->ナウい

ソースコード

Gistに貼ってるから勝手にコピペして使え~

準備

見ての通り、Class.forNameを極力減らすために、事前に取得して変数にぶち込んでいます。
(これが実行速度に影響あるかどうかは別として)

しかし、net.minecraft.serverのclassを取得するにはバージョン(v1_8_R3的なの)が必要です。
これはBukkit().getServer()...で取得しています、つまり、コンストラクタが実行される段階でBukkitが起動している必要があります。

ですので、このクラスをnewするのは、Bukkitが確実に起動した後(onEnableがおススメ)にして下さい。

参考までに、こうですね。

package your.program.package;

import org.bukkit.plugin.java.JavaPlugin;

public class sampleClass extends JavaPlugin {

	// TitleSender変数を宣言
	TitleSender TitleSender;

	@Override
	public void onEnable() {
		// onEnableの段階でnewする。
		TitleSender = new TitleSender();
	}
}

もし、他のclassでも使いたければ、毎度毎度newするよりコンストラクタの引数としてインスタンスを渡してあげた方が良いかと……
もしくは、変数をstaticにするとか?

あと、クラスを取得すると言う割と普通では無い手法のやり方なのでバージョンに依存する要素があるかも知れません。
ご了承下さい。

使う

JavaDocを書いてあるのでそう難しくないです、EclipseとかだとTitleSender.の時点で入力補完してくれるはず。
例えば、「TitleSender.sendTitle(Player,"メインタイトル","サブタイトル");」ですね。

まぁ、クソコードですけどご自由に使って下さい。
もし、「ここはこうするべき」みたいな先人の知恵があればコメントとかで教えて頂ければありがたいです。

では、素晴らしきかな……プログラミングの世界。

 - プログラミング ,