うまげーむさん

ゲームの情報を主に投稿します。

【マインクラフト Modding】1.16での自作Modの作り方 #6 ブロックの追加

はじめに

どうも。

今回はブロックを追加します。

前回:

www.umagame.info

今回追加するブロック

f:id:Umagame:20210117154525p:plain

今回は前々回作った「熱された石炭」のブロックを作ります。

こちらも一応クラフト用です。

レシピの追加

本題に入る前に、ちょっとだけレシピを増やしました。

f:id:Umagame:20210117153706p:plain

1つ目は「Delicious Meal」です。

牛、豚、鶏、羊、うさぎの肉に対応しています。

f:id:Umagame:20210117153711p:plain

2つ目は「Gold Pack」です。

2つとも石炭と木炭に対応させています。

ブロックの追加

ブロックのクラス

それでは作っていきます。

まずはブロックのクラスを作成します。

f:id:Umagame:20210117153728p:plain

新しくパッケージを作成します。

f:id:Umagame:20210117153731p:plain

ブロックのクラス用のパッケージです。名前は「block」。

f:id:Umagame:20210117153737p:plain

その中に新しくクラスを作成します。

f:id:Umagame:20210117153741p:plain

アイテムのときと同じように、Blockクラス(net.minecraft.block.Block)を継承して作ります。

f:id:Umagame:20210117153745p:plain

豆電球をクリックして、「net.minecraft.block」のBlockをimport。

f:id:Umagame:20210117153748p:plain

もう一回豆電球をクリックして、コンストラクタを追加します。

f:id:Umagame:20210117153753p:plain

自動生成されたコンストラクタをこのように書き換えます。

「Properties.create」の後に、ブロックの材質(マテリアル)を入力します。

今回は石と同じ「ROCK」にしました。

f:id:Umagame:20210117153758p:plain

基本的なブロックの設定は、このようにPropertiesの後にメソッドを重ねて行います。(これ、メソッドチェーンっていうらしいです)

「hardnessAndResistance」で、ブロックの硬さと爆発耐性を設定できます。

硬さの値が大きいと、素手やツールでブロックを壊すときにかかる時間が長くなります。今回はバニラの石炭ブロックと同じ5に設定しました。

爆発耐性はTNTなどの爆発にブロックがどれくらい耐えることができるかです。同じように、バニラの石炭ブロックと同じ6にしました。

バニラのブロックの硬さ、爆発耐性についてはMinecraft Wikiを参照してください:
採掘 - Minecraft Wiki
爆発 - Minecraft Wiki

そして「harvestTool」で、このブロックを収集するのに適切なツールを設定します。(今回はツルハシ)

「harvestLevel」はこのブロックを収集するのに必要なツールのレベル(素材)です。

0が木、1が石、2が鉄、3がダイヤ、4がネザライトです。(バニラのブロックでいうと、石炭が0、鉄鉱石が1、金鉱石が2、黒曜石が3です)

「sound」でブロックを置いたり、壊したりしたときの音を設定できます。(今回は石と同じSTONE)

これでブロックのクラスはOKです。(他にも設定項目はありますが、今回はこの4つで十分です)

コードはこちら。(HeatedCoalBlock.java

package com.umagame.uhcitemsmod.block;

import net.minecraft.block.Block;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraftforge.common.ToolType;

public class HeatedCoalBlock extends Block{

	public HeatedCoalBlock() {
		super(Properties.create(Material.ROCK)
				.hardnessAndResistance(5,6)
				.harvestTool(ToolType.PICKAXE)
				.harvestLevel(0)
				.sound(SoundType.STONE));
	}
}

ブロックの登録用クラス

次にブロックを登録するためのクラスを作ります。

f:id:Umagame:20210117153717p:plain

アイテムのときと同じように、「init」パッケージに作ります。

f:id:Umagame:20210117153720p:plain

名前は「BlockInit」です。

f:id:Umagame:20210119222816p:plain

アイテムのときと同じように、「DeferredRegister」のフィールド「BLOCKS」を作って、それにブロックを登録していきます。

f:id:Umagame:20210117153802p:plain

「register」の後の「"heated_coal_block"」がブロックのIDとなります。

f:id:Umagame:20210117153806p:plain

アイテムのときと同じように、メインクラス(UHCItemsMod.java)でEventBusを登録します。

ブロックはこれでゲームに追加されました...が、このままでは/setblockコマンドでしかブロックを出現させることができません。

理由は「ブロックのアイテム」を追加していないからです。(要するにインベントリ内のアイテムとしてのブロック)

f:id:Umagame:20210117153810p:plain

なので、ItemInitクラスでブロックのアイテムを追加します。

このときにgroupメソッドを呼び出してクリエイティブタブを設定するのを忘れないように。

コードはこちら。(BlockInit.java、UHCItemsMod.java、ItemInit.java

package com.umagame.uhcitemsmod.init;

import com.umagame.uhcitemsmod.UHCItemsMod;
import com.umagame.uhcitemsmod.block.HeatedCoalBlock;

import net.minecraft.block.Block;
import net.minecraftforge.fml.RegistryObject;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;

public class BlockInit {
	public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS,UHCItemsMod.MOD_ID);

	public static final RegistryObject<Block> HEATED_COAL_BLOCK = BLOCKS.register("heated_coal_block", () -> new HeatedCoalBlock());
}
package com.umagame.uhcitemsmod;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.umagame.uhcitemsmod.init.BlockInit;
import com.umagame.uhcitemsmod.init.ItemInit;

import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;

@Mod(UHCItemsMod.MOD_ID)
public class UHCItemsMod
{
    // Directly reference a log4j logger.
    public static final Logger LOGGER = LogManager.getLogger();

    public static final String MOD_ID = "uhcitems";

    public UHCItemsMod() {
        // Register the setup method for modloading
        IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus();
        bus.addListener(this::setup);

        ItemInit.ITEMS.register(bus);
        BlockInit.BLOCKS.register(bus);

        // Register ourselves for server and other game events we are interested in
        MinecraftForge.EVENT_BUS.register(this);
    }

    private void setup(final FMLCommonSetupEvent event)
    {
        // some preinit code
    }
}
package com.umagame.uhcitemsmod.init;

import com.umagame.uhcitemsmod.UHCItemsMod;
import com.umagame.uhcitemsmod.item.HeatedCharcoalItem;
import com.umagame.uhcitemsmod.item.HeatedCoalItem;

import net.minecraft.item.BlockItem;
import net.minecraft.item.Item;
import net.minecraft.item.Item.Properties;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.RegistryObject;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;

public class ItemInit {
	public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS,UHCItemsMod.MOD_ID);

	public static final RegistryObject<Item> HEATED_COAL = ITEMS.register("heated_coal", () -> new HeatedCoalItem());

	public static final RegistryObject<Item> HEATED_CHARCOAL = ITEMS.register("heated_charcoal", () -> new HeatedCharcoalItem());

	public static final RegistryObject<Item> HEATED_COAL_BLOCK = ITEMS.register("heated_coal_block",
			() -> new BlockItem(BlockInit.HEATED_COAL_BLOCK.get(),new Properties().group(ItemGroupInit.UHCITEMS_MOD)));
}

