あいさつ
どうも、guy7ccです。前回に続き、Spigot開発についてメモします。
環境は、Windows10、Spigot1.18.1、JDK17.0.1、IntelliJ IDEA Community2021.3です。
目次
- テスト用サーバー環境の構築
- IntelliJ IDEA Communityによる開発環境の構築
- マイクラ内のコマンドを受け取る ←今回
- イベントリスナで起きた事象を受け取る ←まだ書いてない
- タスクでティック毎に処理を起こす ←まだ書いてない
- config.ymlを駆使する ←まだ書いてない
- (未定)
第3回 マイクラ内のコマンドを受け取る
さあ、いよいよ本格的にプラグインの作成に入ります。今回は例として、手に持っているアイテムを頭に乗せる/hat
というコマンドを自作してみましょう。
コマンドの設定
まずは、設定したいコマンドをファイルに追加していきます。プロジェクトタブからresourcesフォルダを掘り出して、plugin.yml
というファイルを開きます。このファイルにコマンドについて色々記述していくのですが、以下の説明はこのサイトを参考にしています。
既にあるplugin.yml
のテキストの下に、これを追加してください。
commands:
hat:
description: Put your item in the main hand to the head.
aliases: [h, helmet]
permission: testplugin.command.hat
permission-message: You do not have permission to perform this command.
usage: /hat (the sender of this command needs to be a player.)
permissions:
testplugin.command.*:
description: Allows you to perform commands in this plugin.
children:
testplugin.command.hat: true
testplugin.command.hat:
description: Allows you to perform /hat command.
default: true
commands設定
まず、commands
設定から解説します。commands
設定直下には、追加したいコマンド名を羅列します。そしてそのコマンド名の下に、そのコマンドの詳細な設定を記述していきます。
-
description
オプションは、/help
コマンド実行時に表示されます。でも、実際/help
使うやつなんてあまりいないので無くてもいいです。 -
aliases
オプションは、そのコマンドのエイリアスを設定します。エイリアスとは、そのコマンドに複数の名前を付けるということです。つまり、今回の場合は/h
と/helmet
が/hat
と同じ挙動を示します。 -
permission
オプションは、そのコマンドを実行するために必要な権限名を指定します。 -
permission-message
オプションは、そのコマンド実行者がpermission
オプションに記述される権限を持っていない場合に、コマンド実行者に送られるメッセージです。 -
usage
オプションは、後述するonCommand
関数がfalseを返したときに、コマンド実行者に表示されるメッセージです。
permissions設定
次に、permissions
設定を解説します。permissions
設定直下には、追加したい権限の名前を羅列します。そしてcommands
設定と同様に、オプションを追加していきます。
-
description
オプションは、サーバー管理者が権限の説明文として利用されるらしいです。これ1回も使ったことないのは私だけでしょうか… -
default
オプションは、その権限をデフォルトで誰が持つかを表します。以下の4つから選ぶことができます:
- true
:全員。
- false
:誰でもない。
- op
:op権限を持つ者。
- not op
:op権限を持たない者。
ちなみに、サーバーのコンソールやコマンドブロックはop権限を持っています。
-
children
オプションは、その権限の子要素となる権限を設定します。true
の場合、親の権限を持つ者は子の権限も持ちます。false
の場合は逆に子の権限を含みません。
CommandExecutorの作成
次に、コマンドを受け取るためのクラスを作成しましょう。プロジェクトタブからjavaフォルダを掘り出して、TestPlugin
クラスが入っているパッケージ(画像だとio.github.guy7cc.testplugin
と表示)を右クリックして、Javaクラスを新規作成。
何でも良いですが、私はHatCommandExecutor
というクラス名にしました。
そして、作成したHatCommandExecutor.javaを次のように編集しましょう。
package io.github.guy7cc.testplugin; //ここは人によって違うので触らない
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
public class HatCommandExecutor implements CommandExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args){
//ここにコマンドが入力されたときの処理を書く
return false;
}
}
これが、コマンドを受け取るクラスの雛形です。順に解説していきます。
まずここ。
public class HatCommandExecutor implements CommandExecutor
これは、CommandExecutorというインターフェースを実装し、コマンドを受け取るクラスであることを示しています。
次ここ。
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args)
このonCommand
関数は、コマンドが実行されたときに呼ばれる関数です。返り値はboolean、すなわち真偽値で、trueならばコマンド実行成功、falseならばコマンド実行失敗を表します。とりあえず何もなければfalseを返すようにしています。
引数について、
-
sender
は、コマンド実行者を表します。プレイヤーやNPC、コマンドブロック、サーバーのコンソールなどがこれになり得ます。 -
command
は、その名の通りコマンド自体を表します。コマンド名や、コマンドの使い方などを取得することができます。 -
label
は実際に打ち込まれたエイリアスを表します。 -
args
は文字列の配列で、コマンドを打ったときの引数を表しています。例えば、/hat a bb ccc
と打てば、args = {a, bb, ccc}
という感じで引数が渡されます。
プログラム本体
さて、手に持っているアイテムを頭に乗せるプラグインを作ると言いましたが、具体的には「/hat
と打つと、利き手に持っているアイテムのスタックと頭のアイテムのスタックを交換するプラグイン」を作りたいと思います。詳しく解説できていないところがあれば、公式のドキュメントを参照してください。右上の検索欄が便利です。
Spigot-API 1.18.1-R0.1-SNAPSHOT API Documentation
インベントリ内にあるアイテムの1つのスタックは、ItemStack
というクラスのインスタンスで表されます。とりあえず、実際のコードを見ていきます。
package io.github.guy7cc.testplugin; //ここは人によって違うので触らない
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
public class HatCommandExecutor implements CommandExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args){
if(!(sender instanceof Player)) return false; //senderがプレイヤーのインスタンスでなければ実行失敗
Player player = (Player) sender; //senderをプレイヤーとしてキャスト
PlayerInventory inv = player.getInventory();
ItemStack hand = inv.getItemInMainHand();
ItemStack helmet = inv.getHelmet();
inv.setItemInMainHand(helmet);
inv.setHelmet(hand);
return true;
}
}
まあ、長々と説明はしませんがこれでこのクラスは完成です。どういうプログラムなのか、各自で公式のドキュメントを見ながら分析してください。
CommandExecutorの設定
さて、上で/hat
コマンド用のCommandExecutorを作成しましたが、これでは何も動きません。このHatCommandExecutor
クラスのインスタンスを/hat
コマンドに割り当てる必要があります。
package io.github.guy7cc.testplugin; //ここは人によって違うので触らない
import org.bukkit.plugin.java.JavaPlugin;
public final class TestPlugin extends JavaPlugin {
@Override
public void onEnable() {
// Plugin startup logic
getLogger().info("Hello World!!!!");
getCommand("hat").setExecutor(new HatCommandExecutor()); //この1文を追加
}
@Override
public void onDisable() {
// Plugin shutdown logic
}
}
このプラグインが有効化されたときに呼び出される関数onEnable
で、plugin.yml
で設定した/hat
コマンドを取得して、Executorを設定します。これでプラグイン完成ですので、ビルドしてテスト用のサーバーに導入してみましょう。やり方は前回書きました。早速ログインして試します。
おわり
今回は、プラグインでコマンドを受け取る方法を書きました。次回は、イベントリスナで起きた事象を受け取る方法を書きます。
第4回 イベントリスナで起きた事象を受け取る ←まだ書いてない