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ファイルを用意しよう

JavaでModを作ろう☆ 共通編① ~翻訳とレシピを作ろう~ - NakanishiのForge1.20.1のJavaMod開発講座

基本は上記の記事で扱ってます。

 

レシピのフォルダ先は
resources/data/<modid>/recipes

となります。

 

まず、原木から板材を作るレシピから書いていきましょう。

その前に原木・木・樹皮を剝いだ原木・木をまとめて板材にクラフト出来るようにタグ付けしておきましょう。

 

場所)

resources/data/<modid>/tags/items/pale_oak_logs.json

 

pale_oak_logs.json例)

{
  "values": [
    "nakanishi_mod:pale_oak_log",
    "nakanishi_mod:pale_oak_wood",
    "nakanishi_mod:stripped_pale_oak_log",
    "nakanishi_mod:stripped_pale_oak_wood"
  ]
}

 

レシピのJSONファイルはこうなります。

pale_oak_planks.json例)

{
  "type": "minecraft:crafting_shapeless",
  "ingredients": [
    {
      "tag": "nakanishi_mod:pale_oak_logs"
    }
  ],
  "result": {
    "count": 4,
    "item": "nakanishi_mod:pale_oak_planks"
  }
}

 

作業台テスト

このように原木で板材が4つ作れたら成功です。

 

次に板材から棒をクラフトするレシピを作ります。

ここでもタグ付けをするのですが、次はタグを入れるフォルダが変わります。

場所)

resources/data/minecraft/tags/items/planks.json

 

planks.json例)

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

 

これでマインクラフトの板材タグに加えられ、レシピを書かなくとも棒や作業台といった、木材共通のレシピが作れるようになります。

 

作業台テスト

作業台テスト

 

次にハーフブロックのレシピを書いていきます。

pale_oak_slab.json例)

{
  "type": "minecraft:crafting_shaped",
  "key": {
    "#": {
      "item": "nakanishi_mod:pale_oak_planks"
    }
  },
  "pattern": [
    "###"
  ],
  "result": {
    "count": 6,
    "item": "nakanishi_mod:pale_oak_slab"
  },
  "show_notification": true
}

 

作業台テスト

 

次に階段のレシピを書いていきます。

pale_oak_stairs.json例)

{
  "type": "minecraft:crafting_shaped",
  "key": {
    "#": {
      "item": "nakanishi_mod:pale_oak_planks"
    }
  },
  "pattern": [
    "#  ",
    "## ",
    "###"
  ],
  "result": {
    "count": 4,
    "item": "nakanishi_mod:pale_oak_stairs"
  },
  "show_notification": true
}

 

作業台テスト

 

次にフェンスのレシピを書いていきます。

pale_oak_fence.json例)

{
  "type": "minecraft:crafting_shaped",
  "key": {
    "#": {
      "item": "minecraft:stick"
    },
    "W": {
      "item": "nakanishi_mod:pale_oak_planks"
    }
  },
  "pattern": [
    "W#W",
    "W#W"
  ],
  "result": {
    "count": 3,
    "item": "nakanishi_mod:pale_oak_fence"
  },
  "show_notification": true
}

 

作業台テスト

 

次にフェンスゲートのレシピを書いていきます。

pale_oak_fence_gate.json例)

{
  "type": "minecraft:crafting_shaped",
  "key": {
    "#": {
      "item": "minecraft:stick"
    },
    "W": {
      "item": "nakanishi_mod:pale_oak_planks"
    }
  },
  "pattern": [
    "#W#",
    "#W#"
  ],
  "result": {
    "item": "nakanishi_mod:pale_oak_fence_gate"
  },
  "show_notification": true
}

 

作業台テスト

次にドアのレシピを書いていきます。

pale_oak_door.json例)

{
  "type": "minecraft:crafting_shaped",
  "key": {
    "#": {
      "item": "nakanishi_mod:pale_oak_planks"
    }
  },
  "pattern": [
    "##",
    "##",
    "##"
  ],
  "result": {
    "count": 3,
    "item": "nakanishi_mod:pale_oak_door"
  },
  "show_notification": true
}

 

作業台テスト

次にトラップドアのレシピを書いていきます。

pale_oak_trapdoor.json例)

{
  "type": "minecraft:crafting_shaped",
  "key": {
    "#": {
      "item": "nakanishi_mod:pale_oak_planks"
    }
  },
  "pattern": [
    "###",
    "###"
  ],
  "result": {
    "count": 2,
    "item": "nakanishi_mod:pale_oak_trapdoor"
  },
  "show_notification": true
}

 

作業台テスト

次に感圧板のレシピを書いていきます。

pale_oak_pressure_plate.json例)

