こんばんは。Nakanishiです。
Discordサーバーを運営中です。
一緒にゆるくMod制作を楽しみませんか?
※)日本語での会話ができる方のみ参加可能です。
条件に合わない方は参加をご遠慮ください。
前回までのおさらい
最低限のブロックの【CLASSファイル】を制作しました。
JavaでModを作ろう☆ ブロック編③ 〜CLASSファイルを書いてブロックを追加しよう〜 - NakanishiのForge1.20.1のJavaMod開発講座
ただ、この状態ではまだ Minecraft に読み込まれていません。
今回は、まず登録用のクラスを作ります。
実際にゲームに登録して取り出せるようにするのは、次回の記事で解説します。
①CLASSファイルを入れるフォルダを作ろう
まず、【CLASSファイル】を整理するための【Package】を作ります。
アイテム編から見て下さった方は【registryフォルダ】を作成済みだと思うので、ここは飛ばしてもらっても大丈夫です。
場所は
src/main/java/com/作者名/Mod名/registry
となります
私の場合は
src/main/java/com/nakanishi/nakanishi_mod/registry
という形になります。

ここに登録CLASSファイルを作っていきます。
②登録用のCLASSファイルを作ろう
登録クラスの名前は自由ですが、後から見ても分かりやすい名前 にしておくことをおすすめします。
今回は例として【NakanishiModBlocks】とします。
💡ポイント
・ModBlocksとしておくと「アイテム登録用のクラス」だとすぐ分かる
・アイテムを登録する場合はModItemsとするなど、用途ごとに分けていくと整理しやすい

registryの中にModBlocksのCLASSファイルが出来ました。
今から、このCLASSファイルを編集していきます。
アイテム編と違うのは、ブロックは置いた状態(ブロック)と、手に持った状態(アイテム)の2つの登録が必要なので、気を付けてください。
まず、順番にブロック状態の登録コードを書いていきます。
今回は1つのCLASSファイルで2つの登録をする為、登録を分ける文(入れ子クラス)を書きます。
例)
public class NakanishiModBlocks {
public static class Blocks{}

そして、この中にブロックの登録コードを書いていきます。
例)
public class NakanishiModBlocks {
public static class Blocks{
public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, Nakanishi_Mod.MOD_ID);
}
}

💡ポイント
・<Block>はnet.minecraft.world.level.blockを選択してください。
・createはIForgeRegistryを選択してください。
・最後のセミコロン【;】を忘れないように。
・DeferredRegisterとはForgeで用意されている「登録箱」のようなもので、アイテムやブロックをこの箱に入れておくと、ゲーム起動時に自動で登録してくれます。
次にブロックを登録していきます。
例)
public static final RegistryObject<Block> PRISMARINE_BLOCK = BLOCKS.register("prismarine_block" , Block_Prismarine_Block::new);

💡ポイント
・RegistryObject<Block>の<Block>はnet.minecraft.world.block.Blockを指定します。
→ 間違えて別のBlockを指定するとエラーになります。
・.registerはString name、Supplierを使います。
・登録名(ここでは "prismarine_block")は、
・resources/assets/〇〇modid/textures/block/ 内のpngファイル名
・resources/assets/〇〇modid/models/block/ 内のjsonファイル名
・resources/assets/〇〇modid/models/item/ 内のjsonファイル名
・resources/assets/〇〇modid/blockstates/ 内のjsonファイル名
と一致している必要があります。
次にブロックをメインクラスに読み込ませる為の1文を追加します。
例)
public static void register(IEventBus eventBus){BLOCKS.register(eventBus);}

💡ポイント
・ここでのBLOCKS.registerは(IEventBus bus)を選択します。
ここまでで、ブロック状態の登録が完了となります。
この流れで、アイテム状態の登録もしていきます。
まず、新しい小さなクラス(入れ子クラス) を作ります。
例)
public static class BlockItems{}

💡ポイント
・新しい入れ子クラス(BlockItem)は先ほど作った入れ子クラス(Blocks)の外側に書いてください。
・もし(Blocks)の内側に入っていると、エラーが起きますので注意ください。
そうしたら、先ほどと同じ要領で【DeferredRegister】を書いていきます。
例)
public static final DeferredRegister<Item> BLOCK_ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, Nakanishi_Mod.MOD_ID);

💡ポイント
ここでの<Item>はnet.minecraft.world.item.Itemです。
次にアイテムを登録していきます。
例)
public static final RegistryObject<Item> PRISMARINE_BLOCK = BLOCK_ITEMS.register("prismarine_block"
, () -> new BlockItem(Blocks.PRISMARINE_BLOCK.get(), new Item.Properties()));

💡ポイント
・BlockItem(Blocks)ここでのBlocksは
自分で作ったブロック登録用の入れ子クラス を指しています。
私の場合では
com.nakanishi.Nakanishi_Mod.registry.NakanishiModBlock
の中にあるBlocksを使っています。
・環境によっては自分のMod名やパッケージ名が違うので、必ず自分の環境に合わせて書き換えてください。
最後にアイテムをメインクラスに読み込ませる為の1文を追加します。
例)
public static void register(IEventBus eventBus){BLOCK_ITEMS.register(eventBus);}

これでブロックの登録CLASSファイルは完成です。
ここまでお疲れ様でした☆
無事にエラーなく書けたでしょうか?
今回はブロックの登録CLASSファイルを書いてみました。
次回は、メインクラスにこの登録クラスを読み込ませて、実際にゲームで取り出してみようと思います。
もしこの記事が参考になった、または「JavaでMod制作を始めてみたい!」と思っていただけたら、ぜひ読者登録をお願いします。
それではまた次回お会いしましょう。
ここまでお読みいただき、ありがとうございました。
【次回記事】
JavaでModを作ろう☆ ブロック編⑤ 〜登録して動作確認!ブロック完成編〜 - NakanishiのForge1.20.1のJavaMod開発講座