見出し画像

Minecraftのサーバープラグインを作る(3) ~サバイバルでも飛べるように編~

環境

Minecraft 1.18.1
Spigot Server
Intellij IDEA Community Edition

今回の実装するコマンド

 今回はサバイバルでも飛べるようにするコマンドを実装します。

Player pl = Bukkit.getPlayer(args[0]);
pl.setAllowFlight(true);

ベースはこれになります。ただ、Op持ちしかできないようにするだとか、Player型に変換するなどが必要なので大変なことになります。

以下は私の書いたプログラム文です。

public class fly implements CommandExecutor {

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (sender.isOp()) {

            if (args[0] == null || args[0].isEmpty()) {

                sender.sendMessage("------------------------------\n" +
                        ChatColor.RED + "Error: Please enter a enough arguments." + ChatColor.RESET + "\n" +
                        "Usage: /fly <Player> <true|false|toggle|getboolean>\n" +
                        "Description: You can set/get the player flightable.\n" +
                        "------------------------------");
                return true;

            } else {

            Player pl = Bukkit.getPlayer(args[0]);
            if (pl != null) {

                if (args[1] != null && !(args[1].isEmpty())) {

                    if (args[1].equalsIgnoreCase("true")) {

                        pl.setAllowFlight(true);
                        if (sender.getName() == pl.getName()) {

                            pl.sendMessage("------------------------------\n" +
                                    ChatColor.GREEN + "Command succeeded: The flight has been enabled." + ChatColor.RESET + "\n" +
                                    "------------------------------");
                            return true;

                        } else {

                            sender.sendMessage("------------------------------\n" +
                                    ChatColor.GREEN + "Command succeeded: " + pl.getName() + "\'s flight has been enabled." + ChatColor.RESET + "\n" +
                                    "------------------------------");
                            pl.sendMessage("------------------------------\n" +
                                    ChatColor.GREEN + "Command succeeded: The flight has been enabled by " + sender.getName() + "." + ChatColor.RESET + "\n" +
                                    "------------------------------");
                            return true;

                        }

                    } else if (args[1].equalsIgnoreCase("false")) {

                        pl.setAllowFlight(false);
                        if (sender.getName() == pl.getName()) {

                            pl.sendMessage("------------------------------\n" +
                                    ChatColor.GREEN + "Command succeeded: The flight has been disabled." + ChatColor.RESET + "\n" +
                                    "------------------------------");
                            return true;

                        } else {

                            sender.sendMessage("------------------------------\n" +
                                    ChatColor.GREEN + "Command succeeded: " + pl.getName() + "\'s flight has been disabled." + ChatColor.RESET + "\n" +
                                    "------------------------------");
                            pl.sendMessage("------------------------------\n" +
                                    ChatColor.GREEN + "Command succeeded: The flight has been disabled by " + sender.getName() + "." + ChatColor.RESET + "\n" +
                                    "------------------------------");
                            return true;

                        }

                    } else if (args[1].equalsIgnoreCase("toggle")) {

                        pl.setAllowFlight(!(pl.getAllowFlight()));
                        if (sender.getName() == pl.getName()) {

                            pl.sendMessage("------------------------------\n" +
                                    ChatColor.GREEN + "Command succeeded: The flight has been toggled. Now: " + pl.getAllowFlight() + "." + ChatColor.RESET + "\n" +
                                    "------------------------------");
                            return true;

                        } else {

                            sender.sendMessage("------------------------------\n" +
                                    ChatColor.GREEN + "Command succeeded: " + pl.getName() + "\'s flight has been toggled. Now: " + pl.getAllowFlight() + "." + ChatColor.RESET + "\n" +
                                    "------------------------------");
                            pl.sendMessage("------------------------------\n" +
                                    ChatColor.GREEN + "Command succeeded: The flight has been toggled by " + sender.getName() + ". Now: " + pl.getAllowFlight() + "." + ChatColor.RESET + "\n" +
                                    "------------------------------");
                            return true;

                        }

                    } else if (args[1].equalsIgnoreCase("getboolean")) {

                        if (pl.getAllowFlight()) {

                            sender.sendMessage("------------------------------\n" +
                                    ChatColor.GREEN + "Command succeeded: The " + pl.getName() + "\'s flight is available." + ChatColor.RESET + "\n" +
                                    "------------------------------");

                        } else if (!(pl.getAllowFlight())) {

                            sender.sendMessage("------------------------------\n" +
                                    ChatColor.GREEN + "Command succeeded: The " + pl.getName() + "\'s flight is unavailable." + ChatColor.RESET + "\n" +
                                    "------------------------------");

                        }

                    } else {

                        sender.sendMessage("------------------------------\n" +
                                ChatColor.RED + "Error: Please enter a correct arguments." + ChatColor.RESET + "\n" +
                                "Usage: /fly <Player> <true|false|toggle|getboolean>\n" +
                                "Description: You can set/get the player flightable." +
                                "------------------------------");
                        return true;

                    }

                } else {

                    sender.sendMessage("------------------------------\n" +
                            ChatColor.RED + "Error: Please enter a enough arguments." + ChatColor.RESET + "\n" +
                            "Usage: /fly <Player> <true|false|toggle|getboolean>\n" +
                            "Description: You can send a fake message using the name of another user.\n" +
                            "------------------------------");
                    return true;

                }

            } else {

                sender.sendMessage("------------------------------\n" +
                        ChatColor.RED + "Error: No such player exists." + ChatColor.RESET + "\n" +
                        "usage: /fly <PlayerName> <true|false|getboolean>\n" +
                        "description: You can set/get the player flightable.\n" +
                        "------------------------------");
                return true;

            }
        }

        } else {

            sender.sendMessage("------------------------------\n"+
                    ChatColor.RED +"Error: Operator permission is required." + ChatColor.RESET + "\n"+
                    "------------------------------");
            return true;

        }

