NakanishiのForge1.20.1のJavaMod開発講座

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

JavaでMinecraftのModを作ろう☆ GUIブロック編⑥ 〜Screenクラスを仮で作ろう〜

こんばんは。Nakanishiです。

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

Kazushi_Nakanishiのこっそりサーバー

一緒にゆるくMod制作を楽しみませんか?
初心者も大歓迎です。

※)日本語での会話ができる方のみ参加可能です。
  条件に合わない方は参加をご遠慮ください。

 

 

前回のおさらい

仮のMenuクラスを登録して赤線を消しました。

JavaでMinecraftのModを作ろう☆ GUIブロック編⑤ 〜Menuクラスを登録しよう〜 - NakanishiのForge1.20.1のJavaMod開発講座

今回はScreenクラスを仮で実装し、Menuクラスと紐づけるところまで行いたいと思います。

ScreenクラスはGUI画面担当のクラスになりまして、テクスチャを描画するクラスになります。
Menuクラスが中身担当、Screenクラスが見た目担当というイメージで良いと思います。

 

 

①仮のScreenクラスを作ろう

名前は【PaleOakBarrelScreen】にしました。

樽のScreenクラスは【AbstractContainerScreen】というクラスになります。

AbstractContainerScreen】というクラスは、コンテナ(スロットを持つインベントリやブロック)に対応するGUI画面の基底クラスになります。

 

赤線が引かれているのは必要なパラメータと引数、メソッドがない為なので、
最低限のものをいつものやり方で出してあげてください。

 

仮のパラメータと引数、メソッドを表示した画面

コンストラクタの引数を渡していきますが、その前にクラスにMenuクラスを紐づけておきます。
例)

public class PaleOakBarrelScreen extends AbstractContainerScreen<PaleOakBarrelMenu>

 

そうすると第一引数に赤線が引かれます。
ここの赤線を消すため、Menuクラスを紐づけてあげます。

 

例)

public PaleOakBarrelScreen(PaleOakBarrelMenu p_97741_, Inventory p_97742_, Component p_97743_) {
        super(p_97741_, p_97742_, p_97743_);
    }

Menuクラスを紐づけた画面

パラメータと引数が仮のものになっているので、ここを直してあげます。
例)

public PaleOakBarrelScreen(PaleOakBarrelMenu menu, Inventory playerInventory, Component title) {
        super(menu, playerInventory, title);
    }

 

 

次にメソッド(renderBg)の引数が仮のものになっているので、直してあげます。

例)

@Override
    protected void renderBg(GuiGraphics graphics, float partialTicks, int mouseX, int mouseY) {

    }

 

 

ここまで出来たら、次にScreenクラスの登録を行います。

 

②Screenクラスを登録しよう

名前は【NakanishiModScreen】にしました。

まず、先頭にアノテーションを書いていきます。
例)

@Mod.EventBusSubscriber(modid = Nakanishi_Mod.MOD_ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD)

 

 

次にClientSetupするための構文を書きます。

例)

@SubscribeEvent
    public static void onClientSetup(FMLClientSetupEvent event) {}

 

 

そうしたらonClientSetupの{}内に以下の構文を書いていきます。
例)

event.enqueueWork*1;

 

これで完全にMenuクラスとScreenクラスが紐づけられScreenクラスの登録も出来ました。

 

 

ここまでお疲れ様でした☆

 

もしこの記事が参考になった、または「JavaでMod制作を始めてみたい!」と思っていただけたら、ぜひ読者登録をお願いします。
それではまた次回お会いしましょう。
ここまでお読みいただき、ありがとうございました。

 

*1:) ->
              MenuScreens.register(NakanishiModMenuTypes.PALE_OAK_BARREL_MENU.get(),
                        PaleOakBarrelScreen::new

JavaでMinecraftのModを作ろう☆ GUIブロック編⑤ 〜Menuクラスを登録しよう〜

こんばんは。Nakanishiです。

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

Kazushi_Nakanishiのこっそりサーバー

一緒にゆるくMod制作を楽しみませんか?
初心者も大歓迎です。

※)日本語での会話ができる方のみ参加可能です。
  条件に合わない方は参加をご遠慮ください。

 

 

