Minecraftの他Modのアドオンを作る方法 【IntelliJ IDEA向け】

#はじめに
この度開発環境をEclipseからIntelliJ IDEAに移行しました。
**なにこれめっちゃ使いやすいやん！**
ってのが正直な感想です。いいですねこれ！
しかし環境を引き継ぐ上でいろいろと問題が起こりました。
今回は他Modのソースを経由するアドオンを作る過程で
ごちゃごちゃしたので、方法などをまとめておきます。

この記事はMinecraftのModdingをある程度自力で行える方向けの記事になっています。
そのため、Moddingの環境構築云々はこの記事では解説しないため、
その他の情報を参考に自力で環境構築をお願いします。

09/25追記
この環境は現時点での現行最新版である1.14.xではなく,
**1.7.10**で開発しているので、かなり内容が異なるかと思います。
ご指摘がありましたが、この環境では同梱されているGradleを使用していますのでimplementationは使えませんでした。
因みにバージョンはプロパティを見たところ2.0らしいです。めちゃくちゃ古いですね！
あと仮に非推奨だったとしてもとりあえず動くので自分はいいと思ってます。

#開発環境
今回は以下の環境でやっていきます。

- Windows 10
- JDK 8u161
- Minecraft 1.7.10
- MinecraftForge 10.13.4.1614
- Eclipse 4.6 Neon から IntelliJ IDEA 2019.1.3 へ

#実際にやっていきましょう
##build.gradleを開く
説明文を消して見やすくしましたが、最初の時点では大体こんな感じになっていると思います。
<img width="700" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463558/7b22c6b3-0e41-31eb-39c8-8bb2c1904979.png">

この中に、 **dependencies** という項目があるはずです。
この項目では、開発及びビルド時に必要なライブラリを指定できます。
下記のように追記してください。

```gradle

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
}
```

これで、 build.gradle と同じディレクトリの libs というフォルダ内にある、 .jar の拡張子のファイルを
ライブラリとしてコンパイル時に使用できるようになります。libs のフォルダ名はなんでも大丈夫です。
このように同期化が完了すれば成功です。
![e4d0b5e9721d0efa6f1c97646c2f6741.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463558/811a2c41-a5a6-6508-553c-da4c74d40d7f.png)

##BuildCraftのアドオンを作ってみよう！
有名な工業ModであるBuildCraftのアドオンを作っていきます。
今回は、レシピをいじるなどの簡単なものですが、やり方次第では
某木エンジンみたいなこともできるので、皆さん頑張ってください。

###フォルダにBuildCraftのdev版を入れる
開発用バージョンが公式サイトなどで配布されているのでダウンロードしてきました。
これを先程指定した libs の中に入れます。
![ffde3d839de117e272843f1cd560effd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463558/6fbda3e2-4ca2-fae8-8bda-193ffecd2df0.png)

少し経てば、IntelliJ IDEAの方で自動で同期化してくれるはずです。
いけましたね。
![8f77c6b5af8b0dd4dfa19e961ed28e7b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463558/de83f31c-cf8b-9690-9b7f-709df490426f.png)

この状態で起動すれば、MinecraftにModとしてBuildCraftが認識してくれます。
以下のように認識してくれていれば成功です！
<img width="700" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463558/f5656208-6046-ee4b-6001-a5bf3e08d59b.png">

###実際にレシピを追加する
サンプルとして最初からあるExampleModのソースを流用します。
今回は、以下のような感じになりました。

```java
package com.example.examplemod;

@Mod(modid = ExampleMod.MODID, version = ExampleMod.VERSION, dependencies = "required-after:BuildCraft|Core")
public class ExampleMod
{
    static final String MODID = "CheapestQuarry";
    static final String VERSION = "1.0";
    
    @EventHandler
    public void PostInit(FMLPostInitializationEvent event)
    {
        if(Loader.isModLoaded("BuildCraft|Builders"))
        {
            GameRegistry.addShapedRecipe(new ItemStack(BuildCraftBuilders.quarryBlock, 1, 0),
                    "XXX", "XPX", "XXX", 'X', Blocks.cobblestone, 'P', Items.wheat_seeds);
        }
    }
}
```
FMLPostInitializeEventは、他Modなどの初期化処理も終わったタイミングで処理を行いたい時に使います。なので今回はこいつを使います。但し前提となるMod側のソースを見て事前初期化処理で全て行われている場合は初期化処理の段階(FMLInitializeEvent)でも動く場合があります。個人的には全部事後初期化処理でやった方が安全だと思います。


レシピ追加の構文は基本的なものと同じです。このコードでは、
クラフト結果のアイテムとして、BuildCraftの露天掘り機を指定しています。
ただし、このModがBuildCraft以前に読み込まれるとエラーが出て
Minecraftが起動しなくなるので、必ずModアノテーションの後に
 **dependencies = "required-after:BuildCraft|Core"**
と入力しておきましょう。この場合では、
**BuildCraftのコアModが読み込まれた後にこのModを読み込む**
といった感じです。とりあえずはこれで完成なので起動してみましょう！

###起動してプレイしてみる

読み込まれていますね。何やら説明が嫌な予感...。
![cb138082ee8d111f6d90424ee0d36064.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463558/5c3f03c9-e012-f0de-c323-ae85f0ee5f02.png)

なんということでしょう。開始数分で作れる程のコストの安いレシピが追加されたではありませんか！
これは世界が沈むまで時間の問題ですね....。

ということでレシピの追加に成功です！
<img width="600" alt="quarryissocheap" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463558/f9c2224d-d222-9aec-a30e-1c4323990236.png">

#終わりに
正直Eclipseで開発していたときと殆ど同じように実装できました。
むしろ当方の環境では手動で追加しないといけなかったので、
いろいろと自動でできるようになって本当に助かっています。
こんな感じでのほほぉ～んともぢんぐをこれからもやっていこうと思いました。

**それでは皆様良きもぢんぐライフを！**