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_planks.png】を使います。

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

 

まず、【models/block】から作っていきます。ボタンの【models/block】は押される前押された後インベントリ用の3種類必要です。

 

pale_oak_button.json例)

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

 

pale_oak_button.json

 

pale_oak_button_pressed.json例)

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

 

pale_oak_button_pressed.json

 

pale_oak_button_inventory.json例)

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

 

pale_oak_button_inventory.json

 

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

 

pale_oak_button.json例)

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

 

pale_oak_button.json

 

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

 

pale_oak_button.json例)

{
  "variants": {
    "face=ceiling,facing=east,powered=false": {
      "model": "nakanishi_mod:block/pale_oak_button",
      "x": 180,
      "y": 270
    },
    "face=ceiling,facing=east,powered=true": {
      "model": "nakanishi_mod:block/pale_oak_button_pressed",
      "x": 180,
      "y": 270
    },
    "face=ceiling,facing=north,powered=false": {
      "model": "nakanishi_mod:block/pale_oak_button",
      "x": 180,
      "y": 180
    },
    "face=ceiling,facing=north,powered=true": {
      "model": "nakanishi_mod:block/pale_oak_button_pressed",
      "x": 180,
      "y": 180
    },
    "face=ceiling,facing=south,powered=false": {
      "model": "nakanishi_mod:block/pale_oak_button",
      "x": 180
    },
    "face=ceiling,facing=south,powered=true": {
      "model": "nakanishi_mod:block/pale_oak_button_pressed",
      "x": 180
    },
    "face=ceiling,facing=west,powered=false": {
      "model": "nakanishi_mod:block/pale_oak_button",
      "x": 180,
      "y": 90
    },
    "face=ceiling,facing=west,powered=true": {
      "model": "nakanishi_mod:block/pale_oak_button_pressed",
      "x": 180,
      "y": 90
    },
    "face=floor,facing=east,powered=false": {
      "model": "nakanishi_mod:block/pale_oak_button",
      "y": 90
    },
    "face=floor,facing=east,powered=true": {
      "model": "nakanishi_mod:block/pale_oak_button_pressed",
      "y": 90
    },
    "face=floor,facing=north,powered=false": {
      "model": "nakanishi_mod:block/pale_oak_button"
    },
    "face=floor,facing=north,powered=true": {
      "model": "nakanishi_mod:block/pale_oak_button_pressed"
    },
    "face=floor,facing=south,powered=false": {
      "model": "nakanishi_mod:block/pale_oak_button",
      "y": 180
    },
    "face=floor,facing=south,powered=true": {
      "model": "nakanishi_mod:block/pale_oak_button_pressed",
      "y": 180
    },
    "face=floor,facing=west,powered=false": {
      "model": "nakanishi_mod:block/pale_oak_button",
      "y": 270
    },
    "face=floor,facing=west,powered=true": {
      "model": "nakanishi_mod:block/pale_oak_button_pressed",
      "y": 270
    },
    "face=wall,facing=east,powered=false": {
      "model": "nakanishi_mod:block/pale_oak_button",
      "uvlock": true,
      "x": 90,
      "y": 90
    },
    "face=wall,facing=east,powered=true": {
      "model": "nakanishi_mod:block/pale_oak_button_pressed",
      "uvlock": true,
      "x": 90,
      "y": 90
    },
    "face=wall,facing=north,powered=false": {
      "model": "nakanishi_mod:block/pale_oak_button",
      "uvlock": true,
      "x": 90
    },
    "face=wall,facing=north,powered=true": {
      "model": "nakanishi_mod:block/pale_oak_button_pressed",
      "uvlock": true,
      "x": 90
    },
    "face=wall,facing=south,powered=false": {
      "model": "nakanishi_mod:block/pale_oak_button",
      "uvlock": true,
      "x": 90,
      "y": 180
    },
    "face=wall,facing=south,powered=true": {
      "model": "nakanishi_mod:block/pale_oak_button_pressed",
      "uvlock": true,
      "x": 90,
      "y": 180
    },
    "face=wall,facing=west,powered=false": {
      "model": "nakanishi_mod:block/pale_oak_button",
      "uvlock": true,
      "x": 90,
      "y": 270
    },
    "face=wall,facing=west,powered=true": {
      "model": "nakanishi_mod:block/pale_oak_button_pressed",
      "uvlock": true,
      "x": 90,
      "y": 270
    }
  }
}

 

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

 

 

②CLASSファイルを作ろう

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

 

ボタンは【ButtonBlock】というクラスを使います。

例)

extends ButtonBlock

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

 

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

そうすると、【Properties】【BlockSetType】に加え、【int】と【boolean】を要求されます。

💡ポイント

・【int】は【ticksToStayPressed】を要求していて、ボタンを押した時にレッドストーン信号が何tick出るかを指しています。木のボタンであれば30tick(約1.5秒)、石のボタンであれば20tick(約1秒)になります。

・【boolean】は【arrowsCanPress】を要求していて、矢で押せるかどうかを指しています。木のボタンであれば【true】(矢で押せる)、石のボタンであれば【false】(矢では反応しない)になります。

 

例)

super(Properties.copy(Blocks.OAK_BUTTON),
                BlockSetType.OAK,
                30,
                true);

 

完成したCLASSファイル

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

 

ブロック登録例)

public static final RegistryObject<Block> PALE_OAK_BUTTON = BLOCKS.register("pale_oak_button", Block_Pale_Oak_Button::new);

 

ブロック登録

 

アイテム登録例)

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

 

アイテム登録

 

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

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

 

 

③設定を追加しよう

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

追記例)

"item.nakanishi_mod.pale_oak_button": "Pale Oak Button",
"block.nakanishi_mod.pale_oak_button": "Pale Oak Button"

 

翻訳(en_us.json

 

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

 

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

pale_oak_button.json例)

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

 

pale_oak_button.json

 

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

場所は

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

になります。

例)

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

 

wooden_buttons.json

 

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

 

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

 

設置確認

ボタンのON/OFFでもテクスチャに不具合はありませんでした。

 

動作確認

ボタンを押してドアの開閉を確認出来ました。

 

矢での開閉確認

矢が刺さるとドアが開閉します

 

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

適正ツールも斧になっており、ボタンがついてる原木を破壊してもボタンがドロップしました。

 

これでボタンは完成です。

 

 

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

次回は感圧板の作り方について書いていこうと思います。

 

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

 

次回記事

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