ブロックの追加 (1.16.5)

概要

特殊な機能を持たないブロックを追加します。

動作確認

2021年3月21日

  • Minecraft 1.16.5
  • Forge 36.1.0

解説

TitaniumMod

TitaniumMod/src/main/java/com/tntmodders/titaniummod/TitaniumMod.java

package com.tntmodders.titaniummod;

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(TitaniumMod.MOD_ID)
public class TitaniumMod {
    public static final String MOD_ID = "titaniummod";

    public TitaniumMod() {
        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> TITANIUM_BLOCK = BLOCKS.register("titanium_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> TITANIUM_BLOCK = ITEMS.register("titanium_block", () -> new BlockItem(Blocks.TITANIUM_BLOCK.get(), new Item.Properties()
                .tab(ItemGroup.TAB_BUILDING_BLOCKS)));
        public static final RegistryObject<Item> TITANIUM_INGOT = ITEMS.register("titanium_ingot", () -> new Item(new Item.Properties()
                .tab(ItemGroup.TAB_MATERIALS)));

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

BLOCKS.register("titanium_block", ...)でブロックの登録名を指定します。ブロックIDはtitaniummod:titanium_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

TitaniumMod/src/main/resources/assets/titaniummod/blockstates/titanium_block.json

{
  "variants": {
    "": {
      "model": "titaniummod:block/titanium_block"
    }
  }
}

ブロックの状態とモデルとの対応をリソースパックと同様の形式のJSONで記述します。今回は状態を扱わないので、モデルを1つ指定します。

ブロックモデル

TitaniumMod/src/main/resources/assets/titaniummod/models/block/titanium_block.json

{
  "parent": "minecraft:block/cube_all",
  "textures": {
    "all": "titaniummod:block/titanium_block"
  }
}

ブロックモデルをリソースパックと同様の形式のJSONで記述します。今回は正六面体のフルブロックで全面同じテクスチャを使います。

アイテムモデル

TitaniumMod/src/main/resources/assets/titaniummod/models/item/titanium_block.json

{
  "parent": "titaniummod:block/titanium_block"
}

アイテムとして表示されるモデルをリソースパックと同様の形式のJSONで記述します。今回はブロックのモデルを指定します。

テクスチャ

TitaniumMod/src/main/resources/assets/titaniummod/textures/block/titanium_block.png

titanium_block.png

ブロックの各面に表示される16×16ピクセルのpng画像ファイルです。

英語翻訳

TitaniumMod/src/main/resources/assets/titaniummod/lang/en_us.json

{
  "block.titaniummod.titanium_block": "Block of Titanium",
  "item.titaniummod.titanium_ingot": "Titanium Ingot"
}

ブロック名の翻訳を追加しました。

日本語翻訳

TitaniumMod/src/main/resources/assets/titaniummod/lang/ja_jp.json

{
  "block.titaniummod.titanium_block": "チタンブロック",
  "item.titaniummod.titanium_ingot": "チタンインゴット"
}

ブロック名の翻訳を追加しました。

ルートテーブル

TitaniumMod/src/main/resources/data/titaniummod/loot_tables/blocks/titanium_block.json

{
  "type": "minecraft:block",
  "pools": [
    {
      "rolls": 1,
      "entries": [
        {
          "type": "minecraft:item",
          "name": "titaniummod:titanium_block"
        }
      ],
      "conditions": [
        {
          "condition": "minecraft:survives_explosion"
        }
      ]
    }
  ]
}

ブロックを適正な道具で破壊した際にドロップするアイテムを、データパックと同様の形式のJSONで記述します。今回は常にチタンブロックをアイテムとして1つドロップするよう指定します。フォルダ名が複数形なので注意してください。

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

関連クラス

  • net.minecraft.block.Blocks:バニラのブロックが記述されています。

リンク


前:アイテムの追加

次:レシピの追加

4件のコメント

  1. runCilentしたら
    C:\Mods\ZisakuMOD\src\main\java\com\zisaku1modders\zisakmod\ZisakuMod.java:23: �G���[: �V���{�������‚����܂���
    public static final RegistryObject TITANIUM_BLOCK = ITEMS.register("titanium_block", () -> new BlockItems(Blocks.TITANIUM_BLOCK.get(), new Item.Properties()
    ^
    �V���{��: �N���X BlockItems
    �ꏊ: �N���X com.zisaku1modders.zisakmod.ZisakuMod.Items
    というエラーが出ました。
    TitaniumMod.javaの
    public static final RegistryObject TITANIUM_BLOCK = ITEMS.register("titanium_block", () -> new BlockItems(Blocks.TITANIUM_BLOCK.get(), new Item.Properties()
    ⇑ ⇑
    ここが赤くなっています

    • 赤砂蛇 凪浜

      BlockItemsの部分が赤く表示されているので間違いないでしょうか。記事にBlockItemと書いてある通り、sをつけてはいけません。

      IntelliJ IDEAの画面上で赤く表示されるのはコンパイルエラーで、カーソルを合わせれば原因が表示され、電球マークかAlt + Enterで解決策が提示されることもあります。今回はクラス名に誤りがあるかインポートできていないので、「シンボルを解決できない(Cannot resolve symbol)」というようなことが表示されると思います。

      もし誤字がコメントのみでコードは正しく書けているとしたら、import net.minecraft.item.BlockItem;の行が抜けているかもしれません。このときは自動でインポート文を追加する解決策が提示されるはずです。

  2. 先ほど「ブロックの見た目が変わらない」というような内容の質問を書き込ませていただいたものですが、解決いたしました。
    純粋なフォルダ名のミスでした。
    失礼いたしました。

  3. アイテムを置いたときの見た目が表示されません。
    ファイルの位置や内容を見比べてみても正しいように思えます。
    なぜ見た目が反映されないのか、原因を教えていただけると幸いです。

ポルポラ へ返信するコメントをキャンセル

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください