NakanishiのForge1.20.1のJavaMod開発講座

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

JavaでMinecraftのModを作ろう☆ 木材編⑦ 〜ドアを作ろう〜

こんばんは。Nakanishiです。

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

Kazushi_Nakanishiのこっそりサーバー

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

 

 

前回のおさらい

木材のフェンスゲートを追加しました。

JavaでMinecraftのModを作ろう☆ 木材編⑥ 〜フェンスゲートを作ろう〜 - NakanishiのForge1.20.1のJavaMod開発講座

今回はドアを作っていこうと思います。

 

 

JSONファイルを用意しよう

pale_oak_door_top

pale_oak_door_bottom

pale_oak_door

ドアはブロック状態のテクスチャが2枚、アイテム状態のテクスチャが1枚必要になります。

ドアは2ブロックの高さがあるので、必要なテクスチャは上下で2枚必要になります。

これらのpngテクスチャを【textures/block】に入れてください。

そしてアイテム状態のテクスチャを【textures/item】に入れてください。

 

次に【model】を書いていきます。

models/block】は左右上下の開閉パターンを書くので8つのJSONファイルが必要になります。

 

pale_oak_door_bottom_left.json例)

{
  "parent": "minecraft:block/door_bottom_left",
  "textures": {
    "bottom": "nakanishi_mod:block/pale_oak_door_bottom",
    "top": "nakanishi_mod:block/pale_oak_door_top"
  }
}

pale_oak_door_bottom_left.json

 

pale_oak_door_bottom_left_open.json例)

{
  "parent": "minecraft:block/door_bottom_left_open",
  "textures": {
    "bottom": "nakanishi_mod:block/pale_oak_door_bottom",
    "top": "nakanishi_mod:block/pale_oak_door_top"
  }
}

 

pale_oak_door_bottom_left_open.json

 

pale_oak_door_bottom_right.json例)

{
  "parent": "minecraft:block/door_bottom_right",
  "textures": {
    "bottom": "nakanishi_mod:block/pale_oak_door_bottom",
    "top": "nakanishi_mod:block/pale_oak_door_top"
  }
}

 

pale_oak_door_bottom_right.json

 

pale_oak_door_bottom_right_open.json例)

{
  "parent": "minecraft:block/door_bottom_right_open",
  "textures": {
    "bottom": "nakanishi_mod:block/pale_oak_door_bottom",
    "top": "nakanishi_mod:block/pale_oak_door_top"
  }
}

 

pale_oak_door_bottom_right_open.json


pale_oak_door_top_left.json例)

{
  "parent": "minecraft:block/door_top_left",
  "textures": {
    "bottom": "nakanishi_mod:block/pale_oak_door_bottom",
    "top": "nakanishi_mod:block/pale_oak_door_top"
  }
}

 

pale_oak_door_top_left.json

 

pale_oak_door_top_left_open.json例)

{
  "parent": "minecraft:block/door_top_left_open",
  "textures": {
    "bottom": "nakanishi_mod:block/pale_oak_door_bottom",
    "top": "nakanishi_mod:block/pale_oak_door_top"
  }
}

 

pale_oak_door_top_left_open.json

 

pale_oak_door_top_right.json例)

{
  "parent": "minecraft:block/door_top_right",
  "textures": {
    "bottom": "nakanishi_mod:block/pale_oak_door_bottom",
    "top": "nakanishi_mod:block/pale_oak_door_top"
  }
}

 

pale_oak_door_top_right.json

 

pale_oak_door_top_right_open.json例)

{
  "parent": "minecraft:block/door_top_right_open",
  "textures": {
    "bottom": "nakanishi_mod:block/pale_oak_door_bottom",
    "top": "nakanishi_mod:block/pale_oak_door_top"
  }
}

 

pale_oak_door_top_right_open.json

 

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

 

pale_oak_door.json例)

{
  "parent": "minecraft:item/generated",
  "textures": {
    "layer0": "nakanishi_mod:item/pale_oak_door"
  }
}

 

pale_oak_door.json

 

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

 

pale_oak_door.json例)