{
  "type": "minecraft:crafting_shaped",
  "key": {
    "#": {
      "item": "nakanishi_mod:pale_oak_planks"
    }
  },
  "pattern": [
    "##"
  ],
  "result": {
    "item": "nakanishi_mod:pale_oak_pressure_plate"
  },
  "show_notification": true
}

 

作業台テスト

次にボタンのレシピを書いていきます。

pale_oak_button.json例)

{
  "type": "minecraft:crafting_shapeless",
  "ingredients": [
    {
      "item": "nakanishi_mod:pale_oak_planks"
    }
  ],
  "result": {
    "item": "nakanishi_mod:pale_oak_button"
  }
}

 

作業台テスト

次に原木から木を作るレシピを書いていきます。

pale_oak_wood.json例)

{
  "type": "minecraft:crafting_shaped",
  "key": {
    "#": {
      "item": "nakanishi_mod:pale_oak_log"
    }
  },
  "pattern": [
    "##",
    "##"
  ],
  "result": {
    "count": 3,
    "item": "nakanishi_mod:pale_oak_wood"
  },
  "show_notification": true
}

 

stripped_pale_oak_wood.json例)

{
  "type": "minecraft:crafting_shaped",
  "key": {
    "#": {
      "item": "nakanishi_mod:stripped_pale_oak_log"
    }
  },
  "pattern": [
    "##",
    "##"
  ],
  "result": {
    "count": 3,
    "item": "nakanishi_mod:stripped_pale_oak_wood"
  },
  "show_notification": true
}

 

作業台テスト

作業台テスト

 

これで基本的に作れるレシピが完了しました。

看板、ボートは今までのように簡単には作れないので、記事にするのが難しいので、
興味のある方は自分のDiscordサーバーに来てください。

 

看板とボート

 

看板とボートは書けませんでしたが、これで木材編は一度終わりにしたいと思います。

 

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

 

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

 

JavaでMinecraftのModを作ろう☆ 木材編⑮ 〜苗木を成長させよう〜

こんばんは。Nakanishiです。

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

Kazushi_Nakanishiのこっそりサーバー

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

 

 

前回のおさらい

苗木を作りました。

JavaでMinecraftのModを作ろう☆ 木材編⑭ 〜苗木を作ろう〜 - NakanishiのForge1.20.1のJavaMod開発講座

今回は、前回作った苗木からペールオークの原木が生成されるようにしたいと思います。

 

今回の目標

 

①成長を設定するJSONファイルを用意しよう

苗木から木を成長させる為にはJSONファイルを使用します。

場所は

resources/data/<modid>/worldgen/configured_feature/pale_oak.json

となります。

 

Configured Feature】とは木の形や構造(幹・葉・高さなど)を定義するファイルのことになります。

 

ここで誤字、脱字があると反映されないので注意してください。

 

pale_oak.json例)

src/main/{
  "type": "minecraft:tree",
  "config": {
    "trunk_provider": {
      "type": "minecraft:simple_state_provider",
      "state": {
        "Name": "nakanishi_mod:pale_oak_log"
      }
    },
    "trunk_placer": {
      "type": "minecraft:dark_oak_trunk_placer",
      "base_height": 6,
      "height_rand_a": 2,
      "height_rand_b": 1
    },
    "foliage_provider": {
      "type": "minecraft:simple_state_provider",
      "state": {
        "Name": "nakanishi_mod:pale_oak_leaves"
      }
    },
    "foliage_placer": {
      "type": "minecraft:dark_oak_foliage_placer",
      "radius": 0,
      "offset": 0
    },
    "dirt_provider": {
      "type": "minecraft:simple_state_provider",
      "state": {
        "Name": "minecraft:dirt"
      }
    },
    "minimum_size": {
      "type": "minecraft:two_layers_feature_size",
      "limit": 1,
      "lower_size": 0,
      "upper_size": 1
    },
    "decorators": [],
    "ignore_vines": true
  }
}

 

💡ポイント

・ペールオークの木はダークオークの木と同じ形をしているので、【type】で【dark_oak_trunk_placer】【dark_oak_foliage_placer】を参照しています。

・【trunk_placer】で木の大きさを設定します。【base_height】が最低限の高さ。【height_rand】が追加されるランダムの高さです。

・【ignore_vines】はツタを生やさないようにする設定です。

 

これをコピー&ペースト等をして書けたら、このJSONファイルを参照するCLASSファイルを作っていきます。

 

②TreeGrowerを設定するCLASSファイルを作ろう

新しい【worldgen】という名前の【Package】を作ってもらって、そこにCLASSファイルを作っていきます。

 

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

 

クラスですが、ペールオークの木はダークオーク同様2×2で育つので、【AbstractMegaTreeGrower】というクラスを使います。

例)

extends AbstractMegaTreeGrower

 

 

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

赤線の所で右クリックをしてもらってShow Context Actions】を選択します。

