NukkitプラグインをGroovyで書く


#はじめに
Nukkitプラグインを色んなJVM言語で書いてるのが楽しくて
投稿することにしました。

ちなみに、ついこの前Scalaで書くことができ、投稿しようと思っていたのですが
まさか先を越されて __既にあった...__
>[ScalaでNukkitプラグイン](https://qiita.com/suinua/items/f141051956d5a18cada1)

ので、この記事では__Groovy__で書いてみます。

GitHub↓↓
https://github.com/MyDeacy/NukkitPlugin-Groovy


# 前提として
+ サーバーソフトはNukkitX
+ IDEとしてIntellij IDEAを使用し、Groovyを動かせる状態にしていること。


# 作成
## ・プロジェクトの作成

New projectをして、表示されるメニューで
Gradleを選択し、Groovyにチェックを入れてください。

次に、
GroupIdに ``mydeacy.groovy.sampleplugin``
ArtifactIdに ``SamplePlugin``

と記入し、Nextをクリックします。
以下の画像のようになります。
(わかる方はご自身で適宜変えてください。)
![SS1.png](https://qiita-image-store.s3.amazonaws.com/0/334791/be0c4926-b208-56af-bad0-2f232f6e9990.png)

終えたら、__Use auto-import__にチェックを入れ、Next。

保存先を決めたら Finish をクリックしてください。

##・build.gradleの編集
必要なファイルが生成されたら、
__build.gradle__を開いてください。

デフォルトで書いてあるコードを消し、以下のコードをコピペしてください。

```gradle:build.gradle
buildscript {
    repositories {
        jcenter()
        mavenCentral()
    }
    dependencies {
        classpath "com.github.jengelman.gradle.plugins:shadow:1.2.3"
    }
}

apply plugin: "groovy"
apply plugin: "com.github.johnrengelman.shadow"
defaultTasks "shadowJar"

version = "1.0.0"

repositories {
    mavenCentral()
    maven {
        url "https://repo.nukkitx.com/main/"
    }
}
dependencies {
    compile "org.codehaus.groovy:groovy-all:2.3.11"
    compileOnly "cn.nukkit:nukkit:1.0-SNAPSHOT"
}
```
[build.gradle](https://github.com/MyDeacy/NukkitPlugin-Groovy/blob/master/build.gradle)

コピペしてしばらくすると、いくつかディレクトリ等が生成されます。
環境によっては 少し長い時間を要します。
そして、``Build``→``Rebuild Project``

##・ファイルの作成、編集
###・plugin.yml
src/main内にある __resources__ を右クリックし、
New→New File。

名前を __``plugin.yml``__に設定し、ファイルを作成します。

中身は、こんな感じで書いてください。
今回は例としてコマンドも用いますので、コマンドの記述があります。
分からない方はコピペでも大丈夫です。

```yaml:plugin.yml
name: SamplePlugin
main: mydeacy.groovy.sampleplugin.SamplePlugin
version: 1.0.0
api: ["1.0.0"]
commands:
  id:
    description: "Description"
    usage: "/id"
```

###・クラスの作成
src/main内の __groovy__ を右クリックし、
New→Package。

``mydeacy.groovy.sampleplugin``

と入力し、OKをクリックします。

そうすると、groovyディレクトリの中に
先程名前の付けたパッケージがあるので、
それを右クリック→New→Groovy Classを選択し、
名前を

``SamplePlugin``

にし、OKをクリックしてください。

生成されたSamplePlugin.groovy
に、以下のコードをコピペしてください。

```groovy:SamplePlugin.groovy
package mydeacy.groovy.sampleplugin

import cn.nukkit.Player
import cn.nukkit.command.Command
import cn.nukkit.command.CommandSender
import cn.nukkit.event.EventHandler
import cn.nukkit.event.Listener
import cn.nukkit.event.player.PlayerJoinEvent
import cn.nukkit.item.Item
import cn.nukkit.plugin.PluginBase

class SamplePlugin extends PluginBase implements Listener {

    @Override
    void onEnable() {
        getLogger().info("Hello Nukkit!!!")
        getServer().getPluginManager().registerEvents(this, this)
    }

    @EventHandler
    void onJoin(PlayerJoinEvent event) {
        Player player = event.getPlayer()
        player.sendMessage(player.getName() + ", Welcome to my server!")
    }

    @Override
    boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (sender instanceof Player) {
            Item item = sender.getInventory().getItemInHand()
            sender.sendMessage("This is " + item.getName() + ". (" + item.getId() + ":" + item.getDamage() + ")")
        }else{
            getLogger().info("Hey Console.")
        }
        return true
    }
}
```
ハイライトが付かない場合は、
build.gradleを開き、
``compileOnly "cn.nukkit:nukkit:1.0-SNAPSHOT"``
を
``compile "cn.nukkit:nukkit:1.0-SNAPSHOT"``
に変えて、しばらくして__戻す__と反映されると思います。
戻すのを忘れないでください。


#### ✔ 今回のコードはどういうものか
Groovyで書く例ですが、完全にJavaぽいサンプルになってしまっています（）

こちらのは、プラグイン有効化時に __"Hello Nukkit!!!"__とコンソールに出し、
プレイヤーの参加時には
__"{プレイヤー名}, Welcome to my server!"__
とメッセージを送ります。

また、コマンドでは
/id でプレイヤーの持っているアイテム名、ID:Metaを出力します。


###・完成図
中身はできてるものとします。
このようになっていればOKです。
![SS2.png](https://qiita-image-store.s3.amazonaws.com/0/334791/df4b986a-627a-2581-f018-f3d6b4a287ec.png)

## Nukkitで読み取り可能なjarにする

上部のメニューから Run→Runをクリック。
項目が出てくるので、

__SamplePlugin__を選択してください。
すると、コンパイルを開始します。

数秒でファイルが生成されます。
生成されたjarは、
_プロジェクトディレクトリ/build/libs_ 内にあります。

##プラグイン導入
ここの説明はNukkit使用者なら必要ないと思いますが一応。
生成されたjarを、Nukkitのあるディレクトリ/plugins内に入れます。

Nukkitを起動し、無事"Hello Nukkit!!!"が表示されたら
完了です。

#おわりに
build.gradleについて、
想定した書き方でいくつか試したところ
``NoClassDefFoundError``に悩まされつつ
このような形になっています。

コードの案等があればコメント或いはプルリクエストが欲しいです。

ダラダラとした説明でしたが
ここまで読んでくださりありがとうございます。


完成品↓↓
https://github.com/MyDeacy/NukkitPlugin-Groovy