【改】Bukkit・Spigotプラグインを作る方法<基本コマンド編>
どもども、こんにちは。てれるんです。
今回は「【改】Bukkit・Spigotプラグインを作る方法」の第二回目、基本コマンド編となります。よろしくね。
このシリーズはここから見れます。よかったら見てね。
Bukkitにコマンドを登録しよう
先ずはBukkitやSpigotにこういうコマンドを追加するよ~っていうのを教えてあげる為に「plugin.yml」にコマンド登録の記述をしましょ。
commands:
test:
aliases: [ t, testest ]
description: Command description
permission: testplugin.command.test
permission-message: Permission denied
usage: Command usage
全部のオプションを付けるとこんな感じになります。全部つけなくてもいいのよ。
上から順番にどんな項目か説明していきますよん
commands
一番上に来る「commands」の下には追加するコマンドの名前を書きます。今回だと「/test」というコマンドを追加するので「test」と記述しています。コマンド名の下にはこのようなオプションがあります。
aliases
コマンドのエイリアスを設定できます。エイリアスっていうのは、「/tell」と「/msg」、「/plugins」と「/pl」、「/reload」と「/rl」といった本来のコマンドと同じ動作をするが親コマンドは違うという設定ができるやつです。
description
コマンドの説明を設定できます。「/help」を実行したときに表示されるやつです。
permission
パーミッションを設定できます。パーミッションを指定すると、コマンド候補からも消え、もし実行された場合は下記の「permission-message」の内容が表示されます。パーミッションの追加方法は次回書きます。
(正直、使わん。プログラム内に記述することが大半。)
permission-message
パーミッションが無かった場合に表示するメッセージを設定できます。前述の「permission」の通りです。設定しないとこいつが出てきます。
usage
コマンドが失敗した時に出てくるメッセージを設定できます。...というか後で処理書くのでその時にちょっと触れます。
てな感じでコマンドをBukkitに登録できます。
実際のところ、私は「description」しか書いてないです。基本処理内で実装できるので。自分の好きなようにしてくださいな。
CommandExecutorを実装・その他諸々
先ずは「CommandExecutor」インターフェースをクラスに実装します。クラス分けしたい方は全然してもらって構いません。
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
public class CommandClass implements CommandExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
return false;
}
}
こんな感じになるはずです。「CommandExecutor」はインターフェースなので、「implements」で実装してあげてください。「onCommand」メソッドの実装も忘れずに。
まずは「onCommand」メソッドを詳しく説明していきましょ
CommandSender
第一引数である「CommandSender」はコマンドを実行者の情報や実行者に対して何かできるメソッドが入ったりしてます。こやつをinstanceofとかで型判定してあげて、PlayerやConsoleCommandSenderにキャストしてあげて使うこともできます
Command
第二引数である「Command」は先ほど「plugin.yml」に記述したことやそのコマンドに登録されてるその他諸々の情報が詰まってます。
String
入力された親コマンドが入ってます。「/gamemode creative tererun」だったら「gamemode」が入ってます。
String[]
入力された子コマンドが入ってます。「/gamemode creative tererun」だったら配列の1つ目に「creative」、2つ目に「tererun」が入ってます。親コマンドを除いた後のsplitみたいなイメージ。
よく見るとこのメソッド、「boolean」を返す形になってますね。これは先ほど「plugin.yml」にて設定した「usage」に繋がってきます。このbooleanはコマンドの可否になります。trueを返した場合はコマンドが成功、falseを返したらコマンドが失敗、よってfalseが返ってきたら「usage」が表示されるみたいな感じです。
試しに実装してみよう
てことでじゃあ簡単にメッセージを表示されるものを見ていきましょ、今回はサブコマンドの実装もするためにこんな感じで書いてみました。
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
public class CommandClass implements CommandExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (command.getName().equalsIgnoreCase("test")) { //親コマンドの判定
sender.sendMessage("§a/test が実行されました!");
if (args.length == 0) { //サブコマンドの個数が0、つまりサブコマンド無し
sender.sendMessage("§eサブコマンドなし!");
return true; //終わり
} else { //サブコマンドの個数が0以外
sender.sendMessage("§eサブコマンドあり!");
if (args[0].equalsIgnoreCase("hello")) { //サブコマンドが「hello」かどうか
sender.sendMessage("§bHello World!");
} else { //サブコマンドが「hello」以外
sender.sendMessage("§eその他のサブコマンドです");
}
return true; //終わり
}
}
return false;
}
}
簡単ですね。
親コマンドの判定にString(label)を使わない理由は、エイリアスがあった時に書くのが面倒なんでCommand#getNameを使って比較してます。
CommandSender#sendMessageを使うと、コマンドを実行した相手にメッセージを送信できます。覚えておこう。
因みにサブコマンドがあるかどうかの判定として、String[](args)の入ってる個数で判定してあげてます(args.length)。入ってなかった場合は個数が0になります。あくまでも個数なので、例えばサブコマンドが2個ないといけない場合は
if (args.length == 2) { //サブコマンドの個数
String subCommand1 = args[0]; //1個目のサブコマンド
String subCommand2 = args[1]; //2個目のサブコマンド
}
みたいな感じになると思います。配列は0から入っていくのでそこだけご注意を。
あとreturnしてあげるのも忘れずに。どこで処理が終わるか考えよう。
実装後の忘れがちなあれ。
実装後に忘れてはいけないのが、CommandExecutorを実装したクラスをBukkitに登録する作業です。コマンド実行したらここで処理してあげてね。そんな感じです。
メインクラスの「onEnable」メソッドに書くのが無難でしょう。「JavaPlugin」も継承されてるので「getCommand」メソッドがそのまま書けてちょうどいいしね。
import me.tererun.plugin.testplugin.commands.CommandClass;
import org.bukkit.plugin.java.JavaPlugin;
public final class TestPluginMainClass extends JavaPlugin {
@Override
public void onEnable() {
getCommand("test").setExecutor(new CommandClass()); //こいつ
}
}
こんな感じですねー。
getCommandの第一引数にコマンド名を指定してPluginCommandを取得してあげて、CommandExecutorを実装したクラスを渡してあげれば終了です。
〆
今回は基本コマンド編として書いていきました。
コマンドはBukkit・Spigotプラグインの基礎中の基礎ですので、書けるようにしておきましょう。最初のレベルだからPing Pong位の実装の方がよかったのかな...。
もしわからない所があればここのコメントかTwitterのDMにでも言ってください。できる限り対応します。
それではーまた今度。てれるんがお送りしましたー。