そうしたら【Implement methods】を選択してください。

 

そうすると、このような確認画面が出るので【OK】を押してください。

 

仮のメソッドを表示

ここで引数が【p_222904_】などとなっているので、直しておげます。

例)

@Override
    protected @Nullable ResourceKey<ConfiguredFeature<?, ?>> getConfiguredMegaFeature(RandomSource random) {
        return null;
    }

    @Override
    protected @Nullable ResourceKey<ConfiguredFeature<?, ?>> getConfiguredFeature(RandomSource random, boolean bees) {
        return null;
    }

 

仮の引数を修正

今回変更するのは【getConfiguredMegaFeature】だけなので、まずnullを消してもらって入力していきます。

例)

return ResourceKey.create(
                Registries.CONFIGURED_FEATURE,
                new ResourceLocation("nakanishi_mod", "pale_oak")
        );

 

💡ポイント

"nakanishi_mod"modid"pale_oak"は先ほど作ってもらったJSONファイル名です

 

ここでResourceLocationに赤線が引かれていますが、エラーではなく、将来的にこの構文が使えなくなるかもしれない。というIJ側の警告なので、この警告を消す文を最初に付けてあげます。

例)

@SuppressWarnings("removal")

完成したCLASSファイル

これで【PaleOakTreeGrower】は完成です。では、次に【Pale Oak Sapling】のCLASSファイルに移ってもらって、【PaleOakTreeGrower】を適応させます。

 

Block_Pale_Oak_SaplingのCLASSファイル

ここで【DarkOakTreeGrower】となっているのを【PaleOakTreeGrower】に変更します。

 

修正したCLASSファイル

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

 

苗木の設置

苗木を2×2で設置して骨粉を使います。

 

ペールオークの木が生成

そうすると画像のようにペールオークの木が生成されます。

 

もし葉が枯れるようであれば、それはタグ登録が上手くいってない可能性が高いです。

JavaでMinecraftのModを作ろう☆ 木材編⑪ 〜樹皮を剝いだ原木・木を作ろう〜 - NakanishiのForge1.20.1のJavaMod開発講座

上記の記事で原木を【logs.json】に入れてますので確認ください。

 

木が生成されない場合はresource内のフォルダ名のスペルミスの可能性が高いです。もう一度確認してみてください。

 

 

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

 

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

 

次回記事

JavaでMinecraftのModを作ろう☆ 木材編⑯ 〜レシピを追加しよう〜 - NakanishiのForge1.20.1のJavaMod開発講座

 

JavaでMinecraftのModを作ろう☆ 木材編⑭ 〜苗木を作ろう〜

こんばんは。Nakanishiです。

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

Kazushi_Nakanishiのこっそりサーバー

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

 

 

前回のおさらい

葉ブロックを作りました。

JavaでMinecraftのModを作ろう☆ 木材編⑬ 〜葉ブロックを作ろう〜 - NakanishiのForge1.20.1のJavaMod開発講座

今回は苗木を作っていこうと思います。

 

 

JSONファイルを用意しよう

pale_oak_sapling

まず【pngファイル】のテクスチャを用意します。用意出来ましたら【Textures/block】に入れます。

次に【models/block】を書いていきます。

 

pale_oak_sapling.json例)

{
  "parent": "minecraft:block/cross",
  "textures": {
    "cross": "nakanishi_mod:block/pale_oak_sapling"
  }
}

 

pale_oak_sapling.json

次に【models/item】を書いていきます。

 

pale_oak_sapling.json例)

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

 

pale_oak_sapling.json

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

 

pale_oak_sapling.json例)

{
  "variants": {
    "": {
      "model": "nakanishi_mod:block/pale_oak_sapling"
    }
  }
}

 

pale_oak_sapling.json

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

 

 

②CLASSファイルを作ろう

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

 

苗木は【SaplingBlock】を使います。

例)

extends SaplingBlock

 

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

 

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

名前が光っているのは裏でブロックを登録済みの為です。なので気にしないでください。

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

AbstractTreeGrower】とは成長した時にどんな成長をするのかを決めるパラメータです。

今回はまだ作ってないので、仮で【ダークオーク】にしておきます。

例)

super(new DarkOakTreeGrower(),
                Properties.copy(Blocks.DARK_OAK_SAPLING));

 

仮で完成させたCLASSファイル

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

 

ブロック登録例)

public static final RegistryObject<Block> PALE_OAK_SAPLING = BLOCKS.register("pale_oak_sapling", Block_Pale_Oak_Sapling::new);

 

アイテム登録例)

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

 

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

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

 

 

③設定を追加しよう

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

追記例)

"item.nakanishi_mod.pale_oak_sapling": "Pale Oak Sapling",
"block.nakanishi_mod.pale_oak_sapling": "Pale Oak Sapling"

 

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

