Spigotプラグインの作り方講座(Java初心者向け)

#概要
ここではJavaでSpigotのプラグインを作っていきます。
Java初心者向けとなるため、Javaの基礎知識から説明を行います。
Javaを使ったことがあるなどの場合は適宜読み飛ばしてください。
また、ここでは現在のMinecraftの推奨環境であるJDK8を使用します。

#準備の準備
- [ ] JDK8: [ここ](https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)から自分のOSにあったものをインストールしてください。

- [ ] IntelliJ IDEA: [ここ](https://www.jetbrains.com/idea/download/#section=windows)から自分のOSにあったものをインストールしてください。Community版で大丈夫です(Ultimateは有料)。

>注意
>JDK8: Minecraftを作っているJavaというプログラミング言語の開発キットです。今回はバージョン8を使います。
>IntelliJ IDEA: プログラムを書くのに使う総合開発環境(IDE)というソフトです。(以下IDEA)
>他にもEclipseやNetBeansというものもありますが著者がIDEAを使っているため本講座でもIDEAを使います。
>日本語化は[ここ](https://www.ipentec.com/document/software-install-intellij-japanese-plugin)などを参照してください
>著者の環境は日本語化されているためメニューの項目などは日本語名で解説します。
>著者はWindows環境です。Macでも同様の手順で行えるはずですが細かい部分は不明ですのでご自身で確認お願いします。

#準備
IDEAを起動すると以下の様が画面が出ると思います(初回起動時は設定をインポートするか聞かれると思いますが選択肢下の「インポートしない」で大丈夫です。)
![IDEA.トップ画面](https://qiita-image-store.s3.amazonaws.com/0/339002/c11f19aa-5675-cd10-15f1-55341017f2b7.jpeg)
右下の歯車の「構成」から「プラグイン」を押してください。
入力欄が出るので「minecraft」と検索します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/339002/9653e144-f2f5-6899-92c2-58bc5f162126.png)
ここでは左上に表示されている「Minecraft Development」をインストールしてください。
インストールしたらIDEAの再起動を求められるので再起動します。
>表示されない場合は「リポジトリから検索」を試してください。
>ここでインストールしているMinecraft DevelopmentはSpigotプラグインなどの雛形の作成を補助してくれるIDEAの拡張機能です。

#雛形を作る
##初期設定
それではいよいよプログラムを書いていきます。
新規プロジェクトの作成を押してください。
上の方の「プロジェクトSDK」がなしになっている場合は、「新規」からjava_homeのフォルダを選択してください。
(Windowsなら`C:\Program Files\Java\jdk1.8.0_181`など)
Minecraft Developmentが正常にインストールできていれば、左側のリストに「Minecraft」という項目があるはずですので、それをクリックしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/339002/eda64557-3d49-df4c-a0c5-8ce93c69a3eb.png)
ここから、Spigot Pluginにチェックを入れて次へを押していきます。
##ビルドの設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/339002/748aa764-6ca5-0e51-92d0-4629fc73358b.png)
この画面ではビルドの設定を行っていきます。
###グループID
グループIDは、プラグインが所属するグループを指定します。
グループは作者、機能などで分けられますが、他の人とかぶらなければ何でもいいです。
ここでは著者のGitHubのドメイン名の逆順からcom.github.rona_tomboとしています。
注意として使える文字は、半角英数字とピリオド`.`、アンダーバー`_`だけです。
###アーティファクトID
アーティファクトIDはプロジェクトを区別するIDです。
通常はプラグイン名にしておけば大丈夫です。
###バージョン
なんでもいいです
###Gradle
右下にある選択メニューはデフォルトのMavenからGradleに変更しています。
どちらでもプラグインは作れるのですが著者の趣味です。
>MavenとGradleの違い
>どちらも依存性解決ツールといい、他の人が作ったプログラムを利用する場合にそのバージョンを管理したりできるものです。
>MavenはXMLという人間には読みにくいもので設定するので著者は苦手です。
>またGradleのほうができることは多いです。

##Spigot Settings
![image.png](https://qiita-image-store.s3.amazonaws.com/0/339002/3c72ad20-0dfa-f2a8-e5ee-697156b7aae2.png)
ここではプラグインそのものの設定を行っていきます。
###Plugin Name
プラグインの名前を設定します。半角英数字のみ使用可です。
###プラグイン・バージョン
なんでもいいです
###Main Class Name
プラグインのメインになるクラス(後述)を指定します。
わからなければ初期設定のままで大丈夫です。
###Minecraft Version
対象とするMinecraftのバージョンを指定します。
現在の最新バージョンは1.13.2ですがまだ不安定な気がしているのでここでは1.12.2で開発します。

Optional Setting以下は設定しなくても動きますが、配布、公開する場合は設定しておいたほうがいいです。
###説明
文字通りプラグインの説明です。半角英数字のみ使用可です。
###Authors
作者の名前です。複数いる場合は半角カンマ`,`で区切ります。
###WebSite
プラグインが公開されているURLなどを指定します。
###LogPrefox
ログの最初につくプレフィックスを指定します。空の場合はプラグイン名が使われます。
###Load Before
プラグイン名を指定します。ここで指定したプラグインよりも先にこのプラグインは読み込まれます。
複数指定する場合は半角カンマ`,`で区切ります。
###Depend
このプラグインが依存するプラグインを指定します。
ここで指定したプラグインはこのプラグインより先に読み込まれます。
ここで指定したプラグインが導入されていない場合サーバー起動時にエラーが出ます。
###Soft Depend
主な機能はDependと同じです。
ただしここで指定したプラグインが導入されていなくてもエラーは出ないという違いがあります。
###Load at
プラグインが読み込まれるタイミングを設定します。
Post Worldで全ワールドの読み込みが終わった時、
Startupでサーバー起動時(ワールド読み込み前)です。

##プロジェクト設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/339002/409bf891-93aa-334f-f5a7-14c1a9378f87.png)
プロジェクト名だけ設定しておけば後はそのままで大丈夫です。

ここで完了を押すと以下のような画面が出ると思います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/339002/8fee2691-f6cf-008c-174c-2d6b79139b04.png)

そのままOKで大丈夫です。

#コードを書く
![image.png](https://qiita-image-store.s3.amazonaws.com/0/339002/f1eff9bd-c2b6-2446-e3a1-dfcc6060d561.png)
お待ちかね、ここが今からプログラムを書いていく場所です。
実はコードを変更しなくても、Minecraft Developが既に最低限必要なコードを書いてくれています。
つまり…**すでにプラグインとして機能する**のです(もちろん何も機能を書いていないので何もしないプラグインですが)。

それではここでJavaの基礎の基礎を勉強しておきます。

```java:Tutorial.java
package com.github.rona_tombo.tutorial;
```
これはTutorialというクラス(後述)がcom.github.rona_tombo.tutorialというパッケージ(クラスの集まり)に所属することを示しています。

```java:Tutorial.java
import org.bukkit.plugin.java.JavaPlugin;
```

`org.bukkit.plugin.java.JavaPlugin`というクラスを使いますよという宣言です。
このようにパッケージ名はインポートなどに使います。

```java:Tutorial.java
public final class Tutorial extends JavaPlugin{
}
```

先程から登場していましたクラスの宣言です。
クラスとは、Javaの基本となる機能の単位です。
クラスはメソッド(後述)やフィールド(後述)といったメンバを持つことができます。
`public`はどこからでもアクセスできますよ、finalは「継承」(後述)できないクラスですよ、Tutorialは名前、extendsはJavaPluginというクラスを継承していますよ、ということを表しています。

継承とは、あるクラスを元にしたクラスを作り、クラスに機能を追加したり機能を書き換えたりすることです。
(詳しく説明すると場所をとるのでまた今度の機会に)

```java:Tutorial.java

	@Override
	public void onEnable(){
		// Plugin startup logic

	}

	@Override
	public void onDisable(){
		// Plugin shutdown logic
	}
```

これはTutorialクラスの中にありますね。
これがメソッドです。
メソッドとは、クラスの中で定義する、実際に処理を行う部分となります。
この2つのメソッドは、Tutorialクラスの継承元であるJavaPluginで定義されていますが、`@Override`をつけることでその処理を書き換えています。
publicはどこからでも使えるよ、voidは処理が終わった後に結果を返さないよ、という意味です。
各メソッドの最後に()がついていますが、ここに引数といって処理に使う情報を渡す場合もあります。

それではここで実際にコードをいじっていきましょうか。
onEnableとonDisableを以下のように変更してください。

```java:Tutorial.java
    @Override
    public void onEnable(){
        // Plugin startup logic
        getLogger().info("プラグインが有効になったよ!");
    }

    @Override
    public void onDisable(){
        // Plugin shutdown logic
        getLogger().info("プラグインが無効になったよ!");
    }
```

getLoggerはコンソールにログを残すためのメソッドです。
普通メソッドは、クラスをインスタンス化(そういうもんだと思って覚えたほうが楽です)したインスタンス変数を使って、
`インスタンス変数名.メソッド名(引数);`
と使うのですが、自分のクラスまたは自分の親クラスで定義されているメソッドはインスタンス化なしにメソッド名だけで呼び出せます。
メソッドの返り値(処理した後に帰ってくる値)は変数に詰めたり、そこからさらにメソッドをつなげたりすることができます。
ここではプラグイン読み込み時に「プラグインが有効になったよ!」、無効化時に「プラグインが無効になったよ！」とログを残しています。

ここまでできたら実際に実行してみましょう。
ここでWindowsの方は一つやっておくことがあります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/339002/9c894bbe-c7c4-ff80-c9c0-bab05da9e1cf.png)
左側のツリーから`build.gradle`をダブルクリックして開いてください。
`targetCompibility`の下辺りに以下を追記してください。

```groovy:build.gradle
tasks.withType(AbstractCompile)*.options*.encoding = tasks.withType(GroovyCompile)*.groovyOptions*.encoding = 'UTF-8'
```

できましたら、ウィンドウ右上あたりにある三角をクリックしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/339002/23cb45f1-7e62-b17d-d94e-7bcb08120117.png)

これでプラグインのビルドが始まります。
`BUILD SUCCESSFUL`と表示されたらビルドが完了しました。
デフォルトのままであれば、`C:\Users\ユーザー名\IDEA Projects\プロジェクト名\build\lib\`に`プラグイン名-バージョン.jar`というjarファイルができていると思いますので、1.12.2のSpigotのpluginsフォルダに入れてSpigotを起動してみてください。
また、/stopでサーバーを停止してみてください。
コンソールにログが表示されていれば成功です。

#まとめ
Javaの基礎知識はさらっとですがわかったでしょうか。
今回はコンソールにログ表示という非常に簡単なことしかやっていませんが、次回からはコマンドに反応、ブロックを殴ったときに反応、など
いろいろやっていきたいと思っています。
最後までお読みいただきありがとうございました。
今後もこの連載をよろしくお願いします。