Minecraft 1.12.2 Forge Modの作成 その3 【剣の追加とレシピ登録,クラフト後に返ってくるアイテムの設定】

# はじめに
今回はツールの追加第一弾として剣を追加してみたいと思います。


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)

また、今回は以下のYoutube動画が大変参考になりました。
[【マインクラフト】MODの作り方 part2 アイテム＆ツール作成編](https://www.youtube.com/watch?v=pn_RFejam3g)

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

# ツールを作るための素材をアイテムとして登録
琵琶湖の水をアイテムとして登録します。

## メンバーの追加

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

## アイテムとモデルの登録

アイテムの登録は、コンマ(,)をつけて同じように書く。
モデルの登録はメンバー名変更するだけ。

```java:Biwako_mod.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"),
                new Item()
                        .setRegistryName(MOD_ID,"biwakowater")
                        .setCreativeTab(CreativeTabs.MATERIALS)
                        .setTranslationKey("biwakowater")
            );
        }

        @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"));
            ModelLoader.setCustomModelResourceLocation(Items.biwakoWater, 0, new ModelResourceLocation(Items.biwakoWater.getRegistryName(), "inventory"));
        }
    }
```

## jsonファイル

琵琶湖の水には、バニラに用意されている`水バケツ`のテクスチャを利用しようと思う。
そこで、バニラのアイテムのjsonファイルを見てみる。

右側のプロジェクトウィンドウの一番下に`外部ライブラリ－`があり、
これの`forgeSrc-1.12.2-14.23.5.2838.jar/assets/minecraft/models/item`にjsonが入っている。

ちなみに、水バケツは`water_bucket.json`という名前で置かれていた。
`biwakowater.json`ファイルを作成し、`water_bucket.json`の中身をコピペする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/0b3f2e74-bd3c-5988-413a-8ec6d3090b86.png)

```json:biwakowater.json
{
  "parent": "item/generated",
  "textures": {
    "layer0": "items/bucket_water"
  }
}
```

## langファイル

こんな感じ。

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

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

## minecraftの起動
![2019-07-17_21.06.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/7102bff1-3fb4-aea4-e0a4-be363e38e928.png)

ここまでは前回と同じ手順。

# 琵琶湖ソードを追加
まずはソードを追加してみます。

## メンバーの追加
ソードのメンバを新しく追加します。ソードも変数をItemとするようです。

```java:Biwako_mod.java
@GameRegistry.ObjectHolder(MOD_ID)
    public static class Items {
        public static final Item biwakoBurger = null;       /** 琵琶湖バーガー */
        public static final Item biwakoWater = null;        /** 琵琶湖の水 */
        public static final Item biwakoSword = null;        /** 琵琶湖ソード , 滋賀剣*/
    }
```

## ソード追加クラス
`src/main/java/jp/yuyu/biwako_mod`にソード追加用のクラスを作成します。
ファイル名は`AddSword.java`としました。

ItemSwordクラスを継承させ、以下のように記述しておきます。

```java:AddSword.java
package jp.yuyu.biwako_mod;

import net.minecraft.item.ItemSword;

public class AddSword extends ItemSword {
    public AddSword(ToolMaterial material){
        super(material);
    }
}
```

## アイテムの登録
少し長くなってきましたので、次回からは一部のみ記載することにします。
無機能アイテムを登録したときと同じように、addItemsメソッド内でアイテムの登録を行います。

先程作ったAddSwordクラスのインスタンスを作成し、
引数には、EnumHelper.addToolMaterialメソッドを用いてツールのパラメータを設定します。

パラメータは以下の通りに設定してみました。

また、CreativeTabの設定はせずとも、ItemSwordクラスがやってくれるようです。

|       名前      |          値          |
|:---------------:|:--------------------:|
| name            | BIWAKOWATER_MATERIAL |
| harvestLevel    |                    1 |
| maxUses         |                 1000 |
| efficiency      |                    5 |
| damage          |                    7 |
| enchantabillity |                    1 |

