Minecraft 1.14.4 Forge Modの作成 その6 【5種ツールの追加】

# はじめに
斧、鍬、ピッケル、スコップ、剣の5種類のツールを追加してみます。
![2019-10-31_12.09.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/7c14385b-1f90-5429-ba61-dfdff7e9c53d.png)

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

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

- 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 BiwakoIngot;
    public static Item BiwakoBlock;
    // 5種ツール
    public static Item BiwakoAxe;
    public static Item BiwakoHoe;
    public static Item BiwakoPickaxe;
    public static Item BiwakoShovel;
    public static Item BiwakoSword;
}
```

# ツールマテリアルの作成
## 列挙型
ツールには、

- 収穫レベル　木・金(0)、石(1)、鉄(2)、ダイヤ(3)　黒曜石を回収できるものにしたいなら3に設定
- 耐久力
- 採掘効率
- 攻撃力
- エンチャント能力　高レベルのエンチャントのつきやすさ

のパラメータを持つマテリアルの情報を与えることになります。
オリジナルのマテリアルは、今後いくつも増える予定があり、
こういった場合は管理しやすいようにEnumクラスを作成します。

Enumの解説は[[Enum で振る舞う]](https://qiita.com/KeithYokoma/items/9681b130ea132cfad64d)が分かりやすかったです。

新規Javaクラスを作成する際に列挙型を指定し、`ToolMaterialList.java`作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/4d8ea31b-ea5e-d80f-690e-0e1ab74efa7d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/f540642b-61f7-d239-370a-e77cd4ecad1a.png)

## ToolMaterialList.java
とりあえず、ソースコード全体を記載します。

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

import net.minecraft.item.IItemTier;
import net.minecraft.item.Item;
import net.minecraft.item.crafting.Ingredient;

public enum ToolMaterialList implements IItemTier {
    // Enumの宣言
    MATERIAL_BIWAKO(3, 1000, 15.0f, 3.0f,25, ItemList.BiwakoIngot);

    // メンバ変数
    private float attackDamage, efficiency;
    private int maxUses, harvestLevel, enchantability;
    private Item repairMaterial;

    // コンストラクタ
    private ToolMaterialList(int harvestLevelIn, int maxUsesIn, float efficiencyIn, float attackDamageIn, int enchantabilityIn, Item repairMaterialIn) {
        this.harvestLevel = harvestLevelIn;
        this.maxUses = maxUsesIn;
        this.efficiency = efficiencyIn;
        this.attackDamage = attackDamageIn;
        this.enchantability = enchantabilityIn;
        this.repairMaterial = repairMaterialIn;
    }

    // メソッド
    @Override
    public float getAttackDamage() {
        return attackDamage;
    }

    @Override
    public float getEfficiency() {
        return efficiency;
    }

    @Override
    public int getMaxUses() {
        return maxUses;
    }

    @Override
    public int getHarvestLevel() {
        return harvestLevel;
    }

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

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

構造はEnumの宣言、メンバ変数、コンストラクタ、メソッドの4つ。
解説記事にも書かれているように、
>オブジェクトの列挙になるので、メソッドを宣言したり、メンバ変数を宣言したりと、振る舞いを持たせることが出来る。
内部的には、列挙したオブジェクトは定数として扱われるので、列挙の数だけオブジェクトが予め生成されることになる。

ため、オリジナルのマテリアルを増やしたければ、このソースコードにEnumの宣言を新たに記述するだけでOKとなる。
今回は、`MATERIAL_BIWAKO`を追加してみた。

# ツール追加用クラス
各ツールの追加用クラスを用意します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/b362849c-7e07-aa17-49a9-b5cc58dab68d.png)


それぞれ、クラスを継承しコンストラクタを用意します。
スコップは今まで`ItemSpade`クラスを継承していましたが、このバージョンからは
名前が`ShovelItem`となっているようです。

```java:ItemCustomAxe.java
package jp.yuyu.biwako_mod.items;

import net.minecraft.item.AxeItem;
import net.minecraft.item.IItemTier;

public class ItemCustomAxe extends AxeItem {
    public ItemCustomAxe(IItemTier tier, float attackDamageIn, float attackSpeedIn, Properties builder) {
        super(tier, attackDamageIn, attackSpeedIn, builder);
    }
}
```

```java:ItemCustomHoe.java
package jp.yuyu.biwako_mod.items;

import net.minecraft.item.HoeItem;
import net.minecraft.item.IItemTier;

public class ItemCustomHoe extends HoeItem {
    public ItemCustomHoe(IItemTier tier, float attackSpeedIn, Properties builder) {
        super(tier, attackSpeedIn, builder);
    }
}
```

```java:ItemCustomPickaxe.java
package jp.yuyu.biwako_mod.items;

import net.minecraft.item.PickaxeItem;
import net.minecraft.item.IItemTier;

public class ItemCustomPickaxe extends PickaxeItem {
    public ItemCustomPickaxe(IItemTier tier, float attackDamageIn, float attackSpeedIn, Properties builder) {
        super(tier, attackDamageIn, attackSpeedIn, builder);
    }
}
```

```java:ItemCustomShovel.java
package jp.yuyu.biwako_mod.items;

import net.minecraft.item.IItemTier;
import net.minecraft.item.ShovelItem;

