[Java]MinecraftのModを作成しよう 1.16.1【アイテムの追加】

（この記事は一連の解説記事の一つになります）

先頭記事：[入門編](https://qiita.com/koteko/items/8d32c8819e3f9e6a333a)
前の記事：[基本ファイル](https://qiita.com/koteko/items/6560128ebd320f2727ab)
次の記事：[ブロックの追加](https://qiita.com/koteko/items/fb057afa493fd2d648fc)

# アイテムの追加
まずは基本となるアイテムの追加を行っていきます。[1.14.4のとき](https://qiita.com/koteko/items/76910dbf9eb126bdfdf9)と少し書き方を変えました(バージョンアップによって実装の方法が変わったという意味ではないです)。

## アイテムの登録

```
\src\main\java\jp\koteko\liveinwater\
   ├ item
   │   └ Items.java
   └ LiveInWater.java
```

```java:Items.java
package jp.koteko.liveinwater.item;

import jp.koteko.liveinwater.LiveInWater;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;

import java.util.ArrayList;
import java.util.List;

@Mod.EventBusSubscriber(modid = LiveInWater.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD)
public class Items {
    public static List<Item> itemList = new ArrayList<Item>();
    public static final Item WATERTREE_ROOT = register("watertree_root", new Item((new Item.Properties()).group(ItemGroup.MATERIALS)));

    private static Item register(String key, Item itemIn) {
        itemList.add(itemIn);
        return itemIn.setRegistryName(LiveInWater.MOD_ID, key);
    }

    @SubscribeEvent
    public static void registerItems(RegistryEvent.Register<Item> event) {
        for (Item item : itemList) {
            event.getRegistry().register(item);
        }
    }
}
```
宣言・初期化と同時に`List`にアイテムを追加し、forループでリストのアイテムをすべて`register()`します。

各アノテーション(注釈)はそれぞれ以下のはたらきです。

**EventBusSubscriber**
>Annotate a class which will be subscribed to an Event Bus at mod construction time. Defaults to subscribing the current modid to the MinecraftForge.EVENT_BUS on both sides.

forgeのEventBusにこのクラスを登録しているようです。

**SubscribeEvent**
>Annotation to subscribe a method to an Event This annotation can only be applied to single parameter methods, where the single parameter is a subclass of Event. Use IEventBus.register(Object) to submit either an Object instance or a Class to the event bus for scanning to generate callback IEventListener wrappers. The Event Bus system generates an ASM wrapper that dispatches to the marked method.

メソッドがハンドラであることを示すために必要らしいです。

これらをつけてやると、自動でアイテムの登録を行ってくれます。

単なる無機能アイテムの場合単に`Item`クラスのインスタンスとします。`Item.Properties`は名の通りアイテムのプロパティを管理するクラスで、クリエイティブタブを設定する`group()`以外にもいろいろとできるので該当クラスを適宜見に行きましょう。
また`Item`クラスのインスタンスに対して`setRegistryName()`でforgeにアイテムを登録する際の内部名を決めます。名前空間にMOD_IDを使い、`MOD_ID:ITEM_NAME`という形にします。

## resourcesの設定
前項でアイテムの追加は完了ですが、このままだとゲーム内での表示が整っていませんので、これらを設定していきます。`resources`以下にファイルを配置していきます。

```
\src\main\resources
   └ assets
      └ liveinwater
         ├ lang
         │  └ en_us.json
         │  └ ja_jp.json
         ├ models
         │  └ item
         │     └ watertree_root.json
         └ textures
            └ item
               └ watertree_root.png
```
(1.14.4の記事と少し名前を変えています。)


```json:lang\en_us.json
{
  "item.liveinwater.watertree_root": "WaterTree Root"
}
```

```json:lang\ja_jp.json
{
  "item.liveinwater.watertree_root": "ウォーターツリーの根"
}
```
`"item.[MOD_ID].[ITEM_NAME]": "表示名"`

```json:watertree_root.json
{
  "parent": "item/generated",
  "textures": {
    "layer0": "liveinwater:item/watertree_root"
  }
}
```
単純なアイテムなら`parent`は`item/generated`
`MOD_ID:[テクスチャファイルのパス]`

**textures\item\watertree_root.png**
公式は16*16のpngなようなのでこれに合わせてテクスチャを作成し、配置します。(ちゃんと自分で手書きするとすごく難しいですね…。)

## 確認
ゲームを起動して確認します。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256627/d714b181-b2bf-1294-5b8d-46b34f0bc4d4.png)
`ItemGroup.MATERIALS`を指定してので、クリエイティブだとこのタブにアイテムが増えています。きちんとテクスチャが反映され、言語ファイルで設定した名前が表示されています。

# 参考
[Minecraft Forge Eventシステム概要 - Minecraft Modding Wiki](https://mcmodding.jp/modding/index.php/Minecraft_Forge_Event%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E6%A6%82%E8%A6%81)
[[Java]MinecraftのModを作成しよう 1.14.4【1. アイテムの追加】](https://qiita.com/koteko/items/76910dbf9eb126bdfdf9)
[Minecraft 1.14.4 Forge Modの作成 その3 【無機能アイテムの追加】](https://qiita.com/Hiroya_W/items/4fec2d799e499c4cd7c2)

# 次の記事
[ブロックの追加](https://qiita.com/koteko/items/fb057afa493fd2d648fc)