```java:Biwako_mod.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"),
                new Item()
                        .setRegistryName(MOD_ID,"biwakowater")
                        .setCreativeTab(CreativeTabs.MATERIALS)
                        .setTranslationKey("biwakowater"),
                new AddSword(EnumHelper.addToolMaterial("BIWAKOWATER_MATERIAL",1,1000,5,7,1))
                        .setRegistryName(MOD_ID,"biwakosword")
                        .setTranslationKey("biwakosword")
            );
        }

        @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"));
            ModelLoader.setCustomModelResourceLocation(Items.biwakoWater, 0, new ModelResourceLocation(Items.biwakoWater.getRegistryName(), "inventory"));
            ModelLoader.setCustomModelResourceLocation(Items.biwakoSword, 0, new ModelResourceLocation(Items.biwakoSword.getRegistryName(), "inventory"));
        }
    }

```

## ソードのテクスチャ
`models/item/biwakosword.json`を作成します。
テクスチャは用意できなかったので、代わりにバニラのダイヤモンドソードのテクスチャを使用します。

無機能アイテムと違い、ソードの場合はparentの値をitem/handheldにします。

```json:biwakosword.json
{
    "parent": "item/handheld",
    "textures": {
        "layer0": "items/diamond_sword"
    }
}
```

## langの設定

```en_US.lang
# English Language File
item.biwakoburger.name=Biwako Burger
item.biwakowater.name=Water of Biwako
item.biwakosword.name=Biwako Sword
```

```ja_JP.lang
# 日本語言語ファイル
item.biwakoburger.name=琵琶湖バーガー
item.biwakowater.name=琵琶湖の水
item.biwakosword.name=滋賀県
```

## minecraftの起動
無事、滋賀県（？）が追加されました
![2019-08-08_14.42.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/fd4c10e0-9fde-30a9-6141-04a722eb56df.png)

# レシピの登録
## レシピ登録のJsonファイル
Jsonファイルを使ってレシピ登録ができるようです。

`resources/assets/biwako_mod/recipes/biwakosword_recipe.json`を作成します。
ファイル名は何でも良いようですので、わかりやすい名前をつけておきます。

patternには、作業台にアイテムをどう配置するかを記述し、
アルファベットに対するアイテムが何なのかをkeyとして記述します。

```json:biwakosword_recipe.json
{
    "type": "minecraft:crafting_shaped",
    "pattern": [
        "W",
        "W",
        "S"
    ],
    "key": {
        "W": [
            {
                "item": "biwako_mod:biwakowater",
                "data": 0
            }
        ],
        "S": [
            {
                "item": "minecraft:stick",
                "data": 0
            }
        ]
    },
    "result": {
        "item": "biwako_mod:biwakosword",
        "data": 0,
        "count": 1
    }
}
```

## クラフト後に返ってくるアイテム
滋賀県(琵琶湖ソード)は琵琶湖の水を素材として使用します。
クラフト後にはバケツが返ってきてほしいのです。

これはレシピ用のJsonファイルに記述するのではなく、アイテムの登録時に設定します。

setContainerItemというメソッドの引数にバニラのバケツを渡せばOKです。

```java:Biwako_mod.java
new Item()
    .setRegistryName(MOD_ID,"biwakowater")
    .setCreativeTab(CreativeTabs.MATERIALS)
    .setTranslationKey("biwakowater")
    .setContainerItem(Item.getByNameOrId("bucket")),
```

## minecraftの起動
左側のレシピには、一度クラフトすると表示されるようになりました。

ケーキで試して挙動が同じか確かめた痕跡が残ってるSSですが、
ちゃんとクラフト後にはバケツが残りますね！

返ってくるアイテムはIDでも指定できるようで、適当にID指定したら砂利が返ってきたのも写ってますね...。

![2019-08-08_15.31.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/68cf0f39-0486-32de-d3be-da2dea8bdd0f.png)

![2019-08-08_15.50.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/2bfd9b06-13c0-5858-e41f-f54027126b7c.png)

# おわりに
ツール作成第一弾、ソードの追加ができました。
アイテムの登録に関しては、なんとなくわかってきた気がします(ほんとに気がするだけ)。

色合いを変えるだけでもいいから、専用テクスチャを用意しておきたいのと、
ツールのパラメータをいい感じに調整したいですね。

現在開発中の`琵琶湖MOD`ですが、[Github](https://github.com/Hiroya-W/biwakoMC)にてプロジェクトを公開しています。

---
次回は琵琶湖ツールを完成させます。
[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)

2018/08/08 初版