0
1

More than 1 year has passed since last update.

Spigot 開発 初心者用メモ 第3回 マイクラ内のコマンドを受け取る

Posted at

あいさつ

 どうも、guy7ccです。前回に続き、Spigot開発についてメモします。
 環境は、Windows10、Spigot1.18.1、JDK17.0.1、IntelliJ IDEA Community2021.3です。

目次

  1. テスト用サーバー環境の構築
  2. IntelliJ IDEA Communityによる開発環境の構築
  3. マイクラ内のコマンドを受け取る ←今回
  4. イベントリスナで起きた事象を受け取る ←まだ書いてない
  5. タスクでティック毎に処理を起こす ←まだ書いてない
  6. config.ymlを駆使する ←まだ書いてない
  7. (未定)

第3回 マイクラ内のコマンドを受け取る

 さあ、いよいよ本格的にプラグインの作成に入ります。今回は例として、手に持っているアイテムを頭に乗せる/hatというコマンドを自作してみましょう。

コマンドの設定

 まずは、設定したいコマンドをファイルに追加していきます。プロジェクトタブからresourcesフォルダを掘り出して、plugin.ymlというファイルを開きます。このファイルにコマンドについて色々記述していくのですが、以下の説明はこのサイトを参考にしています。

 Plugin.ymlの設定一覧

 既にある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クラスを新規作成。
image.png
 何でも良いですが、私はHatCommandExecutorというクラス名にしました。
image.png
 そして、作成したHatCommandExecutor.javaを次のように編集しましょう。

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;
    }
}

 これが、コマンドを受け取るクラスの雛形です。順に解説していきます。

 まずここ。

HatCommandExecutor.java
public class HatCommandExecutor implements CommandExecutor

 これは、CommandExecutorというインターフェースを実装し、コマンドを受け取るクラスであることを示しています。
 次ここ。

HatCommandExecutor.java
@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というクラスのインスタンスで表されます。とりあえず、実際のコードを見ていきます。

HatCommandExecutor.java
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コマンドに割り当てる必要があります。

TestPlugin.java
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を設定します。これでプラグイン完成ですので、ビルドしてテスト用のサーバーに導入してみましょう。やり方は前回書きました。早速ログインして試します。

 アイテムを手に持って…
image.png
 /hatと打つと…
image.png
 できました!!

おわり

 今回は、プラグインでコマンドを受け取る方法を書きました。次回は、イベントリスナで起きた事象を受け取る方法を書きます。

 第4回 イベントリスナで起きた事象を受け取る ←まだ書いてない

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1