(WIP)Minecraft Mod をForgeで作成(導入)

# ⛩ 開発環境の概要
ノリと勢いだけで書いているので足りないものがあったり、続くのかどうかも怪しいですが、何かの参考になれば幸いです。
## 🌸 環境
・Minecraft 1.12.2 (現在最新)
・Minecraft forge 1.12.2 (13.20.0.2282) (現在最新)
・Ecripse (Pleiades Ecripse4.7 Oxygen) (新しいっぽいので)
・Windows 10
・Java 8
:white_flower:2017/4/15：
・Forgeを2214から2282へちょっぴりアップ(影響なし)
:white_flower:2017/11/30：
・Ecripseを4.6から4.7へアップ(影響なし)
・Minecraftを1.11.2から1.12.2へアップ(Forgeを12へアップが必要)
・それに伴いForgeを1.12.2-14.23.1.2555へアップ(影響なし)


# ⛩ 開発環境のセットアップ

## 🌸 Eclipseのインストール

###🏮 Eclipseをダウンロード
http://mergedoc.osdn.jp/
からEclipse 4.7 Oxygen Pleiades All in Oneをクリック
Javaの列から自分の環境(32/64)(できればFullがJava開発環境も含まれているのでトラブル少なそう)のDownloadをクリック(1.4GBほどあるので注意)

ダウンロードしたpleiades-4.7.1-java-win-64bit-jre_20171019を展開(約1.7GB)

展開されたフォルダのpleiades\eclipse\eclipse.exeを実行して起動できるか確認(Ecripseランチャーが起動してワークスペースを聞かれるので、とりあえずキャンセル)(※初回起動は時間がかかる)

## 🌸 MDKのインストールとセットアップ
###🏮 minecraft forgeの開発キットをダウンロード
https://files.minecraftforge.net/
最初から最新バージョンのページが表示されているので、
Download LatestからMdkをクリックしてダウンロード(5秒後に出るSKIPをクリック)
（右のDownload Recommendedは安定バージョンなので、開発版によるバグを避けたい場合はこちらを選ぶといいと思います）

###🏮 ファイルの解凍
デスクトップなどに、適当なフォルダを作り、
ダウンロードしたforge-1.12.2-14.23.1.2556-mdk.zipをそこで展開。(ファイルがその階層にばらまかれるので注意)

###🏮 セットアップ
コマンドプロンプト(cmd.exe)を管理者権限で開き、展開したフォルダへ移動。
(コマンドプロンプトを管理権限で開く方法：コルタナやアプリの検索ウィンドウで「cmd」で検索して、右クリックから管理者として実行で起動できる)

`gradlew setupDecompWorkspace eclipse`:arrow_lower_left:

と入力して環境に必要なファイルを構築
数分後、「BUILD SUCCESSFUL」と出れば成功

「BUILD FAILED」が出た場合は
`gradlew --refresh-dependencies`:arrow_lower_left:
を実行して依存ファイルの再作成お行い、もう一度試してみる。

###🏮 Eclipseでワークスペースを開く
Eclipseを起動して(pleiades\eclipse\eclipse.exe)、
ワークスペースの参照からmdkを展開したフォルダに作成されたecripseフォルダを指定して起動で開く。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/62435/add46769-77a5-935f-0801-a6879f493274.png)
パッケージエクスプローラーにMDKExampleというサンプルMODが入っています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/62435/5ce0ba0d-e424-11e6-4380-3337b5f9c271.png)