今回は画像は省略させて頂きます。

 

苗木ブロックを農業編で行ったように透過処理を加えます。

JavaでMinecraftのModを作ろう☆ 農業編③ 〜SeedItem(アイテム)のCLASSファイルを作ろう〜 - NakanishiのForge1.20.1のJavaMod開発講座

まだ透過処理のクラスを作ってない方は、こちらの記事を参照ください。

 

例)

ItemBlockRenderTypes.setRenderLayer(NakanishiModBlocks.Blocks.PALE_OAK_SAPLING.get(),
                RenderType.cutout());

 

透過処理のCLASSファイル

これで苗木を置いた時に透過処理されるようになります。

 

 

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

前回は苗木がなく、葉ブロックの【loot_table】を書けなかったので、今回まとめて書いていきます。

 

pale_oak_sapling.json例)

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

 

pale_oak_sapling.json

 

pale_oak_leaves.json例)

{
  "type": "minecraft:block",
  "pools": [
    {
      "bonus_rolls": 0.0,
      "entries": [
        {
          "type": "minecraft:alternatives",
          "children": [
            {
              "type": "minecraft:item",
              "conditions": [
                {
                  "condition": "minecraft:any_of",
                  "terms": [
                    {
                      "condition": "minecraft:match_tool",
                      "predicate": {
                        "items": [
                          "minecraft:shears"
                        ]
                      }
                    },
                    {
                      "condition": "minecraft:match_tool",
                      "predicate": {
                        "enchantments": [
                          {
                            "enchantment": "minecraft:silk_touch",
                            "levels": {
                              "min": 1
                            }
                          }
                        ]
                      }
                    }
                  ]
                }
              ],
              "name": "nakanishi_mod:pale_oak_leaves"
            },
            {
              "type": "minecraft:item",
              "conditions": [
                {
                  "condition": "minecraft:survives_explosion"
                },
                {
                  "chances": [
                    0.05,
                    0.0625,
                    0.083333336,
                    0.1
                  ],
                  "condition": "minecraft:table_bonus",
                  "enchantment": "minecraft:fortune"
                }
              ],
              "name": "nakanishi_mod:pale_oak_sapling"
            }
          ]
        }
      ],
      "rolls": 1.0
    },
    {
      "bonus_rolls": 0.0,
      "conditions": [
        {
          "condition": "minecraft:inverted",
          "term": {
            "condition": "minecraft:any_of",
            "terms": [
              {
                "condition": "minecraft:match_tool",
                "predicate": {
                  "items": [
                    "minecraft:shears"
                  ]
                }
              },
              {
                "condition": "minecraft:match_tool",
                "predicate": {
                  "enchantments": [
                    {
                      "enchantment": "minecraft:silk_touch",
                      "levels": {
                        "min": 1
                      }
                    }
                  ]
                }
              }
            ]
          }
        }
      ],
      "entries": [
        {
          "type": "minecraft:item",
          "conditions": [
            {
              "chances": [
                0.02,
                0.022222223,
                0.025,
                0.033333335,
                0.1
              ],
              "condition": "minecraft:table_bonus",
              "enchantment": "minecraft:fortune"
            }
          ],
          "functions": [
            {
              "add": false,
              "count": {
                "type": "minecraft:uniform",
                "max": 2.0,
                "min": 1.0
              },
              "function": "minecraft:set_count"
            },
            {
              "function": "minecraft:explosion_decay"
            }
          ],
          "name": "minecraft:stick"
        }
      ],
      "rolls": 1.0
    }
  ],
  "random_sequence": "nakanishi_mod:blocks/pale_oak_leaves"
}

 

これで苗木葉ブロックの【loot_table】は完成です。

 

次に【saplings.json】にタグ登録をしていきます。

場所は

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

です。

 

saplings.json例)

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

 

saplings.json

 

では動作確認をしていきましょう。

 

サバイバルモードで破壊確認

葉ブロックがハサミでシルクタッチのように壊せるようになりました。

 

苗木の設置確認

透過処理が出来ていれば、画像のようになります。

 

骨粉での成長確認

2×2で置いて骨粉を使い、ダークオークの木が生えたら成功です。

次回はこの仮のダークオークを、過去に作ったペールオークの原木・葉に変更しようと思います。

 

 

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

 

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

 

次回記事

JavaでMinecraftのModを作ろう☆ 木材編⑮ 〜苗木を成長させよう〜 - NakanishiのForge1.20.1のJavaMod開発講座

 

JavaでMinecraftのModを作ろう☆ 木材編⑬ 〜葉ブロックを作ろう〜

こんばんは。Nakanishiです。

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

Kazushi_Nakanishiのこっそりサーバー

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

 

 

前回のおさらい

