Minecraft Kotlinプラグイン開発 入門編 Part.3 イベントの作成

# 初めに  
今回の記事では"イベント"を作成します。  
イベントというのは～が起きたらというトリガーになるものなので  
プラグインを作る上で使う機会が多いです。
今はどういう手順で追加するのかだけでいいので覚えておきましょう！

**前** → [入門編 Part.2 プラグインの作成](https://qiita.com/tooooowa/items/149fb92def74f70a731a)  
**次** → [入門編 Part.4 簡易的なコマンドの作成](https://qiita.com/tooooowa/items/b02d0f06bdacb637c060)

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

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

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

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

## 注意点  
この記事では、前回の記事で紹介した、  
プラグインの作成が終わっている前提で進めていきます。  
まだ済んでいない方は[前回の記事](https://qiita.com/tooooowa/items/149fb92def74f70a731a)を読んでからこの記事をご覧ください。  

# メインファイルの説明  
前回変換したファイルについての説明をしていきます。  
また、このファイルをこれからはメインクラスと呼びます。  
メインクラスの中身はこのようになっていると思います。  
(一部環境によって異なる部分があります)
```TutorialPlugin.kt
package com.github.tooooowa.tutorialplugin

import org.bukkit.plugin.java.JavaPlugin

class TutorialPlugin : JavaPlugin() {
    override fun onEnable() {
        // Plugin startup logic
    }

    override fun onDisable() {
        // Plugin shutdown logic
    }
}
```
この中から一行ずつ解説していきます。  
### package  
```kotlin
package com.github.tooooowa.tutorialplugin
```
この部分は環境によって異なっていると思います。  
これから新しいファイルを作る際も  
IntelliJ IDEA が自動で記入してくれるため、気にしなくて大丈夫です。  
~~一応私も調べてみましたが、具体的に何のためにあるのかは分かりませんでした。~~
### import  
```kotlin
import org.bukkit.plugin.java.JavaPlugin
```

このimportというのは、
クラスや関数を取りまとめた"パッケージ"を使うと宣言する場所です。  
コードをこれから書いていくと沢山このimportが増えてきますが、  
こちらもIntelliJ IDEAが自動で記入してくれるため基本的には気にしなくて大丈夫です。  
### onEnable()
```kotlin
override fun onEnable() {
    // Plugin startup logic
}
```
ここはプラグインが**起動**した時にこの`{  }`で囲まれた物を実行するというものです。  
これから行うイベントの登録や今度紹介予定のコマンドの登録はここに記入します。  
### onDisable()
```kotlin
override fun onDisable() {
    // Plugin shutdown logic
}
```
ここはプラグインが**停止**した時にこの`{  }`で囲まれた物を実行するというものです。  
今回は使いませんが、データベースを使用するときにデータの保存等に使用します。  
# イベントの登録  
メインクラスの紹介もできたのでこれからイベントを登録していきます。

## イベント用のファイルの作成
メインクラスと同じ階層に新しくイベント用のファイルを作成します。
ここでは"オブジェクト"と呼ばれる種類のファイルを作成します。

メインクラスを右クリックして、`新規`→`Kotlin ファイル/クラス`をクリックします。
すると、名前と種類が聞かれるので、名前に`EventListener` と入力してから
一番下にある`オブジェクト`を2回クリックしてください。

以下のように自動でファイルが生成、中に記入されると思います。  
```EventListener.kt
package com.github.tooooowa.tutorialplugin //ここは人によって違います

object EventListener {
}
```
### Listener の継承
作成したファイルの中にこれがイベントを受け取るファイルと宣言しないと行けないので
`object` から始まってる部分を以下のように少し書き換えます。(これを**継承**といいます)  
```kotlin
object EventListener: Listener {
}
```
`: Listener`を追記するだけの作業ですが、一つ注意してほしいのが、  
`Listener`と打った時に、候補でいくつか出てくる中で
`org.bukkit.event.Listener`と書いてあるものをクリックしないといけません。  
正常に選択すると、恐らくファイル3行目に以下の文が追加されていると思います。
```kotlin
import org.bukkit.event.Listener
```
もしこのimport文が異なっている場合は、一度そのimportの一行と
Listenerと書いてある部分を削除してもう一度Listenerを書き直して再選択してください。  

### メインクラスでイベントの登録  
イベントを受け取る場所は作りましたがこれだけだとイベントは動きません。  
プラグインが有効化された時にイベントを受け取る場所だと登録する必要があります。  
"**プラグインが有効化された時**"なのでここではメインクラスの`onEnable`を使用します。  

メインクラスを開きonEnableの部分を以下のように書き換えます。  
```TutorialPlugin.kt
override fun onEnable() {
    // Plugin startup logic
    server.pluginManager.registerEvents(EventListener, this)
}
```
`server.pluginManager.registerEvents(EventListener, this)`
追加したのは上の一文だけです。
`server.pluginManager.registerEvents` は、ほぼ定型文として覚えてほしくて、  
主にそれ以降の `(EventListener, this)` を説明します。  

まず最初の部分の`EventListener`はさっき作成したファイル名になっています。  
別の名前でファイルを作成した際は、ここも同時に変えます。  
`this`はこのプラグインを指しています。`this`以外使うことはほぼありません。  

### イベントの追加
イベントの登録が出来たら、さっきのイベントのファイルに戻り、イベントを追加します。
```EventListener.kt
package com.github.tooooowa.tutorialplugin // ここは環境によって異なります。

import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.player.PlayerJoinEvent

object EventListener: Listener {
    @EventHandler
    fun onJoin (event: PlayerJoinEvent) {
        event.joinMessage = "§e${event.player.name}がサーバーに参加しました。"
    }
}
```
変更点は先ほどの`{}`の中に参加時のイベントを追加しました。
参加した時に参加メッセージが変更されるようになっています。
### 解説  
```kotlin
@EventHandler
fun onJoin (event: PlayerJoinEvent) {
    event.joinMessage = "§e${event.player.name}がサーバーに参加しました。"
}
```
主に変わったのは上記の部分です。
`@EventHandler`はイベントの関数の前の行に必ず必要で
「次の行がイベントですよ」と宣言するようなものです。

関数は基本的に`fun` + `関数名` + `引数` + `{}` の形で作られています。

関数名は今回で言う`onJoin`ですが、ここは自由に決めて大丈夫です。
その後の`(event: PlayerJoinEvent)`が引数で、
どのタイミングで反応するイベントか指定しています。
`PlayerJoinEvent`の部分を変えると呼び出されるタイミングが代わります。
ここで使うイベントの種類は今度番外編としてよく使うのだけまとめる予定です。
そして`{}`の中身が呼び出された時に実行される内容です。

:::note warn
他のサイトを見るときに注意ですが、
基本的にこの`event`も別の文字に変えても問題はないです。
ですが、その後の`event.joinMessage`の`event`の部分も連動して
変えなきゃいけないので注意してください。
:::

今回、関数の中身は以下のようになっています。
```kotlin
event.joinMessage = "§e${event.player.name}がサーバーに参加しました。"
```
`event.joinMessage`は`PlayerJoinEvent`専用のもので、
参加時のメッセージが文字列で入っています。
`変数 = 代入する文字列` の形でKotlinでは変数に代入ができます。
これは今後たくさん使うので覚えておきましょう。
また、`§e`や`${event.player.name}`を文字列に使用していますが、
`§e`は黄色を表していて、`${event.player.name}`はプレイヤー名を表しています。
色を使う時は`§+英数字`を使用します。一覧は[こちら](https://minecraft.fandom.com/ja/wiki/%E8%A3%85%E9%A3%BE%E3%82%B3%E3%83%BC%E3%83%89)のサイトに載っています。

## ビルド
前回紹介した方法と同じ方法でビルド、サーバーに導入します。
<details><summary><b>前回紹介した方法(詳しくは前回をご覧ください)</b></summary>
画面右上の緑色の三角のボタンを押すとビルドが開始されます。<br>
<br>
少し待って画面の下の方に"'build' の実行を完了しました。"と出たらビルド成功です。<br>
<br>
エクスプローラーを開き、ルートディレクトリから`build`→`libs`の順番で開くと、<br>
.jarの形式でファイルが保存されているので、<br>
それをマイクラサーバーのpluginsフォルダに入れてサーバーを起動しましょう。<br>
</details>
ビルド参加して画像のように参加してメッセージが変更されていたら成功です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3682428/e43952a4-2368-0cdd-d99f-1c186f96f6bd.png)

# 終わりに
これでイベント作成は終了です。
イベントの作成はこれからたくさん使うので、基本的な流れだけは覚えてください。
一通りコードの書き方を紹介した後に、応用編としてより深く紹介する予定なので
今はほぼ真似でひたすら動きを真似してみてください！

次回は、コマンドの追加についてです。
お疲れ様でした！

**前** → [入門編 Part.2 プラグインの作成](https://qiita.com/tooooowa/items/149fb92def74f70a731a)  
**次** → [入門編 Part.4 簡易的なコマンドの作成](https://qiita.com/tooooowa/items/b02d0f06bdacb637c060)

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

# 参考  
[https://www.youtube.com/watch?v=CPplKkiTEjU](https://www.youtube.com/watch?v=CPplKkiTEjU)
[https://qiita.com/sya-ri/items/2b3e9e063048699ead50](https://qiita.com/sya-ri/items/2b3e9e063048699ead50)