iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 14
2

https://ithelp.ithome.com.tw/upload/images/20190929/2011582314tNjvHo58.png

在前面幾天裡,我們透過Minecraft內提供的各種方塊與物品來打造我們想要的效果與模組,但有的時候,這些現有的物品無法滿足我們。從今天開始,我們會從如何創造新的方塊來說明Minecraft是如何將模組內的物件載入到遊戲內的。

建立方塊

一個方塊會有許多的資訊,如硬度(hardness)、阻抗(resitence)與亮度(light),還有一些特定方塊專屬的狀態(BlockState),如昨天提到的.withProperty(BlockStairs.HALF, BlockStairs.EnumHalf.BOTTOM)可以設定階梯的顛倒與否。由於方塊需要這些資訊來呈現它在世界的樣子,我們在創造一個新的方塊時一定會需要繼承Block這個類別。

  1. com.ithome.mymod內,建立一個新的套件blocks。在其下面建立新類別EnderBlock

    public class EnderBlock extends Block {
        public EnderBlock() {
            super(Material.iron);
        }
    }
    

    繼承Block的類別一定要有自己的建構子(constructor),即使你只是與Block用一樣的方式去初始化;這種類別設計方式可以讓我們在定義子類別(EnderBlock)時將我們想要的值傳給父類別(Block),但實際有哪些屬性需要定義則放在父類別內。

  2. 定義我們EnderBlock需要的屬性:

    public class EnderBlock extends Block {
        public EnderBlock() {
            super(Material.iron);
            this.setUnlocalizedName("enderBlock");
            this.setResistance(5.0f);
            this.setHardness(10.0f);
            this.setLightLevel(1.0f);
            this.setCreativeTab(CreativeTabs.tabBlock);
        }
    }
    

    由上到下依序為:

    • 方塊的材質是
    • 程式內部用的未本地化名稱為enderBlock
    • 阻抗為5.0
    • 硬度為10.0
    • 亮度為1.0
    • 此方塊可以在創作頁籤的tabBlock欄取得

    這裡我們設定的資訊之後會再說明。

註冊方塊

定義好我們的方塊後,需要告訴Minecraft,"嘿,這裡有一個方塊不是原本就存在的,請將它註冊到你的列表內"。

  1. 回到主程式,在FMLPreInitializationEvent的事件裡註冊我們的方塊:

    public static Block enderBlock;
    
    @EventHandler
    public void preInit(FMLPreInitializationEvent event) {
        enderBlock = new EnderBlock();
        GameRegistry.registerBlock(enderBlock, "enderBlock");
    }
    

    這裡我們透過GameGegistry註冊我們的方塊到內建列表內。注意:註冊表內的名稱必須都是唯一的,建議使用的名稱與我們在設定未本地化名稱相同;但請不要使用block.getUnlocalizedName()之類的方法取得,因為這個值是tile.{your_UnLocalizeName},使用這個方法是會出現錯誤的。

  2. 我們前面一值在講未本地化名稱,那什麼時候要用本地化名稱呢?我們現在就來完成這一塊。回到你的IDE左側檔案列,在與java同一層有一個resources目錄 (這個是在gradle建置完後就會自動建立的目錄),按下右鍵,建立以下的目錄結構:

    • resources/assets
    • resources/assets/myfancymods
    • resources/assets/myfancymods/lang

    你如果也是第一次建立這些目錄,你的IDE目錄畫面應該會看起來與我的類似:
    https://ithelp.ithome.com.tw/upload/images/20190929/20115823wwDlJl8Vn6.png

    細心的邦友可能會注意到:這裡我們用的myfancemods其實是與我們的主程式裡MODID模組名稱相同;但這邊用小寫的原因是,Forge在找資源的方式是透過模組ID轉成小寫來查詢的...

  3. 在剛剛建立完的lang目錄下,建立一個en_US.lang檔案;這個檔案是用來辨別當我們現在的Minecraft是使用英文語言時,會使用這個檔案來找我們的本地化名稱。建立後,在裡面加上下面這一行文字:

    tile.enderBlock.name=My Tutorial Ender Block
    

    https://ithelp.ithome.com.tw/upload/images/20190929/20115823mPgtmPoWSy.png

    特別特別注意:在上面那一行的等號左右邊不要有任何空白。別怪我沒提醒你,之後你可能會因為這個原因而Debug你的程式很久很久都找不到問題點所在。

  4. 存檔,直接執行遊戲。你應該會在方塊頁籤中看到一個紫黑相間的方塊 (這是預設材質),並且名稱是我們剛剛給的本地化名稱"My Tutorial Ender Block"。恭喜,你完成了第一個你自己創造的方塊!

https://ithelp.ithome.com.tw/upload/images/20190929/20115823wgGAh2cgIH.png

上圖畫面中括弧後面的(#0198)是我們新方塊的唯一數字ID、以及下面一排的myfancymods:enderBlock物品ID,由Forge給定的,可以在遊戲內透過按下F3 + H來查看訊息。有了物品ID就可以透過指令/give來取得這項物品。


註:假如你已經跟我的步驟一模一樣,但卻還是沒有看到本地化名稱出現,這個可能是Forge與某些版本的Intellij有相容性問題...你可以在build.gradle內最後面加上下面幾行:

// To fix the wrong copy of resources in build
sourceSets {
    main {
        output.resourcesDir = output.classesDir
    }
}

確認build檔案變更,重新進入遊戲就可以了!


上一篇
[Day13] 羅馬競技場是一鍵造成的 (下)
下一篇
[Day15] 與方塊事件互動
系列文
[Minecraft - 當個創世神] 從玩遊戲到設計遊戲30

尚未有邦友留言

立即登入留言