樹皮を剥がすためのCLASSファイルを制作しました。

JavaでMinecraftのModを作ろう☆ 木材編⑫ 〜樹皮を剥がすCLASSファイルを作ろう〜 - NakanishiのForge1.20.1のJavaMod開発講座

今回は葉ブロックを作っていこうと思います。

 

 

JSONファイルを用意しよう

pale_oak_leaves

葉ブロックの【pngファイル】を用意したら【textures/block】に入れてもらいます。

そうしたら次に【models/block】を書いていきます。

 

pale_oak_leaves.json例)

{
  "parent": "minecraft:block/leaves",
  "textures": {
    "all": "nakanishi_mod:block/pale_oak_leaves"
  }
}

 

pale_oak_leaves.json

次に【models/item】を書いていきます。

 

pale_oak_leaves.json例)

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

 

pale_oak_leaves.json

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

pale_oak_leaves.json例)

{
  "variants": {
    "": {
      "model": "nakanishi_mod:block/pale_oak_leaves"
    }
  }
}

 

pale_oak_leaves.json

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

 

 

②CLASSファイルを作ろう

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

葉ブロックは【LeavesBlock】というクラスを使います。

例)

extends LeavesBlock

 

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

 

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

そうしたら、いつものように()内を消してあげて引数を入力します。
例)

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

完成したCLASSファイル

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

 

ブロック登録例)

public static final RegistryObject<Block> PALE_OAK_LEAVES = BLOCKS.register("pale_oak_leaves", Block_Pale_Oak_Leaves::new);

 

アイテム登録例)

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

 

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

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

 

 

③設定を追加しよう

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

追記例)

"item.nakanishi_mod.pale_oak_leaves": "Pale Oak Leaves",
"block.nakanishi_mod.pale_oak_leaves": "Pale Oak Leaves"

 

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

 

次にドロップの登録をしたいのですが、まだ苗木を登録していないので、苗木を作ってから登録します。

 

なので、次にタグ登録をしていきます。

葉の特性を持たせる【leaves.json】と、適正ツールのmineable/hoe.json】を書いていきます。

 

leaves.json場所)

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

 

leaves.json例)

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

 

leaves.json

 

mineable/hoe.json場所)

resources/data/minecraft/tags/blocks/mineable/hoe.json

 

mineable/hoe.json例)

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

 

mineable/hoe.json

 

これでタグ登録は完了です。

 

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

 

設置確認

テクスチャの透過も出来てますね。

 

サバイバルモードでの確認

適正ツールもクワになってました。

ドロップの設定をしていない為に何もドロップしませんが、これで葉ブロックの基本は完成です。

 

 

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

 

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

 

次回記事

JavaでMinecraftのModを作ろう☆ 木材編⑭ 〜苗木を作ろう〜 - NakanishiのForge1.20.1のJavaMod開発講座

 

JavaでMinecraftのModを作ろう☆ 木材編⑫ 〜樹皮を剥がすCLASSファイルを作ろう〜

こんばんは。Nakanishiです。

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

Kazushi_Nakanishiのこっそりサーバー

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

 

 

前回のおさらい

樹皮を剝がした原木・木を追加しました。

JavaでMinecraftのModを作ろう☆ 木材編⑪ 〜樹皮を剝いだ原木・木を作ろう〜 - NakanishiのForge1.20.1のJavaMod開発講座

ただ、今の状態では原木・木を斧で右クリックしても樹皮を剥がせないので、それを出来るようにプログラミングをしていきたいと思います。

方法は2種類あります。

Forgeイベント版(簡易実装):実装に必要なクラスファイルは1つだけで済みますが、JEIなどのレシピ登録には対応できません。

Mixin版(本格実装):JEIや他のModとの互換性まで含めて完全に反映できますが、導入には追加設定が必要になります。

今回は、まず取り組みやすい【Forgeイベント版】を紹介させて頂きます。

 

 

①CLASSファイルを作ろう

今回は例として【client】という【Package】の中で作りました。

名前は【AxeEvents】としてます。

 

 

まず、先頭に以下の文を入力します。

例)

@Mod.EventBusSubscriber(modid = Nakanishi_Mod.MOD_ID)

💡ポイント

modidは自分のメインクラスを参照してください

 

次にクラス内に以下の文を入力してください。

例)

@SubscribeEvent
    public static void onRightClickBlock(PlayerInteractEvent.RightClickBlock event){}

 

💡ポイント

・コピー&ペーストする場合は赤字になる場所がありますが、インポートされてないだけなので、手入力で行えば赤字は解消されます

 

次に最後の{}の中に以下の文を入力します。

例)

Level level = event.getLevel();
BlockPos pos = event.getPos();
Player player = event.getEntity();
ItemStack heldItem = event.getItemStack();

 

💡ポイント

