【Spigot】Bukkitプラグインの作り方講座 - コマンドの追加と権限
コマンドの追加
コマンドを追加する方法は二種類あります。
plugin.ymlを編集する方法と、プログラムで動的にコマンドを追加する方法があります。
SpigotMCによる公式の解説はこちら(英語)
今回はplugin.ymlを編集してコマンドを追加します。
まず、plugin.ymlを編集します。
name、mainなどの下にcommandsを設定します。
書き方:
name: プラグイン名
main: パッケージ.メインクラス
version: バージョン
description: プラグインの説明
# 作者が複数いる場合はauthorsを使用し、一人の場合はauthorを使用して下さい。
author: 作者名
authors: [作者1, 作者2, 作者3]
website: サイトのURL
commands:
コマンド名:
description: コマンドの説明
aliases: [他のコマンド名1, 他のコマンド名2]
permission: コマンドの権限
usage: コマンドの使い方
コマンド名:
description: コマンドの説明
aliases: [他のコマンド名1, 他のコマンド名2]
permission: コマンドの権限
usage: |
コマンドの使い方1行目
2行目
3行目...
permissions:
権限名1.*:
description: 権限の説明
children:
権限名1.権限名2: true
権限名1.権限名3: true
権限名1.権限名3.権限名4: true
権限名1.権限名2:
description: 権限の説明
default: true
権限名1.権限名3:
description: 権限の説明
default: true
権限名1.権限名3.権限名4:
description: 権限の説明
default: op
children:
権限名1.権限名3: true
青色の文字が新しく記入した文です。name、main、versionの他に色々追加していますが、好きなものを追加して下さい。
記載例:
name: TestPlugin
main: io.github.densyakun.bukkit.test.Main
version: 0.2
description: This plugin is test plugin.
author: Densyakun
website: https://github.com/Densyakun
commands:
flagrate:
description: Set yourself on fire.
aliases: [combust_me, combustMe]
permission: inferno.flagrate
usage: Syntax error! Simply type /command to ignite yourself.
burningdeaths:
description: List how many times you have died by fire.
aliases: [burning_deaths, burningDeaths]
permission: inferno.burningdeaths
usage: |
/command [player]
Example: /command - see how many times you have burned to death
Example: /command CaptainIce - see how many times CaptainIce has burned to death
permissions:
inferno.*:
description: Gives access to all Inferno commands
children:
inferno.flagrate: true
inferno.burningdeaths: true
inferno.burningdeaths.others: true
inferno.flagrate:
description: Allows you to ignite yourself
default: true
inferno.burningdeaths:
description: Allows you to see how many times you have burned to death
default: true
inferno.burningdeaths.others:
description: Allows you to see how many times others have burned to death
default: op
children:
inferno.burningdeaths: true
インデントは空白二個ですが、三個でも出来ます。間違えると動きません。(インデントは揃えて下さい)
今回はversionを0.2に書き換えました。
まず、commandsを書き、その中にコマンド名を書きます。
name: TestPlugin
main: io.github.densyakun.bukkit.test.Main
version: 0.2
author: Densyakun
commands:
test:
これで /test コマンドを追加できます。
commands:
とコマンド名
だけでも動きますので、書くのがめんどくさい方はこれで大丈夫です。
他にも、コマンドの説明を書きたい場合はdescription
を書いて下さい。
aliases
を使って他のコマンド名を使えます。
例えば、/flagrateコマンドを/combust_meや/combustMeでも出来るようにした場合は、
/flagrateコマンドの中にaliases: [combust_me, combustMe]
と書きます。
使い方の説明は二種類あり、一行だけで書く場合は
usage: コマンドの使い方
で出来ます。
複数行で表示したい場合は
usage: |
コマンドの使い方1行目
2行目
3行目...
で出来ます。(「...」は消して下さい)
プラグインの権限
コマンドのpermissionを書くと権限を持っていない場合はコマンドが実行できなくなります。
権限を付与するにはOP権限を与えるか、PermissionExなどを使って権限を付与します。
細かく権限を設定するには、permissions:
を追加します。
permissions:
権限名1.*:
description: 権限の説明
children:
権限名1.権限名2: true
権限名1.権限名3: true
権限名1.権限名3.権限名4: true
権限名1.権限名2:
description: 権限の説明
default: true
権限名1.権限名3:
description: 権限の説明
default: true
権限名1.権限名3.権限名4:
description: 権限の説明
default: op
children:
権限名1.権限名3: true
permissions:の中に権限の名前を書きます。
通常、権限の名前はプラグイン名.権限名
という風に書きます。
コマンド用にプラグイン名.command.コマンド名
と書く場合などもありますので、お好みの書き方をして構いません。
権限の名前を書いたら、その中にdescription
で権限の説明を書きます。
default
は、誰がこの権限を持っているか設定します。true
にすると誰でも使えます。op
にするとOP権限を持っていればPermissionExなどで付与していなくても使えます。false
にするとOP権限を持っていてもPermissionExなどで設定しないと権限が付与できません。
権限にchildren
を記入すると、権限の子権限を設定でき、権限の親子関係を定義できます。
例えば権限test.command.test
と、その親権限のtest.command
、更にその親のtest.*
があります。
その場合はtest.*
の子権限にtest.command
、
test.command
の子権限にtest.command.test
を追加します。
子権限の名前の後にtrue
と書いてありますが、これはtrue
だと通常の親子関係を定義し、false
だと親子関係が逆になるように定義できます。
コマンドの処理
CommandExecutorを使った場合
まず最初に、CommandExecutorを実装したクラス、CommandKitクラスを作成します。
このクラスは、実行されたコマンドを受け取り、行う命令を書きます。
public class CommandKit implements CommandExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
return false;
}
}
メインクラスにonCommandを書く場合
他にも、JavaPluginを実装したプラグインのメインクラス(前回作成しました)にonCommandメソッドを書くこともできます。
この場合は、CommandExecutorの実装は必要ありません。
メインクラスはplugin.ymlに書かれているmainと同じです。
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (label.equalsIgnoreCase("test")) {
sender.sendMessage("コマンドが実行されました");
}
return true;
}
ちなみに後者は、初期のBukkitから存在する方法になります。
お好みの方法でコマンドを追加してください。
onCommand
は自分のプラグインのコマンドが打たれると実行される関数です。
引数のlabel
はコマンド名、args
はコマンドの引数です。
例えば「/tp Densyakun Steve」の場合、label
は"tp"、args
には["Densyakun", "Steve"]
と言う配列が入ります。
sender
のCommandSenderクラスは、プレイヤーやコンソールなどの「コマンドを実行できる者」のクラスです。
例えばプレイヤーはPlayerクラスですが、CommandSenderインターフェースを継承していますし、プレイヤーでない場合もコマンドブロック、サーバーコンソールなどからコマンドが実行できるためこれもCommandSenderになります。
senderについての詳しい使い方はあとで説明します。
このコードではsender.sendMessage(str)
を使ってコマンド送信元にメッセージを送り返しています。
if(label.equalsIgnoreCase("test"))
を使って、testコマンドが実行されたかどうかを判別しています。
JavaではequalsIgnoreCase(str)
を使って文字列と文字列を大文字小文字を気にせず判定することが出来ます。
booleanを返さなくてはいけないため、return true
と書いています。
コマンドを間違えた場合にfalseを返すとplugin.ymlにて設定したコマンドの使い方が表示されます。
trueを返すと何も起きません。
実際はこんな感じになります。
package io.github.densyakun.bukkit.test;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin;
public class Main extends JavaPlugin {
@Override
public void onEnable() {
System.out.println("プラグインが有効になりました");
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (label.equalsIgnoreCase("test")) {
sender.sendMessage("コマンドが実行されました");
}
return true;
}
@Override
public void onDisable() {
System.out.println("プラグインが無効になりました");
}
}
複数のコマンドが同じonCommandメソッドを実行するので、
複数のコマンドを追加する際にはバグが起きないよう注意してください。
実際に使ってみましょう。前回と同じようにエクスポートして下さい。
サーバーにプラグインを入れて、サーバーを起動したら、
plコマンドを実行してプラグインが正しく導入されているか確認して下さい。
入れてもプラグインが読み込まれていない場合はplugin.ymlが間違っている可能性があります。
/ver TestPluginと入れると、バージョンが変わっているはずです。
/help TestPluginを実行すると追加されたプラグインが載っています。
/help testと入力するとtestコマンドについての説明や使い方が表示されますが、今回は書いていないので出ていません。
コマンドを実行してみましょう。
実行すると「コマンドが実行されました」と言うメッセージが表示されます。
/tとだけ入力してTABキーを押すと追加したtestコマンドがリストに載っています。
コマンド以外の権限について
plugin.ymlで設定した権限はコマンド以外にも使用できます。
権限を所有しているかどうか判定するには以下のコードを使用して下さい。
if (sender.hasPermission("権限名"))