前回のおさらい

仮のMenuクラスを作りました。

JavaでMinecraftのModを作ろう☆ GUIブロック編④ 〜仮のMenuクラスを作ろう〜 - NakanishiのForge1.20.1のJavaMod開発講座

今回は仮のMenuクラスを登録して、赤線が消えるまで進めようと思います。

 

 

①Menu登録クラスを作ろう

名前は【NakanishiModMenuTypes】にしました。

 

まず、登録する為の窓口を作ってあげます。
例)

public static final DeferredRegister<MenuType<?>> MENU_TYPES = DeferredRegister.create(ForgeRegistries.MENU_TYPES, Nakanishi_Mod.MOD_ID);

 

次に【PaleOakBarrelMenu】を登録していきます。

例)

public static final RegistryObject<MenuType<PaleOakBarrelMenu>> PALE_OAK_BARREL_MENU = MENU_TYPES.register("pale_oak_barrel_menu",
                    () -> new MenuType<>(PaleOakBarrelMenu::new));

 

ここで赤線が引かれますが、これは【PaleOakBarrelMenu】のコンストラクタが【protected】になっている為と、Containerを受け取るコンストラクタを設定していない為なので、それを修正すれば直ります。

ついでに、引数も渡しておきます。

 

なので、【PaleOakBarrelMenu】を開いてもらって、修正をします。

例)

public class PaleOakBarrelMenu extends AbstractContainerMenu {
    public PaleOakBarrelMenu(int id, Inventory playerInventory, Container container) {
        super(NakanishiModMenuTypes.PALE_OAK_BARREL_MENU.get(), id);
    }

 

赤線の消えたPaleOakBarrelMenu

これで【PaleOakBarrelMenu】の赤線は消えますが、登録クラスの赤線はまだ消えていません。

 

なので、もう1つコンストラクタを渡してあげます。

例)

public PaleOakBarrelMenu(int id, Inventory playerInventory, FriendlyByteBuf buf) {
        this(id, playerInventory, new SimpleContainer(27));
    }

 

FriendlyByteBufを受け取るコンストラクタを追加した画面

これで登録クラスの赤線も消えます。

💡ポイント

SimpleContainer(27)はコンテナに27スロット設定しますという意味です

 

 

次に登録クラスの締めの文章を入力します。

例)

public static void register(IEventBus eventBus) {
        MENU_TYPES.register(eventBus);
    }

 

 

最後にメインクラスにMenu登録クラスを登録して完了です。

例)

NakanishiModMenuTypes.MENU_TYPES.register(bus);

 

 

ここまでお疲れ様でした☆

 

もしこの記事が参考になった、または「JavaでMod制作を始めてみたい!」と思っていただけたら、ぜひ読者登録をお願いします。
それではまた次回お会いしましょう。
ここまでお読みいただき、ありがとうございました。

 

次回記事

JavaでMinecraftのModを作ろう☆ GUIブロック編⑥ 〜Screenクラスを仮で作ろう〜 - NakanishiのForge1.20.1のJavaMod開発講座

 

JavaでMinecraftのModを作ろう☆ GUIブロック編④ 〜仮のMenuクラスを作ろう〜

こんばんは。Nakanishiです。

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

Kazushi_Nakanishiのこっそりサーバー

一緒にゆるくMod制作を楽しみませんか?
初心者も大歓迎です。

※)日本語での会話ができる方のみ参加可能です。
  条件に合わない方は参加をご遠慮ください。

 

 

前回のおさらい

仮のBlockEntityのクラスを登録しました。

JavaでMinecraftのModを作ろう☆ GUIブロック編③ 〜仮のBlockEneityを登録しよう〜 - NakanishiのForge1.20.1のJavaMod開発講座

今回はMenuクラスを仮で作ろうと思います。

 

 

①仮のMenuクラスをクラスを作ろう

名前は【PaleOakBarrelMenu】にしました。

スロットやインベントリを持つGUIブロックのクラスは【AbstractContainerMenu】になります。

 

