どうも。へっぽこプラグイン作成者のよゆうです。
前回の記事を見てない方はそちらを先に御覧ください
Spigotで自動で記入済みの看板を設置するPluginを作る【CheckPoint編I/Minecraft】
今回はチェックポイント編PartIIということで看板をクリックした際にプレイヤーごとに座標を保存するプラグインを組む。どうぞよしなに。
実際に書いてみる
前提知識はIで説明したので割愛!割愛!
1.新しいクラス「ClickSign」の作成
というわけで早速新しいクラス「ClickSign」(名前はなんでもいい)を作成。Listenerを継承しておく。
public class ClickSign implements Listener {
}
2.イベントの設定
今回呼び出すイベントはプレイヤーが看板を殴ったときのイベントなので「PlayerInteractEvent」を選択。Interactは相互作用とかそんな感じ。Spigotプラグインでは専ら殴った時に使われる。
@EventHandler
public void SetSpawn(PlayerInteractEvent e){
}
3.内容の設定
最初にコードをお出ししていくスタイル。
public void SetSpawn(PlayerInteractEvent e}{
Player player = e.getPlayer();//プレイヤー名を変数playerに代入
World world = player.getWorld();//プレイヤーのいるワールドを変数worldに代入
Action action = e.getAction();//プレイヤーが行った動作を変数actionに代入
if(e.getClickedBlock().getState() instanceof Sign){
//クリックしたブロックを取得・状態を取得・それが看板ならば
Sign signboard = (Sign)e.getClickedBlock().getState();
//Sign型(看板型)の変数signboardに看板の情報を代入
//本来は型が違うが(Sign)とつけて看板型に変更している
String signString = signboard.getLine(1);
//看板の2行目を取得(0から数える)
if(signString.equals(ChatColor.BOLD + "Check Point")){
//看板の2行目が太字のチェックポイントという文字なら
if(player.isOnGround()) {//プレイヤーが地に足をつけてるなら
Location loc = player.getLocation();//プレイヤーの座標を取得
SaveCheckPoint(player,loc,world);//セーブする関数(後述)
player.sendMessage(ChatColor.BOLD + "チェックポイントを設定しました!");
Sound.ENTITY_PARROT_IMITATE_SLIME,2,2);//音を鳴らす
}
else if(!(player.isOnGround())){//プレイヤーが地に足をつけてないなら
player.sendMessage("空中ではチェックポイントを設置できません");
}
}
}
}
}
という感じになる。基本的にやってることは同じだが一つ悩むところがあるだろう。
SaveCheckPoint(player,loc,world);//セーブする関数(後述)
これは別の場所で書いたプログラムを呼び出しているということだ。
会社が外に受注しているようなイメージでOK。player,loc,worldは発注の情報である。
なんでこんなことをしているのかというと説明しやすくするためである。
ちなみに座標の変数であるlocに保存したままにしない理由は今のままだと全プレイヤーが同じlocに座標を登録しているためプレイヤーごとにチェックポイントを分けられないからである。
4.HashMapの設定
先程の関数を説明する前にHashMapというものについて説明しておく。まあこれに関してはググってもらったほうがわかりやすいとは思うが簡単に言えばKeyと値を保存しておくことができる関数だ。
早い話が合言葉。例えば「海」と入力すると「山」みたいなことを保存しておける。
これを今回は「player名」を入力した場合にそれぞれの座標を出力したいわけだ。
というわけで新しいクラス「HashMaps」を作成しコードを次のように書く
public class HashMaps extends JavaPlugin implements Listener {
public static HashMap<String, Location> map = new HashMap<>();
}
大事なとこだけ言えばこのmapという名前のHashMapは<String型(文字)を入力すると登録したLocation型(座標)を返しますよ>という登録である。それさえ覚えておけばOK。
5.SaveCheckPoint関数の作成
さっき言ってた関数を作っていく。といってもそこまで難しくない。以下で終わりである。
public void SaveCheckPoint(Player player,Location location , World world){
String NameWorld = player.getName() + world.getName();
//player名とworld名を取得して合わせている。
//worldをいくつも使う場合チェックポイントをそれぞれ分けるため
HashMaps.map.put(NameWorld,location);
//HashMapsファイルにある.map.にkey(NameWorld)と値(location)を代入している
//これで今後map.get(NameWorld)と打てばlocationが出力できるようになる。
}
これをClickSign.javaの@EventHandlerの上にでも書けば良い。ちなみに別クラスに書く場合は関数呼び出しの際に「別のクラス名.関数名(引数);」と書いて呼び出す必要がある。怠い。
6.クラスを有効化する
Iでやったのと変わらんのでコードだけ(クラス名は変えること)
public final class CHECKPOINT extends JavaPlugin {
@Override
public void onEnable() { //サーバーが起動した時
// Plugin startup logic
Server server = this.getServer();
PluginManager pluginManager = server.getPluginManager();
pluginManager.registerEvents(new New(), this);
//Newというクラスを登録する(Newの部分をクラス名に変える)
次のパート
とりあえず保存することには成功したので次はチェックポイントにテレポートしていこう。
前→Spigotで自動で記入済みの看板を設置するPluginを作る【CheckPoint編I/Minecraft】
次→Spigotでアイテムをクリックしたら保存した座標にテレポートするPluginを作る【CheckPointIII/Minecraft】