Spigotでアイテムをクリックしたら保存した座標にテレポートするPluginを作る【CheckPointIII/Minecraft】

スポンサーリンク
記事一覧

どうも。へっぽこプラグイン作成者のよゆうです。
前回の記事を見てない方はそちらを先に御覧ください

Spigotで看板をクリックした時に自分の座標を保存するPluginを作る【CheckPoint編II/Minecraft】

初回の記事からはこちら

Spigotで自動で記入済みの看板を設置するPluginを作る【CheckPoint編I/Minecraft】

というわけでチェックポイント編第三回。今回はアイテムをクリックすると保存したチェックポイントにテレポートする機能を追加していこうと思う。どうぞよしなに。

実際に書いてみる

1.新しいクラス「ClickSpawn」の作成

というわけで早速新しいクラス「ClickSpawn」(名前はなんでもいい)を作成。Listenerを継承しておく。(こいついっつもおんなじこと言ってんな)

public class ClickSpawn implements Listener {
}

2.イベントの設定

今回はアイテムをクリックした時のイベント。と言っても前に使ったPlayerInteractEventを再利用して組んでいく。

public class ClickSpawn implements Listener {
    @EventHandler
    public void SetSpawn(PlayerInteractEvent e){
    }
}

3.必要な変数を取得

今まで通りイベント関数の中に書いていく。プレイヤー型でイベントを起こしたプレイヤーを取得。ワールド型でプレイヤーがいるワールドを取得。アクション型でイベントで発生したアクションを取得する。

Player player = e.getPlayer();
World world = player.getWorld();
Action action = e.getAction();

4.持っているアイテムが~~ならというif文

1個目のif文は(アクションが空気を右クリック||アクションがブロックを右クリック)という構造になっている。||はor、又は、を意味するコードなので空気かブロックを右クリックした場合。つまり右クリックした場合を検知するものとなっている。

2個目のif文はプレイヤーの持っているアイテムを取得してその種類を取得。それがMaterial(素材)クラスのスライムボールであるなら~~する。という文である。SLIME_BALLのところを好きなアイテムに変えれば様々なアイテムをテレポートのトリガーにすることができる。

if (action.equals(Action.RIGHT_CLICK_AIR) ||action.equals(Action.RIGHT_CLICK_BLOCK)) {
            if (player.getItemInHand().getType() == Material.SLIME_BALL) {
            //ここに 5.の中身を書いていく
            }
}

ここでは書いてないが以下のようにすることでアイテム名で識別することもできる。

if(player.getItemInHand().getItemMeta().getDisplayName()equals("アイテム名")){
}

5.チェックポイントデータを呼び出してテレポートする

最初にString型(文字型)を宣言してプレイヤーの名前とワールドの名前を繋げている。(例:you0101 + world = you0101world)。これがチェックポイントデータを呼び出すKeyとなるのでおぼえてない方はSpigotで看板をクリックした時に自分の座標を保存するPluginを作る【CheckPoint編II/Minecraft】を読んで思い出して欲しい。

その後Location型変数であるlocにHashMapを使いさっきのKeyを入れることで保存した値を引き出している。前にmap.put(player+world , loc)で代入したやつだ。get関数で1つ目を入れることで値であるloc(プレイヤーがチェックポイントとして保存した座標)が手に入るわけだ。

if文はif(!(loc == null))としてlocになにか値が入っているならば~~。という文になっている。(loc == null)はlocに値が入っていないことを意味し、!()をつけることでそれ以外という意味にしている。

}else{はさっきif文で限定したそれ以外。つまり値が入っていない場合だ。ここではメッセージを返すようにした。

    String NameWorld = player.getName() + world.getName();
    Location loc = HashMaps.map.get(NameWorld);
    if(!(loc == null)){
        player.teleport(loc);
    }else{
        player.sendMessage(ChatColor.BOLD + "" + ChatColor.BLUE + "チェックポイントが見つかりませんでした");
    }

6.Mainクラスで有効化する

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の部分をクラス名に変える)

全文

package com.yoyude.checkpoint;

import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;

import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;

public class ClickSpawn implements Listener {
    @EventHandler
    public void SetSpawn(PlayerInteractEvent e){
        Player player = e.getPlayer();
        World world = player.getWorld();
        Action action = e.getAction();

        if (action.equals(Action.RIGHT_CLICK_AIR) || action.equals(Action.RIGHT_CLICK_BLOCK)) {
            if (player.getItemInHand().getType() == Material.SLIME_BALL) {

                String NameWorld = player.getName() + world.getName();

                Location loc = HashMaps.map.get(NameWorld);
                if(!(loc == null)){
                    player.teleport(loc);
                }else{
                    player.sendMessage(ChatColor.BOLD + "" + ChatColor.BLUE + "チェックポイントが見つかりませんでした");
                }

            }
        }
    }
}

次のパート

これでスライムボールをクリックすれば登録したチェックポイントに飛べるようになった。でもまだ物足りない。何故だろう。そう、ワールドに入った時にスライムボールを入手する手段がないのだ。というわけで次はワールド内に入ったらアイテムを配る機能を追加していこう

前→Spigotで看板をクリックした時に自分の座標を保存するPluginを作る【CheckPoint編II/Minecraft】

次→執筆中

タイトルとURLをコピーしました