ここで赤線が引かれるのは、最低限のメソッドと引数を用意していないからです。
今までのやり方(Show Context Actions)で赤線を消してあげましょう。

 

仮のパラメータと引数、メソッドを表示した画面

まず、メソッドの仮の引数を直してあげます。

例)

@Override
    public ItemStack quickMoveStack(Player player, int index) {
        return null;
    }

 

@Override
    public boolean stillValid(Player player) {
        return false;
    }

 

💡ポイント

quickMoveStackShift+クリックした時のアイテム移動処理を設定します

stillValidプレイヤーがこのブロックを操作出来るかを設定します

 

とりあえず今は仮なので、returnはそのままにしておきます。

 

次に仮のパラメータと引数を直してあげようと思います。

例)

protected PaleOakBarrelMenu(int id, Inventory playerInventory, Container container) {
        super(id);
    }

 

 

赤線が引かれているのは必要な引数が足りない為で合って、次回修正します。

 

💡ポイント

Inventory playerInventoryはプレイヤーが持っているアイテム欄です

Container containerはブロック(樽やかまどなど)が持っているアイテム欄です

 

これで仮のMenuクラスは完成です。

次回はこのMenuクラスを登録して、赤線を消すまで行おうと思います。

 

 

ここまでお疲れ様でした☆

 

もしこの記事が参考になった、または「JavaでMod制作を始めてみたい!」と思っていただけたら、ぜひ読者登録をお願いします。
それではまた次回お会いしましょう。
ここまでお読みいただき、ありがとうございました。

 

次回記事

JavaでMinecraftのModを作ろう☆ GUIブロック編⑤ 〜Menuクラスを登録しよう〜 - NakanishiのForge1.20.1のJavaMod開発講座

 

JavaでMinecraftのModを作ろう☆ GUIブロック編③ 〜仮のBlockEneityを登録しよう〜

こんばんは。Nakanishiです。

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

Kazushi_Nakanishiのこっそりサーバー

一緒にゆるくMod制作を楽しみませんか?
初心者も大歓迎です。

※)日本語での会話ができる方のみ参加可能です。
  条件に合わない方は参加をご遠慮ください。

 

 

前回のおさらい

仮のBlockEntityのクラスを作りました。

JavaでMinecraftのModを作ろう☆ GUIブロック編② 〜仮のBlockEneityのクラスを作ろう〜 - NakanishiのForge1.20.1のJavaMod開発講座

今回は登録をして、BlockEneityのクラスの赤線を消すところまでしようと思います。

 

 

①BlockEntityの登録クラスを作ろう

名前は【NakanishiModBlockEntity】にしました。

 

 

まず、登録する為の窓口を作ってあげます。
例)

public static final DeferredRegister<BlockEntityType<?>> BLOCK_ENTITIES = DeferredRegister.create(ForgeRegistries.BLOCK_ENTITY_TYPES, Nakanishi_Mod.MOD_ID);

 

💡ポイント

<?>どのBlockEntityでも扱えるようにするという意味です。

Nakanishi_Modは自分のメインクラスを指定してください。

 

ここまで書けましたら、早速PaleOakBarrelBlockEntity】を登録していこうと思います。

例)

public static final RegistryObject<BlockEntityType<PaleOakBarrelBlockEntity>> PALE_OAK_BARREL = BLOCK_ENTITIES.register("pale_oak_barrel",
            () -> BlockEntityType.Builder.of(PaleOakBarrelBlockEntity::new,
                    NakanishiModBlocks.Blocks.PALE_OAK_BARREL.get()).build(null));

 

仮の登録

ここで::newが赤線が引かれているのは、まだ【PaleOakBarrelBlockEntity】が【protected】になっているからです。

 

なので、【PaleOakBarrelBlockEntity】を修正していきます。

 

現段階で【PaleOakBarrelBlockEntity】がこうなっていると思います。

public class PaleOakBarrelBlockEntity extends RandomizableContainerBlockEntity {
    protected PaleOakBarrelBlockEntity(BlockPos pos, BlockState state) {
        super(pos, state);
    }

 

ここの【protected】を【public】に変える事で、登録文の赤線が消えます。

例)

