Minecraft 1.14.4 Forge Modの作成 その7 【防具の追加】

# はじめに
防具を追加してみます。
ハロウィン中の作業で、カボチャを被ってるスケルトンが湧きました。
![2019-11-02_22.57.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/24d4a225-0c82-5621-c52d-3eba25a17e0d.png)

装着時の音は`バケツを満たす`が再生されます。
![2019-11-02_23.26.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/c22d1c4a-ea99-e8a9-7c55-5600b877029e.png)


参考
[Armor - Minecraft Modding Tutorial for MC 1.14/1.14.3](https://www.youtube.com/watch?v=IJmD8AZNjlY)

# 💻開発環境
ここでは環境は以下のようにします。

- Windows 10
- JDK 8u211
- Minecraft 1.14.4
- Minecraft Forge 1.14.4 (28.1.0)
- IntelliJ IDEA 2019.2.3

# アイテムの宣言

```java:ItemList.java
package jp.yuyu.biwako_mod.lists;

import net.minecraft.item.Item;

public class ItemList {
    public static Item BiwakoHelmet;
    public static Item BiwakoChestplate;
    public static Item Biwakoleggings;
    public static Item Biwakoboots;
}
```

# アーマーマテリアルの追加
ツールを追加した時と同様に、Enumを利用します。
新規Javaクラスを作成する際に列挙型を指定し、`ArmorMaterialList.java`作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/a41f35b9-6841-5419-3267-fd246fa01c97.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/9f3ca67e-7d3c-795e-5e6c-090af8daf83b.png)

とりあえず全体像を記載します。

```java:ArmorMaterialList.java
package jp.yuyu.biwako_mod.lists;

import jp.yuyu.biwako_mod.BiwakoMod;
import net.minecraft.inventory.EquipmentSlotType;
import net.minecraft.item.IArmorMaterial;
import net.minecraft.item.Item;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.util.SoundEvent;
import net.minecraft.util.SoundEvents;

public enum ArmorMaterialList implements IArmorMaterial {
    MATERIAL_BIWAKO("biwako",35,new int[] {3,6,8,3},25, SoundEvents.ITEM_BUCKET_FILL,3.0f, ItemList.BiwakoIngot);

    private static final int[] MAX_DAMAGE_ARRAY = new int[]{13, 15, 16, 11};
    private final String name;
    private final int maxDamageFactor;
    private final int[] damageReductionAmountArray;
    private final int enchantability;
    private final SoundEvent soundEvent;
    private final float toughness;
    private final Item repairMaterial;

    private ArmorMaterialList(String nameIn, int maxDamageFactorIn, int[] damageReductionAmountsIn, int enchantabilityIn, SoundEvent soundEventIn, float toughnessIn, Item repairMaterialIn) {
        this.name = nameIn;
        this.maxDamageFactor = maxDamageFactorIn;
        this.damageReductionAmountArray = damageReductionAmountsIn;
        this.enchantability = enchantabilityIn;
        this.soundEvent = soundEventIn;
        this.toughness = toughnessIn;
        this.repairMaterial = repairMaterialIn;
    }

    @Override
    public int getDurability(EquipmentSlotType slotIn) {
        return MAX_DAMAGE_ARRAY[slotIn.getIndex()] * this.maxDamageFactor;
    }

    @Override
    public int getDamageReductionAmount(EquipmentSlotType slotIn) {
        return this.damageReductionAmountArray[slotIn.getIndex()];
    }

    @Override
    public int getEnchantability() {
        return this.enchantability;
    }

    @Override
    public SoundEvent getSoundEvent() {
        return this.soundEvent;
    }

    @Override
    public Ingredient getRepairMaterial() {
        return Ingredient.fromItems(this.repairMaterial);
    }

    @Override
    public String getName() {
        return BiwakoMod.MOD_ID + ":" + this.name;
    }

    @Override
    public float getToughness() {
        return this.toughness;
    }
}
```