起動して確認

起動して確認してみます。

f:id:Umagame:20210117153814p:plain

ちゃんと追加されました。

f:id:Umagame:20210117153819p:plain

テクスチャなどの設定

テクスチャの追加、ローカライズ(langファイル)をしていきます。

f:id:Umagame:20210117153826p:plain

まず、「assets」に新しくパッケージを作ります。

f:id:Umagame:20210117153829p:plain

名前は「blockstates」です。ここにブロックのモデルを設定するjsonファイルを入れます。

f:id:Umagame:20210117153833p:plain

新しくファイルを作成します。

f:id:Umagame:20210117153836p:plain

名前は「ブロックのID.json」にしてください。

f:id:Umagame:20210119224508p:plain

このように記述します。

f:id:Umagame:20210117153841p:plain

もう一つパッケージを作ります。

f:id:Umagame:20210117153845p:plain

「models」に、「block」というパッケージを作成します。こちらにもブロックのモデルのjsonファイルを入れます。

f:id:Umagame:20210117153849p:plain

同じように、名前は「ブロックのID.json」です。

f:id:Umagame:20210117153852p:plain

このように記述します。

f:id:Umagame:20210117153855p:plain

インベントリ内のアイテムとしてのモデルも必要なので、「models.item」にもjsonファイルを作成します。

f:id:Umagame:20210117153859p:plain

コードはこんな感じ。

f:id:Umagame:20210117153904p:plain

最後にテクスチャの画像ファイルを設定します。「src\main\resources\assets\ModID\textures」に「blocks」というファイルを作ります。

f:id:Umagame:20210117153908p:plain

そこに画像ファイルを置きます。

f:id:Umagame:20210117153911p:plain

Eclipseの方でリフレッシュするのを忘れないように。

起動して確認 その2

起動して確認してみます。

f:id:Umagame:20210117153914p:plain

このように、置いたブロックと手に持っているブロックの両方が正しく描画されていたらOKです。

テクスチャがうまく反映されない場合は、「blockstates」、「models.block」、「models.item」のjsonファイル3つともコードが間違っていないか確認しましょう。

コードはこちら。(blockstatesのheated_coal_block.json、models.blockのheated_coal_block.json、models.itemのheated_coal_block.json

{
	"variants": {
		"": { "model": "uhcitems:block/heated_coal_block" }
	}
}
{
	"parent": "block/cube_all",
	"textures": {
		"all": "uhcitems:blocks/heated_coal_block"
	}
}
{
	"parent": "uhcitems:block/heated_coal_block"
}

ルートテーブル

これでブロックの追加は完了...ですが、このブロックをサバイバルで壊しても何もドロップしません。

これは、ルートテーブルと呼ばれるものをまだ設定していないからです。

f:id:Umagame:20210117153922p:plain

まずパッケージを「data.ModID」に作ります。

f:id:Umagame:20210117153925p:plain

名前は「loot_tables.blocks」にしてください。

f:id:Umagame:20210117153928p:plain

その中にjsonファイルを作ります。名前はブロックのIDと同じにしてください。

f:id:Umagame:20210117153932p:plain

このように記述します。ここをいじると、複数のアイテムをドロップするようにしたり、ドロップ数をランダムにしたりできます。

ルートテーブルの詳しい解説は多分今度やります。

f:id:Umagame:20210117153935p:plain

設定すると、ちゃんとアイテムがドロップすると思います。

コードはこちら。(loot_tables.blocksのheated_coal_block.json

{
	"type": "minecraft:block",
	"pools": [
		{
			"rolls": 1,
			"entries": [
				{
					"type": "minecraft:item",
					"name": "uhcitems:heated_coal_block"
				}
			]
		}
	]
}

おまけ(燃焼時間の設定)

石炭ブロックなので、燃えないとおかしいですよね。

f:id:Umagame:20210119231252p:plain

ItemInitクラスで、このように追記して燃焼時間を設定します。

f:id:Umagame:20210119231131p:plain

これで燃えるようになりました。

さいごに

今回はここまでです。

リクエスト等はTwitterで受け付けています。できる範囲でお答えします。

次回:
www.umagame.info