###🏮 サンプルのMDKExampleを実行するためのJavaランタイム環境の設定
パッケージエクスプローラーにある、`MDKExample`を選択して、
アイコンメニューの実行ボタン(▶)の▼から、実行の構成を選択。
![image](https://qiita-image-store.s3.amazonaws.com/0/62435/abadaea1-3649-b99b-255e-8e3e4a7c30b8.png)

実行の構成ウィンドウが表示されるので、左のJavaアプリケーションからClientを選択(クライアントデバッグ用の構成)(※2つあるけど、一番上だけで大丈夫っぽい？心配なら２つとも同じ設定にします。)
![image](https://qiita-image-store.s3.amazonaws.com/0/62435/029c6128-bb49-5cbc-daab-963fa1aa021b.png)

右に表示されたタブからJREを選択して、ランタイムJREの設定を、[プロジェクトの実行環境'JavaSE-1.6'(P)(java6)]から実行環境(X):に変更して、`CDC-1.1/Foundation-1.1(java8)`を選択(java8ならたぶん何でも大丈夫)
![image](https://qiita-image-store.s3.amazonaws.com/0/62435/55fadc6a-af03-615c-586c-db73602b3491.png)

変更したら右下の[適用(V)]で設定を保存しておく。

同様に、Javaアプリケーション内の`Server`も同じようにJREの設定をする。

設定が終わったら[閉じる]で閉じてOK。

## 🌸 MDKサンプルの実行(クライアント)

###🏮 サンプルのMDKExampleを実行してみる

アイコンメニューの実行ボタン(▶)の▼から、1Clientを実行。
（これでクライアント側のテストを実行することができます）
:exclamation:パッケージエクスプローラーのプロジェクトを選択していないと怒られるので、選択してから実行してください。
![image](https://qiita-image-store.s3.amazonaws.com/0/62435/ca0d679c-19ff-9805-1571-e8ba1e17722e.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/62435/a272b8e3-39b5-8c7c-2d8a-eb64da970d65.png)

スタート画面が出たところ。[Mods]ボタンが出現していて、左下にForgeやMinecraftのバージョンなどが表示されていれば成功
![image.png](https://qiita-image-store.s3.amazonaws.com/0/62435/76a42781-45da-7fe1-6878-f7b36c0baa1a.png)


[Mods]ボタンをクリックするとExample Modが読み込まれているのがわかる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/62435/6b94f035-0985-654d-975b-e6e698cea6b3.png)


###🏮 このサンプルMODのやっていること
Eclipseの左下にあるコンソールタブを少し上にスクロールしてみると、このような一文が出力されていますが、実はやっていることはこれだけで、MOD初期化時にコンソールに文字を表示するいわゆるHello Worldのようなものです。
```
[11:29:00] [main/INFO] [STDOUT]: [com.example.examplemod.ExampleMod:init:18]: DIRT BLOCK >> tile.dirt
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/62435/9c2c3a2a-f9f4-d21e-0096-9ec776f588fe.png)

ソースは、パッケージエクスプローラーからMDKExampleをたどって、`src/main/java`の`com.example.examplemoc`パッケージに入っている`ExampleMod.java`になります。
ダブルクリックして開いてみると右側にソースが表示され、System.out.println(～と文字を表示しているのがわかります。）(※土ブロックのローカライズしていない名前を表示しています)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/62435/f49da4ca-0334-7abc-fbc6-6ed1dd742828.png)

こちらを好きに変えてやれば、コンソールへ好きな文字を出力するMODができたことになります。(※編集するとき、起動しているClientは一度終了しておく)
![image](https://qiita-image-store.s3.amazonaws.com/0/62435/e636e773-93cc-8fdf-8dbc-a3382f387580.png)
アイコンメニューの実行ボタン(▶)の▼から、1Clientを実行
したところ。ちゃんと表示されていますね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/62435/18b68199-f6be-34a0-f7db-36dbeb0f7c2f.png)

## 🌸 MDKサンプルの実行(サーバー)
###🏮 サーバーの初回起動
アイコンメニューの実行ボタン(▶)の▼から、2Serverを実行
![image.png](https://qiita-image-store.s3.amazonaws.com/0/62435/d9706480-cfb8-d09f-6d7b-711e914b2e81.png)
すると、何やらコンソールにメッセージが出てサーバーが終了します。
これはEURAというソフトウェア使用許諾契約に同意しないと起動しないよーと言ってるので、
https://account.mojang.com/documents/minecraft_eula
こちらの同意書を読んで、同意できるばあい。EURAの設定を行います。

###🏮 EURAの同意設定
パッケージエクスプローラーから`run`フォルダに初回起動時に生成されたeura.txtがあるのでダブルクリックで開きます。
![image](https://qiita-image-store.s3.amazonaws.com/0/62435/a7dd4761-d33b-f59c-9f65-a4604cd49642.png)

初期では`eula=false`となっているので、これをtrueにして保存(ctrl+s)します。
![image](https://qiita-image-store.s3.amazonaws.com/0/62435/d11e1e81-5c19-4e5e-6e9a-0eb936b817ea.png)

###🏮 サーバーの起動
アイコンメニューの実行ボタン(▶)の▼から、1Serverを実行
(※最近実行された順に並んでいるだけなので数字は気にしなくてOKです)

めでたくサーバーが実行されました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/62435/042c268f-ae6c-2f91-c2bc-7cb35b7c2dc4.png)

サーバーログの上のほうを見てみると、ちゃんとサーバーでもMODが動作しているのを確認できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/62435/7277b1c2-eb9c-c52c-1d6b-4751a5f99710.png)

いくつかの(指定されたファイルが見つかりません。)と出る場合はサーバー管理用の(ホワイトリス用のファイルとか)が見つからないので生成しましたよ。ってことなので次回起動からは出なくなると思います。

###🏮 サーバーへクライアントから接続

いま起動したサーバーが動いている状態でEclipseからクライアントを起動して、接続できるか試してみます。

[Multiplayer]から[Add Server]して、Server Addressに`127.0.0.1`を設定して[Done]。

登録されたサーバーに緑色のチェックがついて接続可能になっていればOKです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/62435/47840627-08a2-0c3e-28d1-11d32a02d6f6.png)

ただ、このままだと`Faild to login: Invalid session (Try restarting your game)`と出てサーバに入れません。

これはサーバーの設定でログインしていないユーザーがサーバーに入ることを許していないためで、開発時のクライアントはログインしていないユーザーとして接続されます。

サーバーの設定を変更するために、サーバーログの下のコマンド欄に、
`stop`:arrow_lower_left:
と入力してサーバーを終了します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/62435/272be30c-50fe-fcf7-a1eb-34fe91356109.png)

###🏮 サーバーの設定(未認証ユーザーの許可)
パッケージエクスプローラーの`run`にサーバーの設定ファイルがいくつか生成されていますが、その中の`server.properties`をダブルクリックして開きます。
![image](https://qiita-image-store.s3.amazonaws.com/0/62435/5e07870c-4da1-602e-ae0e-004c440d4fd3.png)

25行目あたりの`online-mode=true`が公式サーバーに接続してユーザー認証を行うか？の設定なので、これを`false`に変更します。
※この設定は開発サーバーのみで、本番サーバーではやらないでください(無法地帯になります)

保存したら、サーバーをもう一度立ち上げて、クライアントから接続してみてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/62435/2ded42a7-ee4b-3efb-134b-6be5dcf5fdb2.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/62435/c8207806-ec63-cecd-3688-a466dbe3ddaa.png)
ばっちり入れましたね。

サーバー側には`Player 192`という名前で入っていることがわかります。

この名前はクライアントを起動したときに毎回新しく設定されるので、個人を特定して許可するようなMODを作る場合は起動ごとに変わるのでちょっと大変になりますが、複数のアカウントを持たずに許可系のテストができるともいえるので、工夫して作成していけると思います。

# ⛩ 作成したMODの配布ファイルを作成

コマンドプロンプトからMDKを展開したフォルダへ移動し、
`gradlew build`:arrow_lower_left:
と実行することでパッケージが作成されます。（`BUILD SUCCESSFUL`と出ればOK）
「MDKフォルダ\build\libs」に２つのjarファイルができています。
modid-1.0.jar
modid-1.0-sources.jar
配布する場合は-sourcesが含まれていないものを配布します。

つまり、このjarファイルをmodsフォルダに入れればインストールできるということですね！

# ⛩ オリジナルのMODを作成

つづけ... ？