見出し画像

Minecraftのサーバープラグインを作る(1) ~全体送信メッセージ編~

適当に書いていきます。一日一実装とかがいいのかもしれない。

環境

Minecraft 1.18.1
Spigot Server
Intellij IDEA Community Edition

今回の実装するコマンド

 全体に文字が送信できるようにしたいと思います。
全体に文字が送信できるようにするにはただ単に、

getServer().broadcastMessage("Hoge");

で、「Hoge」の部分に入力したい文章を入力して、いずれかのコマンド、もしくはイベントの処理に実装すればできます。

※悪用厳禁※
今回は仮に、別のユーザーの名前を騙ってチャットできるコマンドを実装したいと思います。そうすると、

public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
    
}

この基本形の内側に実装していく必要があります。まずはこのコマンドの取る引数を考えたいと思います。
誰かを騙るなら、その誰かを指定しなければならないのと、そのメッセージの内容を指定しなければならないので、引数は二つになるはず。
それと、騙っているということとが分かるように<player…?>としたいですね。

public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
    getServer().broadcastMessage("<"+args[0]+"...?> "+args[1]);
    return true;
}

これだけで基本は完成しました。
コマンドは仮に考えるとして、
「/fakemsg <playername> <msgbody>」
にしたいと思います。

 しかし、このままではいけません。
args[0]とargs[1]が仮に空の時、つまりnullの時はどうするかを考えていません。「/fakemsg」と入力されただけでは、nullエラーが返ってくるか、もしくは「<…?> 」というメッセージだけが送信されます。

なので、<playername>が指定された場合に次へと進む処理にしましょう。

public class fakemsg implements CommandExecutor {
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {

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

            getServer().broadcastMessage("<"+args[0]+"...?> "+args[1]);
            return true;

        } else {

            return false;

        }
    }
}

これで、Playerの名前が指定された場合に送信されるようになりました。さらに、args[1]が空でないときに次の処理に進むようにしましょう。

以下は全文です。

import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;

import static org.bukkit.Bukkit.getServer;

public class fakemsg implements CommandExecutor {
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {

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

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

                getServer().broadcastMessage("<"+args[0]+"...?> "+args[1]);
                return true;

            } else {

                return false;

            }

        } else {

            return false;

        }
    }
}

ifが一つ増えました。ifの中にifがある入れ子構造です。

これで、引数が二つ指定された場合にのみコマンドが実行されるようになりました。でも、引数が足りない時にフィードバックがないと不安になりますよね。なのでエラーメッセージを実装してあげましょう。
それと、しっかり実行できた時にも実行成功のフィードバックを返してあげましょう。

public class fakemsg implements CommandExecutor {
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {

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

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

                String Bcmsg = ("<"+args[0]+"...?> "+args[1]);
                getServer().broadcastMessage(Bcmsg);
                sender.sendMessage("------------------------------\n"+
                        ChatColor.GREEN + "Command succeeded: " + Bcmsg + ChatColor.RESET + "\n"+
                        "------------------------------");
                return true;

            } else {

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

            }

        } else {

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

        }
    }
}

成功したときには、
------------------------------
(緑色で)Command succeeded: <playername> <msgbody>
------------------------------
と返されます。その部分の処理はここです。

String Bcmsg = ("<"+args[0]+"...?> "+args[1]);
getServer().broadcastMessage(Bcmsg);
sender.sendMessage("------------------------------\n"
  ChatColor.GREEN + "Command succeeded: " + Bcmsg + ChatColor.RESET + "\n"+
    "------------------------------");
return true;

エラーは引数不足であることを知らせるエラーにしました。
エラーのときには、
------------------------------
(赤色で)Error: Please enter a enough arguments.
Usage: /fakemsg <PlayerName> <MsgBody>
Description: You can send a fake message using the name of another user.
------------------------------
と返されます。その部分の処理はここです。

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

これでコマンド部分は実装完了です。
残りはMinecraft内で使えるようにしなければなりません。

plugin.ymlに、

commands:
  fakemsg:
    usage: /fakemsg <PlayerName> <MsgBody>
    description: You can send a fake message using the name of another user.

としてあげましょう。これで完成です。

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