コンソールコマンドの実行

コンソールコマンド

コマンドを入力するのは、プレイヤーだけでなくサーバー側が全体に対してなにか行いたいという場合がある。

「例えば、サーバー側(コンソール側)でコマンドを入力したら、

全プレイヤーのレベルが変わる

全員がある地点へワープする

など・・」

コード入力

      if (args.length == 1){
        player.setLevel(Integer.parseInt(args[0]));
      }else {
        player.sendMessage("Nooooooooo!!");
      }

のあとに

      }else {
        player.sendMessage("Nooooooooo!!");
      }else {
        
      }

を追加すると、playerではなかったらということになる。

(ここでは、senderをserverに変更したらできそうなものだがそれでは動かない。)

しかし、このような書き方は、しないほうがよい!
プレイヤーが実行して動作するコマンドとコンソール画面で動かして初めて動作するコマンドは分けておいた方が良い。

よって、コンソール用のコマンドを作りたいのであれば、新たなクラスを作る。
(全く同じコマンドなのにできることが違うとコマンドが多くなると管理できなくなってしまうし、メンタナンスで間違いが起きやすくなる。)
一つのコマンドには、一つの機能とする!!

新しいクラスを作って実装

package plugin.sample2;

public class AllSetLevelCommand {

}

まずはこれ

package plugin.sample2;

import org.bukkit.command.CommandExecutor;

public class AllSetLevelCommand implements CommandExecutor {

}

そして、エラー波線にカーソルをあてて、メソッドの実行 → OK

package plugin.sample2;

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

public class AllSetLevelCommand implements CommandExecutor {

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

return false; = 実行が終わったら何もしない。

そして

  public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
    if (sender instanceof Player player){
      player.sendMessage("実行できません");
    }
    return false;
  }

としておいて

  public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
    if (sender instanceof Player player){
      player.sendMessage("実行できません");
    }else {
      
    }
    return false;
  }

ここでのelseのあとからやりたいことをすることになる。

else {
      for (Player Player : sender.getServer().getOnlinePlayers()) {
        Player.setLevel(args[0]);
      }

を入力し、ここでも以前のようにエラーが出て波線にカーソルをあてて〇〇をラップする。

else {
      for (Player Player : sender.getServer().getOnlinePlayers()) {
        Player.setLevel(Integer.parseInt(args[0]));
      }

そして

else {
      for (Player Player : sender.getServer().getOnlinePlayers()) {
        Player.setLevel(Integer.parseInt(args[0]));
        System.out.println("プレイヤのすべてが" + args[0] + "二設定されました!");
      }

を入力
“プレイヤのすべてが” + args[0] + “二設定されました!”という形でつなげた入力もできる。
また、
System.out.println としてるのは、(Playerではなく、System)コンソール画面に出力するようにするため。

そして、ここでMainファイルに戻り
新しいクラスを作ったので

  public void onEnable() {
    Bukkit.getPluginManager().registerEvents(this, this);
    getCommand("setLevel").setExecutor(new SetLevelCommand());
  }

ここに

  @Override
  public void onEnable() {
    Bukkit.getPluginManager().registerEvents(this, this);
    getCommand("setLevel").setExecutor(new SetLevelCommand());
    getCommand("allSetLevelCommand").setExecutor(new AllSetLevelCommand());
  }

を挿入し、plugin.yml

commands:
  setLevel:
    allSetLevel:

を挿入。

ここで実行しようとすると、実行できない!!
コマンドでも実行しても、名前が見つからない!
とでてしまう。

原因

各コードを穴が空くようにずっと見ていると

  @Override
  public void onEnable() {
    Bukkit.getPluginManager().registerEvents(this, this);
    getCommand("setLevel").setExecutor(new SetLevelCommand());
    getCommand("allSetLevelCommand").setExecutor(new AllSetLevelCommand());
  }

の(“allSetLevelCommand”)の部分が違う!!(T_T)

正しくは、

  public void onEnable() {
    Bukkit.getPluginManager().registerEvents(this, this);
    getCommand("setLevel").setExecutor(new SetLevelCommand());
    getCommand("allSetLevel").setExecutor(new AllSetLevelCommand());
  }

となるので、書き換えて実行!!

成功!!\(^o^)/
諦めず、入力ミスを見つけることができたのでちょっと自信になりました!!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次