NakanishiのForge1.20.1のJavaMod開発講座

MoreCropsDelightの作者、NakanishiがMod制作について書いていきます。

JavaでMinecraftのModを作ろう☆ ブロック編④ 〜registryクラスを作ってブロックを登録しよう〜

こんばんは。Nakanishiです。

Discordサーバーを運営中です。

Kazushi_Nakanishiのこっそりサーバー

一緒にゆるく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

という形になります。

▲ Registry パッケージを作成した画面

ここに登録CLASSファイルを作っていきます。

 

 

②登録用のCLASSファイルを作ろう

登録クラスの名前は自由ですが、後から見ても分かりやすい名前 にしておくことをおすすめします。

今回は例として【NakanishiModBlocks】とします。

 

💡ポイント

ModBlocksとしておくと「アイテム登録用のクラス」だとすぐ分かる

・アイテムを登録する場合はModItemsとするなど、用途ごとに分けていくと整理しやすい

registryの中にModBlocksCLASSファイルが出来ました。

今から、この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を選択してください。

createIForgeRegistryを選択してください。

・最後のセミコロン【;】を忘れないように。

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を指定するとエラーになります。

.registerString 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開発講座