public class ItemCustomShovel extends ShovelItem {
    public ItemCustomShovel(IItemTier tier, float attackDamageIn, float attackSpeedIn, Properties builder) {
        super(tier, attackDamageIn, attackSpeedIn, builder);
    }
}
```

```java:ItemCustomSword.java
package jp.yuyu.biwako_mod.items;

import net.minecraft.item.IItemTier;
import net.minecraft.item.SwordItem;

public class ItemCustomSword extends SwordItem {
    public ItemCustomSword(IItemTier tier, int attackDamageIn, float attackSpeedIn, Properties builder) {
        super(tier, attackDamageIn, attackSpeedIn, builder);
    }
}
```

- IItemTier tier　ツールマテリアル
- Properties builder　クリエイティブタブ


# アイテムの登録
無機能アイテムを登録した時と同じように、アイテムの登録をしていきます。
今回は、ダイヤツールの攻撃力、攻撃速度と同じになるように設定してみました。

```java:BiwakoMod.java
        public static void onItemsRegistry(final RegistryEvent.Register<Item> itemRegistryEvent) {
            LOGGER.info("HELLO from Register Item");
            itemRegistryEvent.getRegistry().registerAll(
                    ItemList.BiwakoAxe = new ItemCustomAxe(ToolMaterialList.MATERIAL_BIWAKO,5.0f,-3.0f,new Item.Properties().group(ItemGroup_Biwako))
                            .setRegistryName(new ResourceLocation(MOD_ID,"biwako_axe")),
                    ItemList.BiwakoHoe = new ItemCustomHoe(ToolMaterialList.MATERIAL_BIWAKO,0.0f,new Item.Properties().group(ItemGroup_Biwako))
                            .setRegistryName(new ResourceLocation(MOD_ID,"biwako_hoe")),
                    ItemList.BiwakoPickaxe = new ItemCustomPickaxe(ToolMaterialList.MATERIAL_BIWAKO,1,-2.8f,new Item.Properties().group(ItemGroup_Biwako))
                            .setRegistryName(new ResourceLocation(MOD_ID,"biwako_pickaxe")),
                    ItemList.BiwakoShovel = new ItemCustomShovel(ToolMaterialList.MATERIAL_BIWAKO,1.5f,-3.0f,new Item.Properties().group(ItemGroup_Biwako))
                            .setRegistryName(new ResourceLocation(MOD_ID,"biwako_shovel")),
                    ItemList.BiwakoSword = new ItemCustomSword(ToolMaterialList.MATERIAL_BIWAKO,3,-2.4f,new Item.Properties().group(ItemGroup_Biwako))
                            .setRegistryName(new ResourceLocation(MOD_ID,"biwako_sword"))
            );
        }
```

# 翻訳ファイル

```json:en_us.json
{
    "item.biwako_mod.biwako_axe": "Biwako Axe",
    "item.biwako_mod.biwako_hoe": "Biwako Hoe",
    "item.biwako_mod.biwako_pickaxe": "Biwako Pickaxe",
    "item.biwako_mod.biwako_shovel": "Biwako Shovel",
    "item.biwako_mod.biwako_sword": "Biwako Sword"
}
```

```json:ja_jp.json
{
    "item.biwako_mod.biwako_axe": "琵琶湖の斧",
    "item.biwako_mod.biwako_hoe": "琵琶湖のクワ",
    "item.biwako_mod.biwako_pickaxe": "琵琶湖のピッケル",
    "item.biwako_mod.biwako_shovel": "琵琶湖のスコップ",
    "item.biwako_mod.biwako_sword": "琵琶湖の剣"
}
```

# モデルファイル
ツール用のモデルファイルの場合、`parent`には`item/handheld`を指定します。
それ以外は今まで通りです。

```json:biwako_axe.json
{
    "parent": "item/handheld",
    "textures": {
        "layer0": "biwako_mod:items/biwako_axe"
    }
}
```

```json:biwako_hoe.json
{
    "parent": "item/handheld",
    "textures": {
        "layer0": "biwako_mod:items/biwako_hoe"
    }
}
```

```json:biwako_pickaxe.json
{
    "parent": "item/handheld",
    "textures": {
        "layer0": "biwako_mod:items/biwako_pickaxe"
    }
}
```

```json:biwako_shovel.json
{
    "parent": "item/handheld",
    "textures": {
        "layer0": "biwako_mod:items/biwako_shovel"
    }
}
```

```json:biwako_sword.json
{
    "parent": "item/handheld",
    "textures": {
        "layer0": "biwako_mod:items/biwako_sword"
    }
}
```



# テクスチャファイル
テクスチャを作成し、配置します。

![biwako_axe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/e1b540f9-86e4-1078-9e29-8563a10b25a2.png)
![biwako_hoe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/46a1de39-e033-2620-7d3a-9f72f78589fb.png)
![biwako_pickaxe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/94765e97-c4ac-bf5a-e819-8861614d75c9.png)
![biwako_shovel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/0c38952f-9171-abde-55ea-0307aee0fe0e.png)
![biwako_sword.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/f7ee03b3-d8d3-5b66-fa42-40c56d032d9e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/f92dc798-62c4-d8f7-11e1-50de456b2ecf.png)

# Minecraftの起動
![2019-10-31_12.09.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/7c14385b-1f90-5429-ba61-dfdff7e9c53d.png)

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