はじめに
Bukkit プラグインから Bungeecord で管理しているサーバーに接続したプレイヤーを他のサーバーにテレポートさせる方法について。
準備
他のサーバーにテレポートさせるにはサーバーに BungeeCord plugin チャンネルを登録する必要があるので、onEnable
メソッドに登録するコードを含めておきましょう。
@Override
public void onEnable() {
this.getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
}
これにより、Bukkit プラグインから BungeeCord に文字列を送信する準備が整いました。
送信する文字列の準備
登録したチャンネルに命令を送り込むには、文字列を Byte 配列に変換する必要があります。
Spigot のリファレンスには Google Guava の ByteArrayDataoutput
, DataInputStream
を使うといいよと書いてあるので、それに従うことにします。
The byte array you will send (and receive) will use output generated by the DataInputStream and DataOutputStream classes. For convenience, we will use the ByteArrayDataInput and ByteArrayDataOutput classes from Google Guava, which silences IOException for us.
BungeeCord Plugin Messaging Channel
ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.writeUTF("Connect");
out.writeUTF("サーバー名");
Byte[] data = out.toByteArray();
プレイヤーのテレポート
いよいよプレイヤーをテレポートさせます。
(今回は ytshiyugh というプレイヤーを対象とします。)
Plugin plugin = プラグインのインスタンス;
Player player = Bukkit.getPlayer("ytshiyugh");
player.sendPluginMessage(plugin, "BungeeCord", data);
["Connect", "サーバ―名"]
を BungeeCord チャンネルに書き込みました。
対象とした名前のサーバーが存在する場合はサーバー変更が行われます。
おわりに
ただ単に player.chat("/server main")
のように書いても、上記のような手順を踏まない限り書いた内容が BungeeCord によって拾われることはないので、プロキシ配下の他のサーバーに接続することは出来ません。
参考文献