{
  "variants": {
    "facing=east,half=lower,hinge=left,open=false": {
      "model": "nakanishi_mod:block/pale_oak_door_bottom_left"
    },
    "facing=east,half=lower,hinge=left,open=true": {
      "model": "nakanishi_mod:block/pale_oak_door_bottom_left_open",
      "y": 90
    },
    "facing=east,half=lower,hinge=right,open=false": {
      "model": "nakanishi_mod:block/pale_oak_door_bottom_right"
    },
    "facing=east,half=lower,hinge=right,open=true": {
      "model": "nakanishi_mod:block/pale_oak_door_bottom_right_open",
      "y": 270
    },
    "facing=east,half=upper,hinge=left,open=false": {
      "model": "nakanishi_mod:block/pale_oak_door_top_left"
    },
    "facing=east,half=upper,hinge=left,open=true": {
      "model": "nakanishi_mod:block/pale_oak_door_top_left_open",
      "y": 90
    },
    "facing=east,half=upper,hinge=right,open=false": {
      "model": "nakanishi_mod:block/pale_oak_door_top_right"
    },
    "facing=east,half=upper,hinge=right,open=true": {
      "model": "nakanishi_mod:block/pale_oak_door_top_right_open",
      "y": 270
    },
    "facing=north,half=lower,hinge=left,open=false": {
      "model": "nakanishi_mod:block/pale_oak_door_bottom_left",
      "y": 270
    },
    "facing=north,half=lower,hinge=left,open=true": {
      "model": "nakanishi_mod:block/pale_oak_door_bottom_left_open"
    },
    "facing=north,half=lower,hinge=right,open=false": {
      "model": "nakanishi_mod:block/pale_oak_door_bottom_right",
      "y": 270
    },
    "facing=north,half=lower,hinge=right,open=true": {
      "model": "nakanishi_mod:block/pale_oak_door_bottom_right_open",
      "y": 180
    },
    "facing=north,half=upper,hinge=left,open=false": {
      "model": "nakanishi_mod:block/pale_oak_door_top_left",
      "y": 270
    },
    "facing=north,half=upper,hinge=left,open=true": {
      "model": "nakanishi_mod:block/pale_oak_door_top_left_open"
    },
    "facing=north,half=upper,hinge=right,open=false": {
      "model": "nakanishi_mod:block/pale_oak_door_top_right",
      "y": 270
    },
    "facing=north,half=upper,hinge=right,open=true": {
      "model": "nakanishi_mod:block/pale_oak_door_top_right_open",
      "y": 180
    },
    "facing=south,half=lower,hinge=left,open=false": {
      "model": "nakanishi_mod:block/pale_oak_door_bottom_left",
      "y": 90
    },
    "facing=south,half=lower,hinge=left,open=true": {
      "model": "nakanishi_mod:block/pale_oak_door_bottom_left_open",
      "y": 180
    },
    "facing=south,half=lower,hinge=right,open=false": {
      "model": "nakanishi_mod:block/pale_oak_door_bottom_right",
      "y": 90
    },
    "facing=south,half=lower,hinge=right,open=true": {
      "model": "nakanishi_mod:block/pale_oak_door_bottom_right_open"
    },
    "facing=south,half=upper,hinge=left,open=false": {
      "model": "nakanishi_mod:block/pale_oak_door_top_left",
      "y": 90
    },
    "facing=south,half=upper,hinge=left,open=true": {
      "model": "nakanishi_mod:block/pale_oak_door_top_left_open",
      "y": 180
    },
    "facing=south,half=upper,hinge=right,open=false": {
      "model": "nakanishi_mod:block/pale_oak_door_top_right",
      "y": 90
    },
    "facing=south,half=upper,hinge=right,open=true": {
      "model": "nakanishi_mod:block/pale_oak_door_top_right_open"
    },
    "facing=west,half=lower,hinge=left,open=false": {
      "model": "nakanishi_mod:block/pale_oak_door_bottom_left",
      "y": 180
    },
    "facing=west,half=lower,hinge=left,open=true": {
      "model": "nakanishi_mod:block/pale_oak_door_bottom_left_open",
      "y": 270
    },
    "facing=west,half=lower,hinge=right,open=false": {
      "model": "nakanishi_mod:block/pale_oak_door_bottom_right",
      "y": 180
    },
    "facing=west,half=lower,hinge=right,open=true": {
      "model": "nakanishi_mod:block/pale_oak_door_bottom_right_open",
      "y": 90
    },
    "facing=west,half=upper,hinge=left,open=false": {
      "model": "nakanishi_mod:block/pale_oak_door_top_left",
      "y": 180
    },
    "facing=west,half=upper,hinge=left,open=true": {
      "model": "nakanishi_mod:block/pale_oak_door_top_left_open",
      "y": 270
    },
    "facing=west,half=upper,hinge=right,open=false": {
      "model": "nakanishi_mod:block/pale_oak_door_top_right",
      "y": 180
    },
    "facing=west,half=upper,hinge=right,open=true": {
      "model": "nakanishi_mod:block/pale_oak_door_top_right_open",
      "y": 90
    }
  }
}

 

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

 

 