public PaleOakBarrelBlockEntity(BlockPos pos, BlockState state) {
        super(pos, state);
    }

 

 

これで登録文の::newの赤線が消えます。

 

次にまだ【PaleOakBarrelBlockEntity】に赤線が出ているので、必要な引数を渡して赤線を消していこうと思います。

 

例)

super(NakanishiModBlockEntity.PALE_OAK_BARREL.get(), pos, state);

 

修正したBlockEneityのクラス

これで【PaleOakBarrelBlockEntity】の赤線が消えて、仮のBlockEneityのクラスが完成となります。

 

最後にメインクラスに登録クラスと記入して、今回は完了となります。

例)

NakanishiModBlockEntity.BLOCK_ENTITIES.register(bus);

 

 

ここまでお疲れ様でした☆

次回はブロックの中身とプレイヤーのインベントリをつなぐ“橋渡し”となる、Menuクラスを仮で作っていこうと思います。

 

もしこの記事が参考になった、または「JavaでMod制作を始めてみたい!」と思っていただけたら、ぜひ読者登録をお願いします。
それではまた次回お会いしましょう。
ここまでお読みいただき、ありがとうございました。

 

次回記事

JavaでMinecraftのModを作ろう☆ GUIブロック編④ 〜仮のMenuクラスを作ろう〜 - NakanishiのForge1.20.1のJavaMod開発講座

 

JavaでMinecraftのModを作ろう☆ GUIブロック編② 〜仮のBlockEneityのクラスを作ろう〜

こんばんは。Nakanishiです。

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

Kazushi_Nakanishiのこっそりサーバー

一緒にゆるくMod制作を楽しみませんか?
初心者も大歓迎です。

※)日本語での会話ができる方のみ参加可能です。
  条件に合わない方は参加をご遠慮ください。

 

 

前回のおさらい

仮のBarrelBlockを作りました。

JavaでMinecraftのModを作ろう☆ GUIブロック編① 〜仮のブロックを作ろう〜 - NakanishiのForge1.20.1のJavaMod開発講座

今回はBlockEntityというクラスを仮の形で作っていこうと思います。

例えば樽やかまどのように、中にアイテムを保持するブロックは必ずBlockEntityを持っています

 

※)今回の記事は応用編なので、基礎編を読んでいる前提です。

 

まずBlockEneityの説明ですが、GUIブロックの中身やデータを保存するクラスになります。

BlockEneityがないままで仮にGUI表示が出来たとして、BlockEneityがなければただのスクリーンでしかありません。

なので、GUIブロックには必須のクラスとなります。

 

①BlockEntityのクラスを作ろう

名前は【PaleOakBarrelBlockEntity】にしました。

 

樽やチェストのようなブロックは【RandomizableContainerBlockEntity】というクラスを使います。

RandomizableContainerBlockEntity】というクラスはインベントリと持ち、必要ならダンジョンのチェストのように、ランダム生成も出来るコンテナ用のブロックのクラスになります。

 

赤線が引かれているのは必要な引数とメソッドが足りない為です。

赤線のところで右クリックをして【Show Context Actions】を選択します。

そうしたらまず、【Implement methods】をして、最低限必要なメソッドを表示させてあげてください。

 

確認画面

この画面が出たら【OK】で大丈夫です。

 

そうすると5つ@Overrideが出て、メソッドが表示されます

それでも赤線が引かれていると思いますので、またShow Context Actions】を選択して、Creat constructor matching super】を選んであげてください。

 

仮のパラメータと引数、メソッドが表示された画面

このままでも良いのですが、パラメータと引数が仮表示になっているので整えてあげます。

 

例)

protected PaleOakBarrelBlockEntity(BlockPos pos, BlockState state) {
        super(pos, state);
    }

 

赤線が引かれているのは引数が足りないからであって、まだ入力出来ないので大丈夫です。BlockEneityを登録した後に修正します。

 

