Minecraft 1.12.2 Forge Modの作成 その4 【ブロックの追加】

# はじめに
琵琶湖ツールを完成させる予定でしたが、予定を変更して、
今回は、ブロックの追加をしてみたいと思います。

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

# メンバーの追加
今までの無機能アイテム、ツールは、どちらもアイテムという扱いでした。
今回のブロックについては、アイテムとしても存在し、ブロックとしても存在します。

ということで、2つ追加します。

```java:Biwako_mod.java
    @GameRegistry.ObjectHolder(MOD_ID)
    public static class Blocks {
        public static final Block biwakoBlock = null;      /** 琵琶湖ブロック */
    }

    @GameRegistry.ObjectHolder(MOD_ID)
    public static class Items {
        public static final Item biwakoBlock = null;        /** 琵琶湖ブロック */
    }
```

# アイテムの登録
ブロックのアイテムの登録をします。
ブロックの場合、`ItemBlock`のインスタンスを引数として渡します。
`ItemBlock`の引数には、`Blocks`のメンバーを渡し、
`setRegistryName`メソッドで、登録名だけ設定しておきます。

```java:Biwako_mod.java
    @Mod.EventBusSubscriber
    public static class ObjectRegistryHandler {
        @SubscribeEvent
        public static void addItems(RegistryEvent.Register<Item> event) {
            event.getRegistry().registerAll(
                new ItemBlock(Blocks.biwakoBlock).setRegistryName("biwakoblock")
            );
        }
    }
```

# ブロックの登録
ブロックとしてのパラメータをここで追加します。
基本的な記述方法はアイテムの時と同じ。
`Block`の引数には`Material`を渡すのですが、どうやらいろんなパラメータがあるそうです。
透明とか、破壊にツールを必要とするとか。ここでは無難に`Material.ROCK`を設定しています。
(オリジナルのMaterialも追加できるのかな)
情報はver 1.6.4のものですが、参考に。
[Minecraft 1.6.4 Material](https://mcmodding.jp/modding/index.php/Class%E8%A7%A3%E8%AA%AC/1.6.4/Material#setRequiresTool)

```java:Biwako_mod.java
    @Mod.EventBusSubscriber
    public static class ObjectRegistryHandler {
        @SubscribeEvent
        public static void addBlocks(RegistryEvent.Register<Block> event) {
            event.getRegistry().registerAll(
                    new Block(Material.ROCK)
                            .setRegistryName(MOD_ID, "biwakoblock")/*登録名の設定*/
                            .setCreativeTab(CreativeTabs.BUILDING_BLOCKS)/*クリエイティブタブの選択*/
                            .setTranslationKey("biwakoblock")/*システム名の設定*/
                            .setHardness(1.5F) /*硬さ*/
                            .setResistance(1.0F) /*爆破耐性*/

             );
         }
    }   
```

# モデルの登録
いつも通り。

```java:Biwako_mod.java
    @Mod.EventBusSubscriber
    public static class ObjectRegistryHandler {
        @SubscribeEvent
        public static void registerModels(ModelRegistryEvent event) {
            ModelLoader.setCustomModelResourceLocation(Items.biwakoBlock, 0, new ModelResourceLocation(Items.biwakoBlock.getRegistryName(), "inventory"));
        }
    }
```

# リソース
アイテムとは異なり、いくつか設定する項目があります。
[ver 1.8のブロック追加](https://mcmodding.jp/modding/index.php/1.8%E3%81%AE%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E8%BF%BD%E5%8A%A0)の解説を参考に。

## blockmodel
ブロックのモデルをここで設定する。
適用したいテクスチャの配置場所は、
`/src/main/resources/assets/biwako_mod/textures/blocks/biwakoblock.png`
です。

今回は、全面同じテクスチャのブロックにしますが、
ビーコンみたいな、複雑なテクスチャも(jsonファイル覗いてみた感じおそらく)ここで設定するっぽい。

jsonファイルは
`/src/main/resources/assets/biwako_mod/models/block/biwakoblock_model.json`
に配置します。

```json:biwakoblock_model.json
{
    "parent":"block/cube_all",
    "textures":{"all":"biwako_mod:blocks/biwakoblock"}
}
```

## blockstates
ブロックの状態。
作物の成長過程別にリソースを設定したい場合など。
今回は状態が1つしかないので、`normal`を指定する。
指定するmodelは上のblockmodelで作成したjsonファイルの名前です。

jsonファイルは
`/src/main/resources/assets/biwako_mod/blockstates/biwakoblock.json`
に配置します。

```json:biwakoblock.json
{
    "variants": {
        "normal": { "model": "biwako_mod:biwakoblock_model" }
    }
}
```

## item model
最後にアイテムのモデルを設定します。
ブロックのモデルと同じなので、それ(jsonファイル名)を指定します。

jsonファイルは
`/src/main/resources/assets/biwako_mod/models/item/biwakoblock.json`
に配置します。

```json:biwakoblock.json
{
    "parent":"biwako_mod:block/biwakoblock_model"
}
```

# レシピの追加
砂を琵琶湖の水で固めるイメージ。

```json:biwakoblock_recipe.json
{
    "type": "minecraft:crafting_shaped",
    "pattern": [
        "BBB",
        "BSB",
        "BBB"
    ],
    "key": {
        "B": [
            {
                "item": "biwako_mod:biwakowater",
                "data": 0
            }
        ],
        "S": [
            {
                "item": "minecraft:sand",
                "data": 0
            }
        ]
    },
    "result": {
        "item": "biwako_mod:biwakoblock",
        "data": 0,
        "count": 1
    }
}
```

# lang

```text:en_US.lang
tile.biwakoblock.name=Biwako Block
```

```text:ja_JP.lang
tile.biwakoblock.name=琵琶湖ブロック
```

# minecraftの起動
![2019-08-27_22.24.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/4647a5f5-53ad-f876-b64a-e458709fa391.png)
![2019-08-27_22.25.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/bce6c0e5-b8fb-2688-d70b-8df647f66a66.png)

真っ青なブロック...。テクスチャ、まじでどうしよう...。
このテクスチャは、毎度のことながらバニラの水ブロックのものをお借りしたのですが、
手持ちしか半透明になってないですね...。
うーん。とりあえず、目標は達成です。

# おわりに
ブロックの追加ができました。
単にアイテムやブロックの追加をしてきただけで、パラメータの設定を適当にしてきてしまっている感じ。
テクスチャも適当なので、そこら辺をなんとかしたいな、と思いつつもプログラミングが楽しくって...。

MODのネタもいくつか新しく増えたので、書き方の情報集めて勉強しないと...！
頑張ります！！

現在開発中の`琵琶湖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/27 初版