MinecraftでMODを開発したい#3

*MinecraftでMODの開発をします*
*試行錯誤を書いていくだけのものになります*

##概要
特殊な機能を持たないブロックの追加

##動作環境 2021/05/12
||Version|
|:-:|:-:|
|Mac OS Big Sur|11.1|
|IntelliJ IDEA|2021.1.1|
|AdoptOpenJDK (HotSpot)|1.8.0_282|
|Minecraft|1.16.5|
|Forge|36.1.0|

##目次
- プログラムの記述
- Block Stateの記述
- ブロックモデルの記述
- アイテムモデルの記述
- テクスチャの配置
- 翻訳設定
- ルートテーブルの記述
- 確認
 

##プログラムの記述
```src/main/java/com/ドメイン名/examplemod/ExampleMod.java
package com.tntmodders.examplemod;

import net.minecraft.block.AbstractBlock;
import net.minecraft.block.Block;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.block.material.MaterialColor;
import net.minecraft.item.BlockItem;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
import net.minecraftforge.common.ToolType;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.fml.RegistryObject;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
@Mod(ExampleMod.MOD_ID)
public class ExampleMod {
    public static final String MOD_ID = "examplemod";

    public ExampleMod() {
        IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();
        Blocks.register(modEventBus);
        Items.register(modEventBus);
    }

    public static class Blocks {
        private static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, MOD_ID);
        public static final RegistryObject<Block> EXAMPLE_BLOCK = BLOCKS.register("example_block", () -> new Block(AbstractBlock.Properties
                .of(Material.METAL, MaterialColor.METAL)
                .requiresCorrectToolForDrops()
                .strength(5.0F, 6.0F)
                .sound(SoundType.METAL)
                .harvestTool(ToolType.PICKAXE)
                .harvestLevel(1)
        ));

        public static void register(IEventBus eventBus) {
            BLOCKS.register(eventBus);
        }
    }

    public static class Items {
        private static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MOD_ID);
        public static final RegistryObject<Item> EXAMPLE_BLOCK = ITEMS.register("example_block", () -> new BlockItem(Blocks.EXAMPLE_BLOCK.get(), new Item.Properties()
                .tab(ItemGroup.TAB_BUILDING_BLOCKS)));
        public static final RegistryObject<Item> EXAMPLE_INGOT = ITEMS.register("example_ingot", () -> new Item(new Item.Properties()
                .tab(ItemGroup.TAB_MATERIALS)));

        public static void register(IEventBus eventBus) {
            ITEMS.register(eventBus);
        }
    }
}
```

BLOCKS.register("example_block", ...)でブロックの登録名を指定
ブロックIDはexamplemod:example_blockとなります。

BlockクラスのインスタンスはMinecraftのブロックの種類を表す
硬さや爆破耐性など、ブロックの種類によって変わる性質を保持

AbstractBlock.Properties.of(Material.METAL, MaterialColor.METAL)で、燃えるかどうかなどの基本的な性質をまとめたMaterialと、地図上の表示色であるMaterialColorを指定

requiresCorrectToolForDropsで、ブロックを回収するために適切な道具が必要であると設定

strength(5.0F, 6.0F)でブロックの硬さと爆破耐性を指定
第一引数は硬さで、数値が大きいほど壊すために時間がかかる
第二引数は爆破耐性で、数値が大きいほど爆発で壊れにくくなる

sound(SoundType.METAL)でブロックの設置、破壊、上を歩いた時などに発生する音の種類を指定

harvestTool(ToolType.PICKAXE)でブロックを回収するための適正な道具の種類を指定
斧（AXE）、ツルハシ（PICKAXE）、シャベル（SHOVEL）、クワ（HOE）の中から選ぶ
指定しない場合は、どの道具を使っても早く壊せなくなる

harvestLevel(1)でブロックを回収するために必要な道具の素材水準を指定
初期値は-1で、0が木か金、1が石、2が鉄、3がダイヤモンドの道具を要求

BlockItemは、プレイヤーのインベントリの中にある時など、アイテムとしてのブロックを表すクラス
ほとんどのブロックは破壊されると対応するアイテムをドロップし、対応するアイテムを右クリックするとブロックをワールドに設置する
このような対応関係を示すための、Itemを継承したクラス

tab(ItemGroup.TAB_BUILDING_BLOCKS)で通常のアイテムと同様に、クリエイティブタブを指定します。今回は「建築ブロック」タブを指定


##Block Stateの記述
```src/main/resources/assets/examplemod/blockstates/example_block.json
{
  "variants": {
    "": {
      "model": "examplemod:block/example_block"
    }
  }
}
```
ブロックの状態とモデルとの対応をJSONで記述
今回は状態を扱わないので、モデルを1つ指定


##ブロックモデルの記述
```src/main/resources/assets/examplemod/models/block/example_block.json
{
  "parent": "minecraft:block/cube_all",
  "textures": {
    "all": "examplemod:block/example_block"
  }
}
```
今回は正六面体のフルブロックで全面同じテクスチャを使う


##アイテムモデルの記述
```src/main/resources/assets/examplemod/models/item/example_block.json
{
  "parent": "examplemod:block/example_block"
}
```
今回はブロックのモデルを指定


##テクスチャの配置
src/main/resources/assets/examplemod/textures/blockのファイル構造を構築
そこにブロックの各面に表示される16×16ピクセルのpng画像ファイルexample_block.pngを配置する


##翻訳設定

英語翻訳
src/main/resources/assets/examplemod/lang/en_us.json
{
  "block.examplemod.example_block": "Block of Example",
  "item.examplemod.example_item": "Example Item"
}

日本語翻訳
src/main/resources/assets/examplemod/lang/ja_jp.json
{
  "block.examplemod.example_block": "お試しブロック",
  "item.examplemod.example_item": "お試しアイテム"
}


##ルートテーブルの記述
```src/main/resources/data/examplemod/loot_tables/blocks/example_block.json
{
  "type": "minecraft:block",
  "pools": [
    {
      "rolls": 1,
      "entries": [
        {
          "type": "minecraft:item",
          "name": "examplemod:example_block"
        }
      ],
      "conditions": [
        {
          "condition": "minecraft:survives_explosion"
        }
      ]
    }
  ]
}
```
ブロックを適正な道具で破壊した際にドロップするアイテムをJSONで記述
今回は常にお試しアイテムをアイテムとして1つドロップするよう指定
フォルダ名が複数形なので注意

"condition": "minecraft:survives_explosion"により、他のブロックと同様、爆発により壊された時に1/（爆発力）の確率でアイテムをドロップするようになる

##確認
![スクリーンショット 2021-05-13 18.14.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482491/fcf932b5-838d-64cd-8c72-749efa598aeb.png)
![スクリーンショット 2021-05-13 18.14.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482491/00b0dcb6-6861-0d3f-6ef4-68b90506706b.png)

ブロックとして確認できたが、ドロップはしなかった

######参考文献
https://www.tntmodders.com/tutorial/block-1165/