最初に
看板でプレイヤーからの入力を取得する方法を雑に書きます。
ステップ1
今回はプレイヤーの座標に看板を設置して入力を取得していきます
Location loc = player.getLocation();
Block block = loc.getBlock();
block.setType(Material.OAK_SIGN);
BlockState signState = block.getState();
Sign sign = (Sign) signState;
sign.update();
player.openSign(sign)
おわりです。......
嘘です。少し解説します。
解説
1行目:
プレイヤーの座標(Location型)を取得
2行目:
Location loc = player.getLocation();
で取得した座標のブロックを取得
3行目:
Block block = loc.getBlock();
で取得したブロックをオークの看板に置き換える
4行目:
Block block = loc.getBlock();
で取得したブロックの内部情報を取得
5行目:
BlockState signState = block.getState();
で取得した内部情報をSign型にキャスト(変換)
6行目:
情報のアップデート(多分いらない)
7行目:
プレイヤーに看板の編集画面を表示する。
といった流れになります。
ちなみにこれだけでは看板の編集画面を表示するだけで終わってしまうので
public void onSignCange(SignChangeEvent event){
String signString = event.getLine(0);
などを利用してプレイヤーが看板を編集したイベントが発火されたら看板の情報を取得するように書くと表題のように看板を用いてプレイヤーからの入力を取得することができます。
なお、このように書くと普通に看板を設置して編集した際にも同じ処理が適用されてしまうのでタグ付け/読み取りなどを利用して場合分けできるようにするとよいと思います。
今回はテストとしてプレイヤーの座標を使用しましたが、実装する際はプレイヤーから離れた座標を指定するとよいでしょう。(壊される心配とかがないところ)
また編集を完了する前にプレイヤーが書き込んでいる看板を破壊すると、編集画面は消えませんがSignChangeEventが発火されず入力された情報を取得することができません。
なので、看板の画面を表示する流れの中で設置されている看板を上書きすることがないようにブロックの種類を判定するコードを書いておくなどしましょう。
参考
Spigotフォーラム("create-a-sign-from-a-block")
(https://www.spigotmc.org/threads/create-a-sign-from-a-block.279590/)
てれるん氏運営Discordサーバー、プラグイン塾のみなさん
それでは、よいプラグインライフを~
-坂木唖ルカ-