Minecraft Forge 1.15でブロックを追加してみる

Overview

前回Hello Worldは出来たので、今回はブロックを追加してみる。
Forge公式ドキュメントを参照しながらやることにした。
せっかくなら古い関数とかは使いたくないし、新しいバージョンのドキュメントを頑張って読んでみる。

Block Registerってどうやるの?

まず最初にやるとしたらブロック追加だろう。
Blockのドキュメント を見ても何が何やらだったが、 Contept/Registrie を見てみたら参考になりそうなことが書いてあった。
どうやら、おおまかに二つの方法があるのかな。

@SubscribeEvent
public void registerBlocks(RegistryEvent.Register event) {
    event.getRegistry().registerAll(block1, block2, ...);
}

private static final DeferredRegister BLOCKS = new DeferredRegister<>(ForgeRegistries.BLOCKS, MODID);
public static final RegistryObject ROCK_BLOCK = BLOCKS.register("rock", () -> new Block(Block.Properties.create(Material.ROCK)));
public ExampleMod() {
    BLOCKS.register(FMLJavaModLoadingContext.get().getModEventBus());
}

今回は下のDeferredRegisterなるものを使ってみる。
IntelliJだと「ctrl+Q」でJavaDocなるドキュメントが参照できるらしいので参考にする。
Utility class to help with managing registry entries. 
Maintains a list of all suppliers for entries and registers them during the proper Register event.
Suppliers should return NEW instances every time.

・・・なるほど?
一行目のDeferredRegister関数で、ブロック類をRegisterするためのインスタンスを作っている。
二行目でこのRegisterにブロックを登録していると。
引数一つ目はブロックやアイテムの名前、引数二つ目はラムダ式で新しいインスタンスを毎回あげるようにする。
この例ではMaterialのみ指定したブロックのインスタンスを返しているが、他の固さなどのオプションも指定できそう。
で、最後にメイン関数内でDefferedRegisterのregister関数を呼び出す。ここでイベントバスを引数に与えて、あとは勝手にブロックを登録してくれる模様。

とりあえず動かす

自分で色々追加するのは後にして、とりあえず動かしてみる。
ブロックのついでに、ブロックをアイテム化したものもついでに登録する。
JavaDocで参照できるサンプルをそのままコピペしてみた。
cube

サンプルを貼り付けただけなのになぜかエラー。引数の形式が違う。
ダメ元で型変換してやったら動いた。
「net.minecraftforge.registries.IForgeRegistryEntry」から「net.minecraft.block.Block」への型変換は上手くいくようだ。
cube

ここまでやったらとりあえず走らせてみる。
クリエイティブモードにして、Miscカテゴリにアイテムが追加されているかを確認する。
cube

無事?に追加されている。
テクスチャの設定を何もしていないので、デフォルトの毒々しい色のブロックが設置されるが、壊してもアイテム化すらしない。
ここら辺を追加する。


cube