Minecraftのサーバープラグインを作る(4) ~昔のゲームモードコマンド編~

環境

Minecraft 1.18.1
Spigot Server
Intellij IDEA Community Edition

今回の実装するコマンド

 まず、従来のコマンドと競合しないように違うコマンド名にします。
今回は「/classic_gamemode」とでもしておきましょう。

今回からプログラム全文は載せません。というよりかは載せられません。最適化してしまってメッセージなどを他クラスに実装してしまったので載せても謎のプログラム文があるだけに見えてしまうかも。他クラスも載せるのは骨が折れるので。

Opもちか判定したいときは

if (sender.isOp()){

}

のif文で実装出来ます。

そして、引数が十分かチェックする動作をしましょう。

if (args.length == 1) {

} else if (args.length == 2) {

}

上では、/classic_gamemode sなどの場合、下では/classic_gamemode s EXAMPLEなどの人まで指定されている場合の分岐です。

まず、引数が1個の場合、これはPlayer側からしか使用できないようにしましょう。サーバーのコンソールやコマンドブロックには設定できるゲームモードの項目は存在しないからです。

これを解決するには、

if (sender instanceof Player){

}

を使用することで、senderがPlayerかどうかを判別しています。
この時に引数に指定された項目のゲームモードにしましょう。

ゲームモードを設定するには、

player.setGameMode(SURVIVAL);

でできます。それと、

Player player = (Player) sender;

でキャストしてPlayer型にしてあげましょう。

それで、先ほどの場合はゲームモードをサバイバルにしています。
SURVIVALの部分をCREATIVEやADVENTUREやSPECTATORに書き換えることでできます。

で、引数に応じて変えるには、if文で判断しましょう。

if (args[0].equalsIgnoreCase("0") || args[0].equalsIgnoreCase("s")){

} else if (args[0].equalsIgnoreCase("1") || args[0].equalsIgnoreCase("c")) {

} else if (args[0].equalsIgnoreCase("2") || args[0].equalsIgnoreCase("a")) {

} else if (args[0].equalsIgnoreCase("3") || args[0].equalsIgnoreCase("sp")) {

}

で判断が出来ます。0かsならサバイバル。1かcならクリエイティブ…といった風になっています。

ちなみに、Javaでは||を使うことでorと同じ働きになります。

この内側に、先ほどの

Player player = (Player) sender;
player.setGameMode(SURVIVAL);

これらを実装しましょう。

Player player = (Player) sender;
if (args[0].equalsIgnoreCase("0") || args[0].equalsIgnoreCase("s")){
    player.setGameMode(SURVIVAL);
} else if (args[0].equalsIgnoreCase("1") || args[0].equalsIgnoreCase("c")) {
    player.setGameMode(CREATIVE);
} else if (args[0].equalsIgnoreCase("2") || args[0].equalsIgnoreCase("a")) {
    player.setGameMode(ADVENTURE);
} else if (args[0].equalsIgnoreCase("3") || args[0].equalsIgnoreCase("sp")) {
    player.setGameMode(SPECTATOR);
}

これで処理は完了しました。ですが、これだと変更されたことの通知がされないので、

sender.sendMessage();

で内側にお好きなメッセージ文を書いて通知をするようにしましょう。

Player player = (Player) sender;
if (args[0].equalsIgnoreCase("0") || args[0].equalsIgnoreCase("s")){
    player.setGameMode(SURVIVAL);
    sender.sendMessage("EXAMPLE Message");
} else if (args[0].equalsIgnoreCase("1") || args[0].equalsIgnoreCase("c")) {
    player.setGameMode(CREATIVE);
    sender.sendMessage("EXAMPLE Message");
} else if (args[0].equalsIgnoreCase("2") || args[0].equalsIgnoreCase("a")) {
    player.setGameMode(ADVENTURE);
    sender.sendMessage("EXAMPLE Message");
} else if (args[0].equalsIgnoreCase("3") || args[0].equalsIgnoreCase("sp")) {
    player.setGameMode(SPECTATOR);
    sender.sendMessage("EXAMPLE Message");
}

これで引数が1個でsenderがPlayer型のときの処理が完了しました。
引数が一個でsenderがPlayer型じゃないときの通知もelseのあとに作ってあげましょう。


引数が2個の時の処理の書き方はまた次回。

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