Minecraft Kotlinプラグイン開発 入門編 Part.4 簡易的なコマンドの作成

## 初めに 
今回の記事ではコマンドを作成します。  
最初に作るコマンドは/debugと入力したら"こんにちは"と出るだけの物を作ります。

また、コマンドの作り方を軽く紹介したら入門編は終了です。
もっと込んだものが作りたい気持ちは分かりますが、
あと少しだけは我慢して練習していきましょう！

**前** → [入門編 Part.3 イベントの作成](https://qiita.com/tooooowa/items/4aed0ea7e2cf2b55f134)  
**次** → [番外編 plugin.ymlの高度な編集](https://qiita.com/tooooowa/items/e32143047f2913a13330)

**目次** →  [目次と今後の展望](https://qiita.com/tooooowa/items/7809ec65dee757570250)

## 追記
少しでも最初で躓いてしまう人を減らすために、
分からないことを質問できるコミュニティを作成しました。

もし記事を読む中で躓く箇所があったら
このコミュニティへ質問しに来てください！

参加URL→ https://discord.gg/3NEN5s5gnG

## 手順の説明
コマンドの作成は`plugin.ymlで登録`、`コマンドの処理のファイルの作成`、
`プラグイン起動時に有効化`の3ステップで行われます。
この３つはコマンドを増やす度に使用するので覚えておきましょう。
一つでも欠けるとちゃんとコマンドが動きません。
## plugin.yml の編集
まずはコマンドを`plugin.yml`というファイルに登録します。
`一番上のフォルダ`→`src`→`main`→`resources`の中の`plugin.yml`を開きます。
```plugin.yml
name: TutorialPlugin
version: '${version}'
main: com.github.tooooowa.tutorialplugin.TutorialPlugin
api-version: '1.20'
```
私の環境では上のように設定されています。
この中で`name`はプラグインの名前、`main`はメインクラスの場所なので
この２つは環境によって異なると思います。
`api-version`もプラグインのAPIのバージョンなので環境によって異なります。

このファイルの下に新たにコマンドのためのコードを記述します。
```plugin.yml
name: TutorialPlugin
version: '${version}'
main: com.github.tooooowa.tutorialplugin.TutorialPlugin
api-version: '1.20'
commands:
  debug:
    usage: "/debug"
    description: "デバッグ用のコマンドです"
```
`commands`の中の`debug`の部分がコマンドの名前になります。
`usage`はコマンドの使い方、`description`はコマンドの説明です。
`usage`と`description`の2つは特にルールがないので自由に決めて大丈夫です。

## コマンド処理のファイルを作成
メインクラスと同じ階層に新しく`DebugCommand`という名前でオブジェクトを作成します。
オブジェクトの作成方法は[前回の記事](https://qiita.com/tooooowa/items/149fb92def74f70a731a)で紹介したので詳しくはそちらをご覧ください。

ファイル中には一旦以下のように記述します。
(自動で記述される部分はそのままで、5行目の`: CommandExecutor`だけ追記します)
```DebugPlugin.kt
package com.github.tooooowa.tutorialplugin //環境によって異なります

import org.bukkit.command.CommandExecutor

object DebugCommand: CommandExecutor {

}
```
するとobject DebugPluginの部分が赤く下線で表示されます。
その後、赤下線部の文字にカーソルを合わせて画像のような表示が出たら
`メンバーの実装`をクリックします。

:::note alert
出ない場合は赤線部を一度左クリックしてから再度カーソルを合わせてください
:::

![赤線.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3682428/eb48e33f-c181-a7c4-a09b-88700498db26.png)
すると以下のように自動で入力されます。
この`onCommand(~){ }`の`{}`の中が、コマンドが打たれたときに呼び出される場所です。
なので、この`TODO`の行を削除して処理を書きます。
```kotlin
override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array<out String>): Boolean {
        TODO("Not yet implemented")
    }
```
今回は実行時に`こんにちは`と返信させたいので、
サーバーからプレイヤーにメッセージを送る関数を使用します。
基本的にプレイヤーに何かを実行する時は`プレイヤー.～`の形で書きます。

この自動入力で書かれた文では、実行者を`sender`として保存してあるため、
`sender.sendMessage("こんにちは")`と書きます。
`[送る先].sendMessage("内容")`でメッセージを送ること出来ます。

このような関数は沢山あって覚えるのは大変ですが、
最初は調べながらたくさん触れて覚えていきましょう。
今度ここで使用できる関数一覧を作成する予定です。

その後、コマンドの終了の目印で`return true`と次の行に記述して終わりです。
```DebugCommand.kt
package com.github.tooooowa.tutorialplugin

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

object DebugCommand: CommandExecutor {
    override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array<out String>): Boolean {
        sender.sendMessage("こんにちは")
        return true
    }

}
```
## プラグイン起動時の有効化処理を追加
最後に`plugin.yml`と`DebugPlugin.kt`をプラグイン起動時に連携させる処理を追加します。
メインクラスのonEnableに追記します。
```TutorialPlugin.kt
package com.github.tooooowa.tutorialplugin

import org.bukkit.plugin.java.JavaPlugin

class TutorialPlugin : JavaPlugin() {
    override fun onEnable() {
        // Plugin startup logic
        server.pluginManager.registerEvents(EventListener, this)
        getCommand("debug")?.setExecutor(DebugCommand)
    }

    override fun onDisable() {
        // Plugin shutdown logic
    }
}
```
追加したのは一行だけです。`getCommand("debug")?.setExecutor(DebugCommand)`
この`debug`が`plugin.yml`の登録名で`DebugCommand`が作成したオブジェクト名です。

これが出来たらビルドしてみましょう。
## サーバーに実装
プラグインをビルドし、サーバーに導入します。
ビルドの仕方を忘れてしまっていたら前々回をご覧ください。

サーバーを起動してから`/debug`を実行して
画像のようにメッセージが帰ってきたら成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3682428/ecb6d825-9ad4-540f-db93-48dfae345080.png)
## 終わりに
お疲れ様でした。
これにて入門編は完全に終了です。

次回は、中級編の前に番外編として
今回使用した `plugin.yml` について詳しく解説していこうと思います。

初級編の5記事、最後まで読んでいただきありがとうございました。

**前** → [入門編 Part.3 イベントの作成](https://qiita.com/tooooowa/items/4aed0ea7e2cf2b55f134)
**次** → [番外編 plugin.ymlの高度な編集](https://qiita.com/tooooowa/items/e32143047f2913a13330)

**目次** →  [目次と今後の展望](https://qiita.com/tooooowa/items/7809ec65dee757570250)

## 参考
[https://qiita.com/sya-ri/items/f69f1489b60650a7dd41](https://qiita.com/sya-ri/items/f69f1489b60650a7dd41)