        return true;
    }

}

これだけ見せられても、分かる人にはわかるかもしれませんが、分からない人向けに解説をしていきましょう。

if (sender.isOp()) {

に当たるプログラム文は、実行者がOp持ちか確かめています。そうじゃなければ、Op権限が必要だよのメッセージを送るようにしています。
(else部分)

if (args[0] == null || args[0].isEmpty()) {

に当たる部分は、args[0]がnullまたは空の場合に、引数が足りないというメッセージを流しています。これに当てはまらなければ、以降のelse文に処理を流しています。

Player pl = Bukkit.getPlayer(args[0]);
            if (pl != null) {

この部分では、Bukkitの機能を使って指定されたプレイヤーを取得しています。ただ、そのプレイヤーがいるときに処理を流すようにしていて、プレイヤーが見つからない場合には、「存在しないよ~」というメッセージを流しています。

if (args[1] != null && !(args[1].isEmpty())) {

この部分では、args[1]の中身があることを確認しています。ある場合は次へ、ない場合はelseで引数が足りないというお知らせを流しています。

if (args[1].equalsIgnoreCase("true")) {
} else if (args[1].equalsIgnoreCase("false")) {
} else if (args[1].equalsIgnoreCase("toggle")) {
} else if (args[1].equalsIgnoreCase("getboolean")) {
} else {

これらの部分では、引数を認識して、trueならばオンにする、falseならオフにする、toggleならオンオフ反転、getbooleanなら現在の状態を取得。という風にしています。もし、どれにも当てはまらなければ正しい引数が指定されていないということをお知らせしています。

例にもれず、前回と同じような成功・エラーのフィードバックをしています。


全部の解説は少々時間がかかるうえ、骨が折れるので、これぐらいにしておきます。「この部分はどういう意味ですか?」等あれば質問してください。基本的には難しい構文は使用していないので少しかじっていれば読めるはず…。


まぁ、困ったら上のプログラム文を流用していただいても結構ですが、それを自作したといってそのまま公開する等はお控えいただけると助かります。

もちろん、結局はプログラムなので似たような構成になってしまうかもしれませんので、それに関しては一切問題ないと思っています。結局のところ、皆さんの良心に依存しているようなものなので…。

ではでは、よいMinecraft-Spigot-Plugin作成ライフを~ 


良ければサポートよろしくお願いいたします。いただいたサポートは活動費として使用させていただきます。