次に【setItems】と【createMenu】のメソッドの仮の引数を直してあげます。

 

setItems例)

@Override
    protected void setItems(NonNullList<ItemStack> items) {

    }

 

createMenu例)

@Override
    protected AbstractContainerMenu createMenu(int id, Inventory playerInventory) {
        return null;
    }

 

修正したメソッド

 

これで仮のBlockEntityのクラスは一旦完成です。

赤線が引かれていますが、次回修正します。

 

 

ここまでお疲れ様でした☆

次回は今回作ったBlockEneityのクラスを登録して、赤線が消えるまでしようと思います。

 

もしこの記事が参考になった、または「JavaでMod制作を始めてみたい!」と思っていただけたら、ぜひ読者登録をお願いします。
それではまた次回お会いしましょう。
ここまでお読みいただき、ありがとうございました。

 

次回記事

JavaでMinecraftのModを作ろう☆ GUIブロック編③ 〜仮のBlockEneityを登録しよう〜 - NakanishiのForge1.20.1のJavaMod開発講座

 

JavaでMinecraftのModを作ろう☆ GUIブロック編① 〜仮のブロックを作ろう〜

こんばんは。Nakanishiです。

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

Kazushi_Nakanishiのこっそりサーバー

一緒にゆるくMod制作を楽しみませんか?
初心者も大歓迎です。

※)日本語での会話ができる方のみ参加可能です。
  条件に合わない方は参加をご遠慮ください。

 

 

今回からGUIのあるブロックの作り方を書いていきます。
GUIのあるブロックはチェスト、かまど、石切台など色々ありますが、
今回は一番シンプルな樽の作り方を紹介していこうと思います。

今回の記事は応用編なので、基礎編を読んでいる前提です。

今回の目標

①テクスチャ、JSONファイルを用意しよう

pale_oak_barrel_bottom

pale_oak_barrel_side

pale_oak_barrel_top

pale_oak_barrel_top_open

樽に必要なテクスチャは上記の4枚になります。

次に【models/block】を用意していきます。

models/block】は閉じている状態と開いている状態の2つが必要になります。

 

pale_oak_barrel.json例)

{
  "parent": "minecraft:block/cube_bottom_top",
  "textures": {
    "bottom": "nakanishi_mod:block/pale_oak_barrel_bottom",
    "side": "nakanishi_mod:block/pale_oak_barrel_side",
    "top": "nakanishi_mod:block/pale_oak_barrel_top"
  }
}

 

pale_oak_barrel_open.json例)

{
  "parent": "minecraft:block/cube_bottom_top",
  "textures": {
    "bottom": "nakanishi_mod:block/pale_oak_barrel_bottom",
    "side": "nakanishi_mod:block/pale_oak_barrel_side",
    "top": "nakanishi_mod:block/pale_oak_barrel_top_open"
  }
}

 

これで【models/block】は完成です。次に【models/item】を書いていきます。

pale_oak_barrel.json例)

{
  "parent": "nakanishi_mod:block/pale_oak_barrel"
}

 

これで【model】は完成です。次に【blockstate】を書いていきます。

pale_oak_barrel.json例)

{
  "variants": {
    "facing=down,open=false": {
      "model": "nakanishi_mod:block/pale_oak_barrel",
      "x": 180
    },
    "facing=down,open=true": {
      "model": "nakanishi_mod:block/pale_oak_barrel_open",
      "x": 180
    },
    "facing=east,open=false": {
      "model": "nakanishi_mod:block/pale_oak_barrel",
      "x": 90,
      "y": 90
    },
    "facing=east,open=true": {
      "model": "nakanishi_mod:block/pale_oak_barrel_open",
      "x": 90,
      "y": 90
    },
    "facing=north,open=false": {
      "model": "nakanishi_mod:block/pale_oak_barrel",
      "x": 90
    },
    "facing=north,open=true": {
      "model": "nakanishi_mod:block/pale_oak_barrel_open",
      "x": 90
    },
    "facing=south,open=false": {
      "model": "nakanishi_mod:block/pale_oak_barrel",
      "x": 90,
      "y": 180
    },
    "facing=south,open=true": {
      "model": "nakanishi_mod:block/pale_oak_barrel_open",
      "x": 90,
      "y": 180
    },
    "facing=up,open=false": {
      "model": "nakanishi_mod:block/pale_oak_barrel"
    },
    "facing=up,open=true": {
      "model": "nakanishi_mod:block/pale_oak_barrel_open"
    },
    "facing=west,open=false": {
      "model": "nakanishi_mod:block/pale_oak_barrel",
      "x": 90,
      "y": 270
    },
    "facing=west,open=true": {
      "model": "nakanishi_mod:block/pale_oak_barrel_open",
      "x": 90,
      "y": 270
    }
  }
}

 

