iT邦幫忙

2024 iThome 鐵人賽

DAY 4
0

方塊

既是方塊,又是物品

昨天我們透過註冊表註冊了一個物品殞鐵錠,今天我們要來註冊一個與殞鐵錠對應的殞鐵磚。
方塊與物品不同,物品只以掉落物以及物品欄型態出現,而方塊則可以構成Minecraft中的世界。方塊既可以以物品形式存在,也可以實體的方式存在,所以我們需要同時註冊Item註冊表與Block註冊表。

https://ithelp.ithome.com.tw/upload/images/20240902/20161797TGTz6kdr7I.png
我們先建立一個block資料夾,在資料夾中建立一個ModBlocks class,這個class中我們需要兩個方法,一個用來註冊我們的磚的物品型態,另一個用來註冊方塊型態。

private static Item registerBlockItem(String name, Block block){
        return Registry.register(Registries.ITEM, new Identifier(TheClassicofMountainsandOceans.MOD_ID, name)
                , new BlockItem(block, new FabricItemSettings()));

    }

這個方法跟昨天的註冊物品很像,但是有幾點不一樣,首先我們的第二個參數是Block類,而不是Item,同時在第四行這裡我們新建了一個BlockItem實例,代表傳入的方塊block。

private static Block registerBlock(String name,Block block){
        registerBlockItem(name, block);
        return Registry.register(Registries.BLOCK, new Identifier(TheClassicofMountainsandOceans.MOD_ID, name), block);
    }

這個就是用來註冊方塊的方法了,可以看到輸入是name跟一個Block類,我們先使用剛剛寫好的registerBlockItem同步建立一個BlockItem,這個BlockItem也帶入我們的name跟block,後面我們使用Registry.register註冊一個BLOCK類,識別符一樣是帶入MOD_ID跟name,最後是方塊的屬性。

    public static final Block SIDERITE_BLOCK = registerBlock("siderite_block",
            new Block(FabricBlockSettings.copyOf(Blocks.IRON_BLOCK)));

接下來我們就可以呼叫剛剛寫好的方法了,我們先建立一個Block類的常量,同時是靜態且不可變的,我們的方塊名稱叫siderite_block,而我們的方塊屬性,因為要設定的內容比較多,例如方塊放置時的聲音、抗爆性等等屬性,所以我們可以直接使用FabricBlcokSettig.copyOf(Blocks.IRON_BLOCK),這樣我們方塊的屬性就會跟鐵磚一樣。

這是鐵磚的屬性
https://ithelp.ithome.com.tw/upload/images/20240902/20161797y85wzQSCho.png

JSON檔

完成以上的程式,我們一樣需要JSON檔來規範幾件事情,首先我們需要在assets/[MODID]中建立一個新資料夾,叫做blockstates,並且在裡面建立一個JSON檔,名稱要跟你建立的Block的ID(小寫的那個)一樣,以我的為例,我的JSON檔叫siderite_block.json。
https://ithelp.ithome.com.tw/upload/images/20240902/20161797ja0ucpFI9V.png

接著裡面這樣寫

{
  "variants": {
    "": {
      "model": "como:block/siderite_block"
    }
  }
}

variants代表著Block中有許多不同狀態,每個狀態分別要用哪一個texture做外觀。
""代表這個方塊沒有狀態變化,也就是只有一個texture不會改變。
"model": "como:block/siderite_block" 定義了這個方塊的model文件放在哪裡,這代表我們需要在models中建立一個新資料夾叫做block,將我們的方塊model放在這裡,一樣我們取名siderite_block.json,裡面這樣寫

{
  "parent": "minecraft:block/cube_all",
  "textures": {
    "all": "como:block/siderite_block"
  }
}

"parent": "minecraft:block/cube_all"
parent代表我們使用了一個父模型,這個模型會決定怎麼渲染這個方塊,以及這個方塊的形狀,這裡我們使用cube_all代表這個方塊是六面都使用相同的紋理,像是泥土這類的方塊,而不是像樹木一樣有些面有不同。
"textures": { "all": "como:block/siderite_block" }
代表每一個面都使用相同的texture,而texture的存放位置在block/siderite_block中,所以現在我們可以把我們的紋理移到texture/block中,檔名要記得跟Block的ID一樣。

接下來記得要在en_us中加入這個方塊在遊戲中的翻譯
https://ithelp.ithome.com.tw/upload/images/20240902/20161797rvjD6YscPO.png
因為是方塊,所以前面記得改成block。

成果

這樣萬事俱備,我們可以來看看成果了
https://ithelp.ithome.com.tw/upload/images/20240902/20161797QUyYlWnk7H.png

可以看到我們的方塊以及方塊對應的物品都出現了,這樣就大功告成


上一篇
Minecraft Fabric Mod 模組製作 DAY3
下一篇
Minecraft Fabric Mod 模組製作 DAY5
系列文
Minecraft JAVA Fabric 模組製作 : 成為真正的創世神28
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言