Levelnet.minecraft.eorld.levelを使ってください

BlockPosnet.minecraft.coreを使ってください

Playernet.minecraft.world.entity.playerを使ってください

ItemStacknet.minecraft.world.itemを使ってください

 

次に斧を持っているかどうかを判定する構文を入力します。

例)

if (!(heldItem.getItem() instanceof AxeItem)) {
            return;
        }

 

💡ポイント

AxeItemはインポートが必要なので、手入力でお願いします

 

次に以下の構文を入力します。

例)

BlockState state = level.getBlockState(pos);

 

💡ポイント

BlockStateはインポートが必要なので、手入力でお願いします

 

そうしたらブロックを置き換える処理を書いていきます。

例)

if (state.is(NakanishiModBlocks.Blocks.PALE_OAK_LOG.get())) {
            if (!level.isClientSide) {
                level.setBlock(pos
                        , NakanishiModBlocks.Blocks.STRIPPED_PALE_OAK_LOG.get().defaultBlockState()
                        , 11);

 

💡ポイント

・最後の11フラグ値というものです。詳しく書くと長くなるので省略しますが、この11はバニラと同じフラグ指定で、樹皮を剥いだときに余計なドロップが出ないようにしています

 

次に斧にダメージを与える構文を入力します

例)

heldItem.hurtAndBreak(1, player, p -> p.broadcastBreakEvent(event.getHand()));

 

 

次に樹皮を剝いだ音を設定します。

例)

level.playSound(null, pos, SoundEvents.AXE_STRIP, SoundSource.BLOCKS, 1.0F,1.0F);

 

💡ポイント

SoundEventsSoundEventを間違えないように気を付けてください

1.0Fは音の大きさとピッチ(音の高さ)です。

 

次に樹皮を剥がすアニメーションを設定します

例)

player.swing(event.getHand(), true);

 

 

最後にこの処理を終わらせる構文を入力します。

例)

}
            event.setCanceled(true);
        }

 

これで【Pale Oak Log】に斧で右クリックをすると【Stripped Pale Oak Log】になるようになります。

 

ついでに【Pale Oak Wood】も剥がせるようにしましょう。

例)

if (state.is(NakanishiModBlocks.Blocks.PALE_OAK_WOOD.get())) {
            if (!level.isClientSide) {
                level.setBlock(pos
                        , NakanishiModBlocks.Blocks.STRIPPED_PALE_OAK_WOOD.get().defaultBlockState()
                        , 11);

                heldItem.hurtAndBreak(1, player, p -> p.broadcastBreakEvent(event.getHand()));

                level.playSound(null, pos, SoundEvents.AXE_STRIP, SoundSource.BLOCKS, 1.0F,1.0F);

                player.swing(event.getHand(), true);
            }
            event.setCanceled(true);
        }

完成したCLASSファイル

これで斧で右クリックをした際の処理のCLASSファイルは完成です。

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

 

原木を置いてチェック

斧で右クリック

無事に原木を剥がすことが出来ました。

 

Pale Oak Woodでも確認

Pale Oak Woodも同様に剥がせました。

 

これで原木・木を剥がすCLASSファイルは完成です。

 

 

余談ですが、最初Mixin方式でやってみたのですが、CLASSファイルが3つとエラーの繰り返しで大変な作業になったので、今回はForgeイベント式で紹介させて頂きました。

Mixin方式も完成しているので、またの機会に紹介させてもらおうと思います。

 

 

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

 

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

 

次回記事

JavaでMinecraftのModを作ろう☆ 木材編⑬ 〜葉ブロックを作ろう〜 - NakanishiのForge1.20.1のJavaMod開発講座

 

JavaでMinecraftのModを作ろう☆ 木材編⑪ 〜樹皮を剝いだ原木・木を作ろう〜

こんばんは。Nakanishiです。

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

Kazushi_Nakanishiのこっそりサーバー

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

 

 

前回のおさらい

木材の感圧板を追加しました。

JavaでMinecraftのModを作ろう☆ 木材編⑩ 〜感圧板を作ろう〜 - NakanishiのForge1.20.1のJavaMod開発講座

今回は樹皮を剝いだ原木・木を作っていこうと思います。

 

 

JSONファイルを用意しよう

stripped_pale_oak_log

stripped_pale_oak_log_top

テクスチャは原木と同じで横面のものと上下面のもの、2種類必要になります。

これらの【pngファイル】を【textures/block】に入れてください。

そうしたら見た目を指定するJSONファイルを書いていきます。

まず、【models/block】から書いていきます。

 

stripped_pale_oak_log.json例)

{
  "parent": "minecraft:block/cube_column",
  "textures": {
    "end": "nakanishi_mod:block/stripped_pale_oak_log_top",
    "side": "nakanishi_mod:block/stripped_pale_oak_log"
  }
}

 