②CLASSファイルを作ろう

今回は名前を【Block_Pale_Oak_Door】にしました。

ドアは【DoorBlock】というクラスを使います。

例)

extends DoorBlock

 

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

 

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

そうすると【Properties】と【BlockSetType】を要求されます。

BlockSetType】とは木材か金属かを決める性質があります。

 

例)

super(Properties.copy(Blocks.OAK_DOOR),
                BlockSetType.OAK);

 

完成したCLASSファイル

ここまで書けたら、レジストリ登録をしていきます。

 

ブロック登録例)

public static final RegistryObject<Block> PALE_OAK_DOOR = BLOCKS.register("pale_oak_door", Block_Pale_Oak_Door::new);

 

ブロック登録

 

アイテム登録例)

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

 

アイテム登録

これで【Pale Oak Door】がゲーム内に反映されました。

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

 

 

③設定を追加しよう

まず翻訳から追記していきます。

追記例)

"item.nakanishi_mod.pale_oak_door": "Pale Oak Door",
"block.nakanishi_mod.pale_oak_door": "Pale Oak Door"

 

翻訳(en_us.json

 

次にクリエイティブタブのリストに追記します。

 

次にサバイバルモードで破壊した際にドロップするように、【loot_table】を追加します。

pale_oak_door.json例)

{
  "type": "minecraft:block",
  "pools": [
    {
      "bonus_rolls": 0.0,
      "conditions": [
        {
          "condition": "minecraft:survives_explosion"
        }
      ],
      "entries": [
        {
          "type": "minecraft:item",
          "conditions": [
            {
              "block": "nakanishi_mod:pale_oak_door",
              "condition": "minecraft:block_state_property",
              "properties": {
                "half": "lower"
              }
            }
          ],
          "name": "nakanishi_mod:pale_oak_door"
        }
      ],
      "rolls": 1.0
    }
  ],
  "random_sequence": "nakanishi_mod:blocks/pale_oak_door"
}

 

pale_oak_door.json

 

今度はタグ登録をしていきます。これをしないと村人がドアを開けることが出来ないので、【wooden_doors.json】に追記していきます。

場所は

resources/data/minecraft/tags/blocks/wooden_doors.json

になります。

 

 

例)

{
  "values": [
    "nakanishi_mod:pale_oak_door"
  ]
}

 

wooden_doors.json

wooden_doors】は斧の適正ツールに入っているので【mineable】の追記は不要です。

 

それでは、動作確認をしてみましょう。

 

設置確認

開閉も無事に出来ています。

スクリーンショットを撮れなかったのですが、村人がドアを使う事も確認出来ました。

 

サバイバルモード確認

適正ツールも斧になっています。

2ブロックの高さがありますが、どちらから壊してもドロップしました。

 

これでドアは完成です。

 

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

次回はトラップドアの作り方を書かせてもらおうと思います。

 

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

 

次回記事

JavaでMinecraftのModを作ろう☆ 木材編⑧ 〜トラップドアを作ろう〜 - NakanishiのForge1.20.1のJavaMod開発講座