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

# はじめに
ブロックの追加をしてみます。
![2019-09-16_23.34.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/14c7e07e-1fbb-53b3-0066-ca202a8358e1.png)

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

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

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

# ブロックの宣言
前回同様、`list`フォルダ内に`BlockList.java`を作成しブロックの宣言だけ記述します。
琵琶湖ブロック、略して琵ロックを追加しようと思います。(ナニソレ)

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

import net.minecraft.block.Block;

public class BlockList {
    public static Block BiwakoBlock;
}
```

# ブロックの登録
ブロックの登録と同時にパラメータの指定も行います。
今回のブロックには`Material.IRON`を指定しましが、これは、

- マッピングにおけるカラー(MaterialColor.IRON)
- 破壊にツールを必要とする

が指定されたMaterialです。他にもプロパティがあり、

- ブロックが燃えるかどうか
- ブロックがピストンなどで押すことができるかどうか
- ブロックが雪や葉っぱのように半透明かどうか

などを指定したMaterialを自作することもできます。

詳しくは[Basic blocks - Minecraft Modding Wiki](https://mcmodding.jp/modding/index.php/Basic_blocks)、
`net.minecraft.block.material.Material.java`に書かれています。

`hardness`は採掘時のブロックの硬さ、`Resistance`はブロックの爆発耐性です。
`lightValue`は0以外の時光源として働く。おそらく値の範囲は0~15である。
`sound`はブロック破壊時に再生される音を指定できる。


```java:BiwakoMod.java
        @SubscribeEvent
        public static void onBlocksRegistry(final RegistryEvent.Register<Block> blockRegistryEvent) {
            LOGGER.info("HELLO from Register Block");
            blockRegistryEvent.getRegistry().registerAll(
                    BlockList.BiwakoBlock = new Block(Block.Properties.create(Material.IRON)
                            .hardnessAndResistance(2.0f, 3.0f)
                            .lightValue(5)
                            .sound(SoundType.METAL))
                            .setRegistryName(new ResourceLocation(MOD_ID, "biwako_block"))
            );
        }
```

# アイテムの宣言
ブロックはブロックとして存在するのは当たり前ですが、アイテムとしても存在するため
同様に登録する必要があります。

```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;
}
```

# アイテムの登録
ブロックの場合は`BlockItem`クラスのインスタンスを登録します。
引数には、対応するBlock型のメンバ、クリエイティブタブのプロパティを渡します。

```java:BiwakoMod.java
    @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD)
    public static class RegistryEvents {
        @SubscribeEvent
        public static void onItemsRegistry(final RegistryEvent.Register<Item> itemRegistryEvent) {
            LOGGER.info("HELLO from Register Item");
            itemRegistryEvent.getRegistry().registerAll(
                    ItemList.BiwakoIngot = new Item(new Item.Properties().group(ItemGroup.MISC))
                            .setRegistryName(new ResourceLocation(MOD_ID, "biwako_ingot")),
                    ItemList.BiwakoBlock = new BlockItem(BlockList.BiwakoBlock, new Item.Properties().group(ItemGroup.MISC))
                            .setRegistryName(BlockList.BiwakoBlock.getRegistryName())
            );
        }
```

# リソース
ブロックの場合は3つのjsonファイルを記述する必要があります。
今回は、最初なので基本的なテクスチャのブロックを追加します。

## フォルダの作成
以下の3つのフォルダを作成します。
`/src/main/resources/assets/biwako_mod/blockstates`
`/src/main/resources/assets/biwako_mod/models/block`
`/src/main/resources/assets/biwako_mod/textures/blocks`


```
        └─resources
            │  logo.png
            │  pack.mcmeta
            │
            ├─assets
            │  └─biwako_mod
            │      ├─*blockstates
            │      │      biwako_block.json
            │      │
            │      ├─lang
            │      │      en_us.json
            │      │      ja_jp.json
            │      │
            │      ├─models
            │      │  ├─*block
            │      │  │      biwako_block_model.json
            │      │  │
            │      │  └─item
            │      │          biwako_block.json
            │      │          biwako_ingot.json
            │      │
            │      └─textures
            │          ├─*blocks
            │          │      biwako_block.png
            │          │
            │          └─items
            │                  biwako_ingot.png
```

## block model
ブロックの見た目のこと。
ビーコンのような複雑なテクスチャもblock modelで設定するようです。
RSランプのように点滅するブロックは、点灯時と消灯時のmodelをそれぞれ別で用意し、
次のblock statesで状態とblock modelを指定することで実装します。

今回は全面同じテクスチャのブロックとします。

テクスチャの配置場所は
`/src/main/resources/assets/biwako_mod/textures/blocks/biwako_block.png`
です。

![biwako_block.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/08dfaf64-09ae-e8aa-f003-a70e01cd973c.png)

jsonファイルは
`/src/main/resources/assets/biwako_mod/models/block/biwako_block_model.json`
です。

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

## block states
ブロックの状態に合わせてblock modelを指定します。
今回は状態が1つしかないブロックにするので、空欄にしておきます。

指定するmodelは上のblock modelで作成したjsonファイルの名前です。

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

```json:biwako_block.json
{
    "variants": {
        "": { "model": "biwako_mod:block/biwako_block_model" }
    }
}
```

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

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

```json:biwako_block.json
{
    "parent":"biwako_mod:block/biwako_block_model"
}
```

# 翻訳ファイル

```json:en_us.json
{
    "item.biwako_mod.biwako_ingot":  "Biwako Ingot",
    "block.biwako_mod.biwako_block": "Biwako Block"
}
```

```json:ja_jp.json
{
    "item.biwako_mod.biwako_ingot": "琵ンゴット",
    "block.biwako_mod.biwako_block": "琵ロック"
}
```

# Minecraftの起動
![2019-09-16_23.33.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/dc5b7aef-1c2e-f359-8665-3ad3a779ae91.png)
![2019-09-16_23.34.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/14c7e07e-1fbb-53b3-0066-ca202a8358e1.png)
ちょっとだけ発光しているのが分かりますね

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