stripped_pale_oak_log.json

 

stripped_pale_oak_log_horizontal.json例)

{
  "parent": "minecraft:block/cube_column_horizontal",
  "textures": {
    "end": "nakanishi_mod:block/stripped_pale_oak_log_top",
    "side": "nakanishi_mod:block/stripped_pale_oak_log"
  }
}

 

stripped_pale_oak_log_horizontal.json

 

これで樹皮を剝いだ原木の【models/block】は完成です。

ついでに樹皮を剝いだ木の【models/block】も書いてしまいましょう。

 

stripped_pale_oak_wood.json例)

{
  "parent": "minecraft:block/cube_column",
  "textures": {
    "end": "nakanishi_mod:block/stripped_pale_oak_log",
    "side": "nakanishi_mod:block/stripped_pale_oak_log"
  }
}

 

stripped_pale_oak_wood.json

これで樹皮を剝いだ木の【models/block】は完成です。次に【models/item】を書いていきましょう。

 

stripped_pale_oak_log.json例)

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

 

stripped_pale_oak_log.json

 

stripped_pale_oak_wood.json例)

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

 

stripped_pale_oak_wood.json

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

 

stripped_pale_oak_log.json例)

{
  "variants": {
    "axis=x": {
      "model": "nakanishi_mod:block/stripped_pale_oak_log_horizontal",
      "x": 90,
      "y": 90
    },
    "axis=y": {
      "model": "nakanishi_mod:block/stripped_pale_oak_log"
    },
    "axis=z": {
      "model": "nakanishi_mod:block/stripped_pale_oak_log_horizontal",
      "x": 90
    }
  }
}

 

stripped_pale_oak_log.json

 

stripped_pale_oak_wood.json例)

{
  "variants": {
    "axis=x": {
      "model": "nakanishi_mod:block/stripped_pale_oak_wood",
      "x": 90,
      "y": 90
    },
    "axis=y": {
      "model": "nakanishi_mod:block/stripped_pale_oak_wood"
    },
    "axis=z": {
      "model": "nakanishi_mod:block/stripped_pale_oak_wood",
      "x": 90
    }
  }
}

 

stripped_pale_oak_wood.json

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

 

 

②CLASSファイルを作ろう

まず、樹皮を剝いだ原木から作っていきます。

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

樹皮を剝いだ原木は原木同様【RotatedPillarBlock】というクラスを使います。

例)

extends RotatedPillarBlock

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

 

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

Properties】を要求されるので、入力してあげましょう。

例)

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

 

完成したCLASSファイル

次に樹皮を剝いだ木のCLASSファイルを作っていきます。

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

樹皮を剝いだ木は木同様、【RotatedPillarBlock】というクラスを使います。

 

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

Properties】を要求されるので、入力してあげましょう。
例)

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

 

完成したCLASSファイル

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

 

ブロック登録例)

public static final RegistryObject<Block> STRIPPED_PALE_OAK_LOG = BLOCKS.register("stripped_pale_oak_log", Block_Stripped_Pale_Oak_Log::new);
        
public static final RegistryObject<Block> STRIPPED_PALE_OAK_WOOD = BLOCKS.register("stripped_pale_oak_wood", Block_Stripped_Pale_Oak_Wood::new);

 

アイテム登録例)

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

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

 

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

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

 

 

③設定を追加しよう

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

追記例)

"item.nakanishi_mod.stripped_pale_oak_log": "Stripped Pale Oak Log",
"block.nakanishi_mod.stripped_pale_oak_log": "Stripped Pale Oak Log",
"item.nakanishi_mod.stripped_pale_oak_wood": "Stripped Pale Oak Wood",
"block.nakanishi_mod.stripped_pale_oak_wood": "Stripped Pale Oak Wood"

 

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

実際のクリエイティブタブで表示される順番と同じ位置に記載しました。

 

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

 

stripped_pale_oak_log.json例)

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

 

stripped_pale_oak_log.json

 

stripped_pale_oak_wood.json例)

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

 

stripped_pale_oak_wood.json

 

タグ登録ですが、少し応用的なやり方を行います。
まず、【pale_oak_logs.json】というファイルを作ります。

場所)

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

 

pale_oak_logs.json例)

{
  "values": [
    "nakanishi_mod:pale_oak_log",
    "nakanishi_mod:pale_oak_wood",
    "nakanishi_mod:stripped_pale_oak_log",
    "nakanishi_mod:stripped_pale_oak_wood"
  ]
}

 

pale_oak_logs.json

ついでに原木・木も登録しておきましょう。

そうしたら次に【logs.json】というファイルを作ります。場所は同じです。

 

logs.json例)

{
  "values": [
    "#minecraft:pale_oak_logs"
  ]
}

 

logs.json

