Minecraft 1.12.2 Forge Modの作成 その2 【mcmod.infoの編集と無機能アイテムの追加】

# はじめに
軽く、IntelliJ IDEAの使い方、Javaの書き方を勉強してきました。
早速、Modを作っていきたいと思います。


MODの作成において主に以下のサイトを参考にさせていただきます。
[チュートリアル一覧](https://mcmodding.jp/modding/index.php/%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E4%B8%80%E8%A6%A7)

# 💻開発環境
- Windows 10
- JDK 8u211
- Minecraft 1.12.2
- Minecraft Forge 1.12.2 (14.23.5.2838)
- IntelliJ IDEA 2019.1.3

# Mod情報
後でもいいけど、最初にこれをやっておきたかった。
`src/main/resources/mcmod.info`というファイルがあります。
こいつにMinecraftのMod Listに表示してほしい情報を書き込みます。

[mcmod.infoの設定](https://mcmodding.jp/modding/index.php/Mcmod.info%E3%81%AE%E8%A8%AD%E5%AE%9A)を参考に書いてみます。
こんな感じ。

```json:mcmod.info
[
  {
    "modid": "biwako_mod",
    "name": "Biwako Mod",
    "description": "Biwako is the largest lake in Japan.",
    "version": "${version}",
    "mcversion": "${mcversion}",
    "url": "https://github.com/Hiroya-W/biwakoMC",
    "updateUrl": "",
    "authorList": ["Hiroya_W"],
    "credits": "",
    "logoFile": "assets/biwako_mod/logo.png",
    "screenshots": [],
    "dependencies": ["mod_MinecraftForge"]
  }
]
```

`src/main/resources`フォルダを作って`logo.png`を配置。
`Biwako_mod.java`の21行目、22行目も書き換えておく。

```java:Biwako_mod.java
public static final String MOD_NAME = "Biwako Mod";
public static final String VERSION = "1.0.1";
```

うん、まあこんな感じかな。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/3e0bede1-4eee-3e34-381f-c4586861dfdf.png)

# アイテムの追加
## 琵琶湖バーガー(食べ物)を登録
ただし、まだ食べられる状態にはしません。追加だけ。

- アイテム保持用の内部クラス

ここにメンバーを書いていくのだが、後々Javaクラスに分けて書くことになると思う。
とりあえず、書く。

```java
    @GameRegistry.ObjectHolder(MOD_ID)
    public static class Items {
        public static final Item biwakoBurger = null;    /** 琵琶湖バーガー */
    }
```

- アイテム登録用イベント

`addItems`メソッドがこの部分に当たります。
また、ブロック追加は`addBlocks`メソッドに分けてソースコードを読みやすくする(のだと思います)。

今まではItem Classに`setUnlocalizedName`というメソッドが用意されていたのだが、名前が`setTranslationKey`に変更されたらしい。
`setUnlocalizedName`なんて無いんだけど！？と言って泣かなくても大丈夫です。
**僕は泣きました**

[Internationalization and localization](https://mcforge.readthedocs.io/en/latest/concepts/internationalization/#usage-with-blocks-and-items)より引用。
>As of July 14th 2018, the term “unlocalized name” has been replaced by “translation key” in MCP.

- モデル登録用イベント

`registerModels`メソッドがこの部分に当たります。

他クラスは用意されていたが、このイベントに関しては用意されていなかったので自分で書いた。
モデル登録用イベントもアイテム登録用イベントと同様に`ObjectRegistryHandler`クラス内に作成します。

```java
    @Mod.EventBusSubscriber
    public static class ObjectRegistryHandler {
        @SubscribeEvent
        public static void addItems(RegistryEvent.Register<Item> event) {
            event.getRegistry().registerAll(
                    new Item()
                            .setRegistryName(MOD_ID, "biwakoBurger")
                            .setCreativeTab(CreativeTabs.FOOD)
                            .setTranslationKey("biwakoBurger")
            );
        }

        @SubscribeEvent
        public static void addBlocks(RegistryEvent.Register<Block> event) {

        }

        @SubscribeEvent
        public static void registerModels(ModelRegistryEvent event) {
            ModelLoader.setCustomModelResourceLocation(Items.biwakoBurger, 0, new ModelResourceLocation(Items.biwakoBurger.getRegistryName(), "inventory"));
        }
    }
```

ここまでのソースコードぺたり。
<details><summary>Biwako_mod.java</summary><div>

```java
package jp.yuyu.biwako_mod;

import net.minecraft.block.Block;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.registry.GameRegistry;

@Mod(
        modid = Biwako_mod.MOD_ID,
        name = Biwako_mod.MOD_NAME,
        version = Biwako_mod.VERSION
)
public class Biwako_mod {

    public static final String MOD_ID = "biwako_mod";
    public static final String MOD_NAME = "Biwako Mod";
    public static final String VERSION = "1.0.1";

    @Mod.Instance(MOD_ID)
    public static Biwako_mod INSTANCE;

    @Mod.EventHandler
    public void preinit(FMLPreInitializationEvent event) {

    }

    @Mod.EventHandler
    public void init(FMLInitializationEvent event) {

    }

    @Mod.EventHandler
    public void postinit(FMLPostInitializationEvent event) {

    }

    @GameRegistry.ObjectHolder(MOD_ID)
    public static class Blocks {

    }

    /**
     * アイテム保持用内部クラス
     */
    @GameRegistry.ObjectHolder(MOD_ID)
    public static class Items {
        public static final Item biwakoBurger = null;    /** 琵琶湖バーガー */

    }

    /**
     * アイテム登録用イベント
     */
    @Mod.EventBusSubscriber
    public static class ObjectRegistryHandler {
        @SubscribeEvent
        public static void addItems(RegistryEvent.Register<Item> event) {
            event.getRegistry().registerAll(
                    new Item()
                            .setRegistryName(MOD_ID, "biwakoburger")
                            .setCreativeTab(CreativeTabs.FOOD)
                            .setTranslationKey("biwakoburger")
            );
        }

        @SubscribeEvent
        public static void addBlocks(RegistryEvent.Register<Block> event) {

        }

        /**
         * モデル登録用イベント
         */
        @SubscribeEvent
        public static void registerModels(ModelRegistryEvent event) {
            ModelLoader.setCustomModelResourceLocation(Items.biwakoBurger, 0, new ModelResourceLocation(Items.biwakoBurger.getRegistryName(), "inventory"));

        }
    }
    
}
```

</div></details>

### Minecraftを起動
ちゃんと増えてます！
![2019-07-16_22.05.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/b1f4525f-ff29-b112-7088-c6476a99973d.png)

## テクスチャを適用
### jsonファイルを書く
テクスチャはjsonファイルで指定するようです。
jsonファイルは`src/main/resources/assets/biwako_mod/models/item`フォルダに
`setRegistryNameで登録した名前.json`という形で配置します。

私の場合は`biwakoburger.json`を配置します。
ほとんどの場合、変えるのは`layer0`の値だけで、`MOD_ID:items/TEXTURE_FILE_NAME`という形で書きます。

`TEXTURE_FILE_NAME`は`biwakoburger.png`という画像を用意したのであれば、
**拡張子以外の部分**の`biwakoburger`となります。

```json:biwakoburger.json
{
  "parent": "item/generated",
  "textures": {
    "layer0": "biwako_mod:items/biwakoburger"
  }
}
```

### テクスチャファイルを置く
テクスチャファイルは`src/main/resources/assets/biwako_mod/textures/items`フォルダに
jsonファイルを書いたときのファイル名で置きます。

私の場合は`biwakoburger.png`を配置します。

### Minecraftを起動
テクスチャが適用されていました！
![2019-07-16_22.31.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/3ee70619-afe8-3d10-3380-6de02add5daf.png)

### テクスチャが指定されないよ
左下の実行ログを見てみると、エラーが出ているのでなぜ出来ないのかがわかると思います。
例としてログを張り付けておきます。

この例では、jsonファイルに
`biwako_mod:items/biwakoburger`と書くところを
`biwako_mod:items/biwakoburge`と末尾の`r`を忘れてしまい、ファイルが見つからないということがわかります。

<details><summary>実行ログ(runClient)</summary><div>

```
[22:05:18] [Client thread/ERROR] [FML.TEXTURE_ERRORS]: +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
[22:05:18] [Client thread/ERROR] [FML.TEXTURE_ERRORS]: The following texture errors were found.
[22:05:18] [Client thread/ERROR] [FML.TEXTURE_ERRORS]: ==================================================
[22:05:18] [Client thread/ERROR] [FML.TEXTURE_ERRORS]:   DOMAIN biwako_mod
[22:05:18] [Client thread/ERROR] [FML.TEXTURE_ERRORS]: --------------------------------------------------
[22:05:18] [Client thread/ERROR] [FML.TEXTURE_ERRORS]:   domain biwako_mod is missing 1 texture
[22:05:18] [Client thread/ERROR] [FML.TEXTURE_ERRORS]:     domain biwako_mod has 1 location:
[22:05:18] [Client thread/ERROR] [FML.TEXTURE_ERRORS]:       unknown resourcepack type net.minecraft.client.resources.LegacyV2Adapter : FMLFileResourcePack:Biwako Mod
[22:05:18] [Client thread/ERROR] [FML.TEXTURE_ERRORS]: -------------------------
[22:05:18] [Client thread/ERROR] [FML.TEXTURE_ERRORS]:     The missing resources for domain biwako_mod are:
[22:05:18] [Client thread/ERROR] [FML.TEXTURE_ERRORS]:       textures/items/biwakoburge.png
[22:05:18] [Client thread/ERROR] [FML.TEXTURE_ERRORS]: -------------------------
[22:05:18] [Client thread/ERROR] [FML.TEXTURE_ERRORS]:     No other errors exist for domain biwako_mod
[22:05:18] [Client thread/ERROR] [FML.TEXTURE_ERRORS]: ==================================================
[22:05:18] [Client thread/ERROR] [FML.TEXTURE_ERRORS]: +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
```
</div></details>

## 名前の指定
Minecraft用の翻訳ファイル(?)を配置します。
日本語用のファイル名は`ja_JP.lang`、英語(US)は`en_US.lang`とするルールがあります。
IntelliJ IDEAを使用している場合はデフォルトでファイルエンコードに`utf-8`が選択されていますが、
他のエンコードが指定されていれば、文字化けするようなので注意。

これらは`src/main/resources/assets/biwako_mod/lang`フォルダに置きます。
中身は以下の通り。

```en_US.lang
# English Language File
item.biwakoburger.name=Biwako Burger
```

```ja_JP.lang
# 日本語言語ファイル
item.biwakoburger.name=琵琶湖バーガー
```

English(US)
![2019-07-16_22.46.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/065c9cdd-f4e8-0085-1e37-6f6a590d385d.png)

日本語
![2019-07-16_22.46.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/d30bce2c-df02-978e-8a6b-b5cebcc5ef3d.png)


<details><summary>エンコードにShift-JISを指定した場合に文字化けする</summary><div>
![2019-07-16_22.43.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/0326ccbb-3f68-70c2-60aa-b3f7984fa1bf.png)

</div></details>

できましたー！！

## ここまでのフォルダ階層
こんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/9a8643df-9411-1a29-1d6c-a98fd2551bae.png)

# おわりに
2回目で諦めようかと思ったくらい**できませんでした**
仕様変更がたびたび行われているのだと思うのですが、同じMinecraft 1.12.2でもForgeのバージョンが異なれば、
ソースコードの書き方が違っていて、過去の素晴らしい記事が全く参考になりません...。ﾅﾝﾃｺｯﾀｲ
(今までの書き方もできるハズだけどね)

モデル登録用イベントなんて、どこに書けばいいんだ...みたいな状態で、
`ObjectRegistryHandler`クラス内に書くってことに気が付くのに1日使いました...。
**テクスチャが適用されなくて泣きそうでした...。**
(気づいた時には、当たり前やん。ってなったけど...。)

[アイテムの追加(1.12.2)](https://www.tntmodders.com/tutorial/item-1122/)
こちらのサイトも参考にさせていただいたのですが、コメント欄で
>最新のforgeのバージョン(14.23.3.2655)だとen_US.lang, ja_JP.langでは読み込まず、en_us.lang,ja_jp.langに変更しないといけないみたいですね…

と書かれてありました。が、結局現在はまた`en_US.lang`、`ja_JP.lang`じゃないと読み込まれないみたいですし...。

今`1.14.2`出てるのに2年前の`1.12.2`で開発するのかよ！って需要もないやろなって思っていたのですが、
こんな感じならちゃんと記事として成り立っていそうな気がします...。
誰かの参考になれば嬉しいですね。

なので、次も頑張ります。

---
次はツールを追加したいです。
[Minecraft 1.12.2 Forge Modの作成 その1 【開発環境の準備 IntelliJ IDEA】](https://qiita.com/Hiroya_W/items/7ad9bad0387ef3688d1e)
[Minecraft 1.12.2 Forge Modの作成 その2 【mcmod.infoの編集と無機能アイテムの追加】](https://qiita.com/Hiroya_W/items/9c7ec637c949a48371b6)
[Minecraft 1.12.2 Forge Modの作成 その3 【剣の追加とレシピ登録,クラフト後に返ってくるアイテムの設定】](https://qiita.com/Hiroya_W/items/5eea1538a75e79f88c58)
[Minecraft 1.12.2 Forge Modの作成 その4 【ブロックの追加】](https://qiita.com/Hiroya_W/items/eeae44064a5c2b5c4377)

2019/07/16 初版
2019/07/17 表記ゆれの修正
2019/08/08 目次の追加