ブロックの追加
ブロックのクラス
それでは作っていきます。
まずはブロックのクラスを作成します。
新しくパッケージを作成します。
ブロックのクラス用のパッケージです。名前は「block」。
その中に新しくクラスを作成します。
アイテムのときと同じように、Blockクラス(net.minecraft.block.Block)を継承して作ります。
豆電球をクリックして、「net.minecraft.block」のBlockをimport。
もう一回豆電球をクリックして、コンストラクタを追加します。
自動生成されたコンストラクタをこのように書き換えます。
「Properties.create」の後に、ブロックの材質(マテリアル)を入力します。
今回は石と同じ「ROCK」にしました。
基本的なブロックの設定は、このように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));
}
}
ブロックの登録用クラス
次にブロックを登録するためのクラスを作ります。
アイテムのときと同じように、「init」パッケージに作ります。
名前は「BlockInit」です。
アイテムのときと同じように、「DeferredRegister」のフィールド「BLOCKS」を作って、それにブロックを登録していきます。
「register」の後の「"heated_coal_block"」がブロックのIDとなります。
アイテムのときと同じように、メインクラス(UHCItemsMod.java)でEventBusを登録します。
ブロックはこれでゲームに追加されました...が、このままでは/setblockコマンドでしかブロックを出現させることができません。
理由は「ブロックのアイテム」を追加していないからです。(要するにインベントリ内のアイテムとしてのブロック)
なので、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
{
public static final Logger LOGGER = LogManager.getLogger();
public static final String MOD_ID = "uhcitems";
public UHCItemsMod() {
IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus();
bus.addListener(this::setup);
ItemInit.ITEMS.register(bus);
BlockInit.BLOCKS.register(bus);
MinecraftForge.EVENT_BUS.register(this);
}
private void setup(final FMLCommonSetupEvent event)
{
}
}
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)));
}
起動して確認
起動して確認してみます。
ちゃんと追加されました。
テクスチャなどの設定
テクスチャの追加、ローカライズ(langファイル)をしていきます。
まず、「assets」に新しくパッケージを作ります。
名前は「blockstates」です。ここにブロックのモデルを設定するjsonファイルを入れます。
新しくファイルを作成します。
名前は「ブロックのID.json」にしてください。
このように記述します。
もう一つパッケージを作ります。
「models」に、「block」というパッケージを作成します。こちらにもブロックのモデルのjsonファイルを入れます。
同じように、名前は「ブロックのID.json」です。
このように記述します。
インベントリ内のアイテムとしてのモデルも必要なので、「models.item」にもjsonファイルを作成します。
コードはこんな感じ。
最後にテクスチャの画像ファイルを設定します。「src\main\resources\assets\ModID\textures」に「blocks」というファイルを作ります。
そこに画像ファイルを置きます。
Eclipseの方でリフレッシュするのを忘れないように。
起動して確認 その2
起動して確認してみます。
このように、置いたブロックと手に持っているブロックの両方が正しく描画されていたら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"
}
ルートテーブル
これでブロックの追加は完了...ですが、このブロックをサバイバルで壊しても何もドロップしません。
これは、ルートテーブルと呼ばれるものをまだ設定していないからです。
まずパッケージを「data.ModID」に作ります。
名前は「loot_tables.blocks」にしてください。
その中にjsonファイルを作ります。名前はブロックのIDと同じにしてください。
このように記述します。ここをいじると、複数のアイテムをドロップするようにしたり、ドロップ数をランダムにしたりできます。
ルートテーブルの詳しい解説は多分今度やります。
設定すると、ちゃんとアイテムがドロップすると思います。
コードはこちら。(loot_tables.blocksのheated_coal_block.json)
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "uhcitems:heated_coal_block"
}
]
}
]
}