💡ポイント

・#を付けることで、そのJSONファイルをまとめて参照できます

 

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

 

では動作確認をしていきましょう。

 

設置確認

きちんと向きがあるブロックになってますね。

 

タグの動作確認

オークの苗木を成長させ、【Pale Oak Log】を葉に置いてオークの原木を破壊し、葉が枯れないかチェックをしました。この時、クリエイティブで置いた葉は枯れないので苗木から成長させた葉でタグが登録されているか確認しましょう。

 

これで樹皮を剝いだ原木・木のブロックは完成です。
次は【Pale Oak Log】【Pale Oak Wood】を斧で右クリックして、樹皮を剥がすプログラミングをしていきたいと思います。

 

 

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

 

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

 

次回記事

JavaでMinecraftのModを作ろう☆ 木材編⑫ 〜樹皮を剥がすCLASSファイルを作ろう〜 - NakanishiのForge1.20.1のJavaMod開発講座

 

JavaでMinecraftのModを作ろう☆ 木材編⑩ 〜感圧板を作ろう〜

こんばんは。Nakanishiです。

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

Kazushi_Nakanishiのこっそりサーバー

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

 

 

前回のおさらい

木材のボタンを追加しました。

JavaでMinecraftのModを作ろう☆ 木材編⑨ 〜ボタンを作ろう〜 - NakanishiのForge1.20.1のJavaMod開発講座

今回は感圧板を作っていこうと思います。

 

 

JSONファイルを用意しよう

テクスチャは木材編①で扱った【pale_oak_planks.png】を使います。

なので見た目で必要なものは【models/block】【models/item】【blockstates】になります。

 

まず、【models/block】から作っていきます。感圧板の【models/block】は押される前押された後の2種類必要になります。

 

pale_oak_pressure_plate.json例)

{
  "parent": "minecraft:block/pressure_plate_up",
  "textures": {
    "texture": "nakanishi_mod:block/pale_oak_planks"
  }
}

 

pale_oak_pressure_plate.json

 

pale_oak_pressure_plate_down.json例)

{
  "parent": "minecraft:block/pressure_plate_down",
  "textures": {
    "texture": "nakanishi_mod:block/pale_oak_planks"
  }
}

 

pale_oak_pressure_plate_down.json

 

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

 

pale_oak_pressure_plate.json例)

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

 

pale_oak_pressure_plate.json

 

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

 

pale_oak_pressure_plate.json例)

{
  "variants": {
    "powered=false": {
      "model": "nakanishi_mod:block/pale_oak_pressure_plate"
    },
    "powered=true": {
      "model": "nakanishi_mod:block/pale_oak_pressure_plate_down"
    }
  }
}

 

pale_oak_pressure_plate.json

 

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

 

 

②CLASSファイルを作ろう

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

 

感圧板は【PressurePlateBlock】というクラスを使います。

例)

extends PressurePlateBlock

 

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

 

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

そうすると【Properties】と【BlockSetType】の他に、【Sensitivity】という引数を要求されます。

💡ポイント

・【Sensitivity】とは、どのエンティティが乗ったら反応するかを指しています。【EVERYTHING】にすると、木材の感圧板のように矢やアイテムでも反応し、【MOBS】にすると、石の感圧板のようにモブが乗った状態のみ反応します。

 

例)

super(Sensitivity.EVERYTHING,
                Properties.copy(Blocks.OAK_PRESSURE_PLATE),
                BlockSetType.OAK);

 

完成したCLASSファイル

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

 

ブロック登録例)

public static final RegistryObject<Block> PALE_OAK_PRESSURE_PLATE = BLOCKS.register("pale_oak_pressure_plate", Block_Pale_Oak_Pressure_Plate::new);

 

ブロック登録

 

アイテム登録例)

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

 

アイテム登録

 

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

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

 

 

③設定を追加しよう

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

追記例)

"item.nakanishi_mod.pale_oak_pressure_plate": "Pale Oak Pressure Plate",
"block.nakanishi_mod.pale_oak_pressure_plate": "Pale Oak Pressure Plate"

 

翻訳(en_us.json

 

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

 

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

pale_oak_pressure_plate.json例)

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

 

pale_oak_pressure_plate.json

 

今度はタグ登録をしていきます。【wooden_pressure_plates.json】に追記していきます。

場所は

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

になります。

 

例)

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

 

wooden_pressure_plates.json

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

 

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

 

動作確認

感圧板に乗るとドアが開きました。

 

動作確認

アイテムが乗ってもドアが開きました。

 

サバイバルモード確認

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

 

これで感圧板の完成です。

 

 

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

次回は樹皮を剝いだ原木・木の作り方について書いていこうと思います。
こちらは斧の設定を追加する必要があるので、2記事に分けて書こうと思います。

 

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