これで【blockstate】は完成で、見た目のJSONファイルは完成です。

 

 

②CLASSファイルを作ろう

名前は【Block_Pale_Oak_Barrel】にしました。

 

樽は【BarrelBlock】を使います。

例)

extends BarrelBlock

 

赤線が引かれてますので、仮のパラメータと引数を表示させてあげましょう。

赤線のところで右クリックをして【Show Context Actions】を選択します。

そうしたら【Creat constructor matching super】を選択してください。

 

仮のパラメータと引数を表示

そうしたら()内を消してあげて、引数を入力していきます。

例)

super(Properties.copy(Blocks.BARREL));

 

仮で完成したCLASSファイル

ここではまだブロックの状態で、GUIは開けません。

GUI設定は後ほど追記していくので、この状態で置いておきます。

 

次にブロック登録をしていきます。

ブロック登録例)

public static final RegistryObject<Block> PALE_OAK_BARREL = BLOCKS.register("pale_oak_barrel", Block_Pale_Oak_Barrel::new);

 

アイテム登録例)

public static final RegistryObject<Item> PALE_OAK_BARREL = BLOCK_ITEMS.register("pale_oak_barrel"
                , () -> new BlockItem(Blocks.PALE_OAK_BARREL.get(), new Item.Properties()));

 

これで【Pale Oak Barrel】がゲーム内に登録されました。

それでは残りの登録もしていきましょう。

 

 

③設定を追加しよう

まず翻訳を追記します。

"item.nakanishi_mod.pale_oak_barrel": "Pale Oak Barrel",
"block.nakanishi_mod.pale_oak_barrel": "Pale Oak Barrel"

 

次にクリエイティブタブに追加して、ワールドに置けるか確認してみます。

 

設置確認

BarrelBlock】には内部で向きを設定してあるので、このように横向き、縦向きに設置することが出来ます。

 

ここまで出来たら、最低限のブロックは完成です。

 

 

ここまでお疲れ様でした☆

次回は【BlockEntity】というクラスについての説明と、実際に仮のものを作ってみようと思います。

 

もしこの記事が参考になった、または「JavaでMod制作を始めてみたい!」と思っていただけたら、ぜひ読者登録をお願いします。
それではまた次回お会いしましょう。
ここまでお読みいただき、ありがとうございました。

 

次回記事

JavaでMinecraftのModを作ろう☆ GUIブロック編② 〜仮のBlockEneityのクラスを作ろう〜 - NakanishiのForge1.20.1のJavaMod開発講座

 

お知らせ(2025.09.18)

こんばんは。Nakanishiです。

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

Kazushi_Nakanishiのこっそりサーバー

一緒にゆるくMod制作を楽しみませんか?
※)日本語での会話ができる方のみ参加可能です。
  条件に合わない方は参加をご遠慮ください。


お知らせです。

最近家が忙しいのと、障害が悪化した為、執筆が遅れています。

 

Discord内でリクエストを受けたものは制作しているので、
もしリクエストがあればそちらで対応します。

 

初心者でも歩幅を合わせて教えますので、
気軽に訪問ください。

 

直近ではGUIのあるブロックを聞かれたので、
アカシアの樽の製作をしました。

 

アカシアの樽

GUI表示

 

このように自分の専門外の事でも、新しく挑戦しているので、
気になった方は是非Discordへお越しください。

 

以上、Nakanishiでした。