こんばんは。Nakanishiです。
Discordサーバーを運営中です。
一緒にゆるくMod制作を楽しみませんか?
※)日本語での会話ができる方のみ参加可能です。
条件に合わない方は参加をご遠慮ください。
前回のおさらい
木材のフェンスゲートを追加しました。
JavaでMinecraftのModを作ろう☆ 木材編⑥ 〜フェンスゲートを作ろう〜 - NakanishiのForge1.20.1のJavaMod開発講座
今回はドアを作っていこうと思います。
①JSONファイルを用意しよう



ドアはブロック状態のテクスチャが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_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_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_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_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_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_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_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"
}
}

これで【models/block】の完成です。次に【models/item】を書いていきます。
pale_oak_door.json例)
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "nakanishi_mod:item/pale_oak_door"
}
}

これで【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);

ここまで書けたら、レジストリ登録をしていきます。
ブロック登録例)
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"

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

次にサバイバルモードで破壊した際にドロップするように、【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"
}

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

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

【wooden_doors】は斧の適正ツールに入っているので【mineable】の追記は不要です。
それでは、動作確認をしてみましょう。

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

適正ツールも斧になっています。
2ブロックの高さがありますが、どちらから壊してもドロップしました。
これでドアは完成です。
ここまでお疲れ様でした☆
次回はトラップドアの作り方を書かせてもらおうと思います。
もしこの記事が参考になった、または「JavaでMod制作を始めてみたい!」と思っていただけたら、ぜひ読者登録をお願いします。
それではまた次回お会いしましょう。
ここまでお読みいただき、ありがとうございました。
【次回記事】
JavaでMinecraftのModを作ろう☆ 木材編⑧ 〜トラップドアを作ろう〜 - NakanishiのForge1.20.1のJavaMod開発講座