どのように使われるのか分からないものがあったので、それぞれまとめておこうと思います。
参考
[防具の追加 - Minecraft Modding Wiki](https://mcmodding.jp/modding/index.php/%E9%98%B2%E5%85%B7%E3%81%AE%E8%BF%BD%E5%8A%A0)

## name
```java
private final String name;
```

ResourceLocationのpath名に使用される。
そのため、[無機能アイテム](https://qiita.com/Hiroya_W/items/4fec2d799e499c4cd7c2#%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0%E3%81%AE%E7%99%BB%E9%8C%B2)の追加時にも記載したように全て小文字でないとエラーが返されます。

>setRegistryName(new ResourceLocation(MOD_ID, "biwako_ingot"))でアイテムID名の指定です。
アイテムID名のアルファベットは全て小文字でないとForgeがエラーを吐きます



## maxDamageFactor
```java
private final int maxDamageFactor;
```

>マテリアルの耐久度。実際の防具の耐久度は、この値に部位ごとに11,16,15,13のいずれかを掛けて1を加算したものとなる。

## MAX_DAMAGE_ARRAY
```java
private static final int[] MAX_DAMAGE_ARRAY = new int[]{13, 15, 16, 11};
```

maxDagageFactorに記載した部位ごとの定数値。
Index:0からブーツ、レギンス、チェストプレート、ヘルメットの並びになっている。
耐久値を取得する`getDurability`メソッドで使用する。

## damageReductionAmountArray
```java
private final int[] damageReductionAmountArray;
```

>部位別のAP値（防御力）。

値が2の時、防具アイコンが1個分表示される。

## soundEvent
```java
private final SoundEvent soundEvent;
```

防具装着時の音。
`net/minecraft/util/SoundEvents.class`にサウンドファイル名が書かれているので、
好きなものを探して適用することができる。

今回は`バケツを満たす`を再生するようにしてみました。**びちゃびちゃ...。**

## toughness
```java
private final float toughness;
```

防具強度。
バニラでは、ダイヤモンドのみ`2.0f`でそれ以外は`0.0f`が設定されている。

# アイテムの登録
引数は、マテリアル、防具の部位、クリエイティブタブの3つ。

```java:BiwakoMod.java
        public static void onItemsRegistry(final RegistryEvent.Register<Item> itemRegistryEvent) {
            LOGGER.info("HELLO from Register Item");
            itemRegistryEvent.getRegistry().registerAll(
                    ItemList.BiwakoHelmet = new ArmorItem(ArmorMaterialList.MATERIAL_BIWAKO, EquipmentSlotType.HEAD, new Item.Properties().group(ItemGroup_Biwako))
                            .setRegistryName(new ResourceLocation(MOD_ID, "biwako_helmet")),
                    ItemList.BiwakoChestplate = new ArmorItem(ArmorMaterialList.MATERIAL_BIWAKO, EquipmentSlotType.CHEST, new Item.Properties().group(ItemGroup_Biwako))
                            .setRegistryName(new ResourceLocation(MOD_ID, "biwako_chestplate")),
                    ItemList.Biwakoleggings = new ArmorItem(ArmorMaterialList.MATERIAL_BIWAKO, EquipmentSlotType.LEGS, new Item.Properties().group(ItemGroup_Biwako))
                            .setRegistryName(new ResourceLocation(MOD_ID, "biwako_leggings")),
                    ItemList.Biwakoboots = new ArmorItem(ArmorMaterialList.MATERIAL_BIWAKO, EquipmentSlotType.FEET, new Item.Properties().group(ItemGroup_Biwako))
                            .setRegistryName(new ResourceLocation(MOD_ID, "biwako_boots"))
            );
        }
```

# 翻訳ファイル
```json:en_us.json
{
    "item.biwako_mod.biwako_helmet": "Biwako Helmet",
    "item.biwako_mod.biwako_chestplate": "Biwako Chestplate",
    "item.biwako_mod.biwako_leggings": "Biwako Leggings",
    "item.biwako_mod.biwako_boots": "Biwako Boots"
}
```

```json:ja_jp.json
{
    "item.biwako_mod.biwako_helmet": "琵琶湖のヘルメット",
    "item.biwako_mod.biwako_chestplate": "琵琶湖のチェストプレート",
    "item.biwako_mod.biwako_leggings": "琵琶湖のレギンス",
    "item.biwako_mod.biwako_boots": "琵琶湖のブーツ"
}
```

# モデルファイル
無機能アイテムのモデルファイルと同じ書き方。

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

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

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

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

# テクスチャファイル
## アイテムテクスチャ
![biwako_helmet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/42b214cd-8a63-e7e3-a31a-706d59161d67.png)
![biwako_chestplate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/67bc323e-2418-26ae-a6df-e7ab058e0e3a.png)
![biwako_leggings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/831db7fa-fc6d-18a8-1c19-bdfc30d83502.png)
![biwako_boots.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/61a11c9b-00f1-5b6a-899b-b59929afb750.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/f621215e-9811-f33c-4137-ce21393012a7.png)

## アーマーテクスチャ
アイテムとしてのテクスチャは用意しました。
防具の場合は、装着時のテクスチャも用意する必要があります。

### フォルダの作成
`textures/models/armor`フォルダを作成します。
表記は`models.armor`ですが、新規フォルダを作成する場合は、

- `models`フォルダを作成してから`armor`フォルダを作成する
- `models/aromr`と入力してフォルダを作成する

ことに注意してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/50e82920-ead7-f688-3770-50f7f49fe0b9.png)

### テクスチャの用意
バニラテクスチャも`/assets/minecraft/textures/models/armor`にあります。
また、`*_layer_1.png`,`*_layer_2.png`の2つのテクスチャが必要になります。

`*`の部分には、アーマーマテリアルの作成時に指定した`name`が入ります。
今回の場合は、`biwako_layer_1.png`と`biwako_layer_2.png`の2つのテクスチャを用意し、配置します。

![biwako_layer_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/ca4f9b14-5dd2-860f-b5f6-2a6e551d44ab.png)
![biwako_layer_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/377055eb-8ad3-48a5-84bd-e2d5aa6ce456.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/da69c3da-2823-dece-69b3-598c3ea877ad.png)

# Minecraftの起動
![2019-11-02_22.57.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/24d4a225-0c82-5621-c52d-3eba25a17e0d.png)
右クリックで装着してみると、`バケツを満たす`が再生されることが分かります。
![2019-11-02_23.26.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/c22d1c4a-ea99-e8a9-7c55-5600b877029e.png)

---
[Github](https://github.com/Hiroya-W/biwakoMC/tree/1.14.4)にてプロジェクトを公開しています。