在前面幾天裡,我們透過Minecraft內提供的各種方塊與物品來打造我們想要的效果與模組,但有的時候,這些現有的物品無法滿足我們。從今天開始,我們會從如何創造新的方塊來說明Minecraft是如何將模組內的物件載入到遊戲內的。
一個方塊會有許多的資訊,如硬度(hardness)、阻抗(resitence)與亮度(light),還有一些特定方塊專屬的狀態(BlockState),如昨天提到的.withProperty(BlockStairs.HALF, BlockStairs.EnumHalf.BOTTOM)
可以設定階梯的顛倒與否。由於方塊需要這些資訊來呈現它在世界的樣子,我們在創造一個新的方塊時一定會需要繼承Block
這個類別。
在com.ithome.mymod
內,建立一個新的套件blocks
。在其下面建立新類別EnderBlock
:
public class EnderBlock extends Block {
public EnderBlock() {
super(Material.iron);
}
}
繼承Block
的類別一定要有自己的建構子(constructor),即使你只是與Block
用一樣的方式去初始化;這種類別設計方式可以讓我們在定義子類別(EnderBlock)時將我們想要的值傳給父類別(Block),但實際有哪些屬性需要定義則放在父類別內。
定義我們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,"嘿,這裡有一個方塊不是原本就存在的,請將它註冊到你的列表內"。
回到主程式,在FMLPreInitializationEvent
的事件裡註冊我們的方塊:
public static Block enderBlock;
@EventHandler
public void preInit(FMLPreInitializationEvent event) {
enderBlock = new EnderBlock();
GameRegistry.registerBlock(enderBlock, "enderBlock");
}
這裡我們透過GameGegistry
註冊我們的方塊到內建列表內。注意:註冊表內的名稱必須都是唯一的,建議使用的名稱與我們在設定未本地化名稱相同;但請不要使用block.getUnlocalizedName()
之類的方法取得,因為這個值是tile.{your_UnLocalizeName},使用這個方法是會出現錯誤的。
我們前面一值在講未本地化名稱,那什麼時候要用本地化名稱呢?我們現在就來完成這一塊。回到你的IDE左側檔案列,在與java
同一層有一個resources
目錄 (這個是在gradle建置完後就會自動建立的目錄),按下右鍵,建立以下的目錄結構:
你如果也是第一次建立這些目錄,你的IDE目錄畫面應該會看起來與我的類似:
細心的邦友可能會注意到:這裡我們用的myfancemods其實是與我們的主程式裡MODID
模組名稱相同;但這邊用小寫的原因是,Forge在找資源的方式是透過模組ID轉成小寫
來查詢的...
在剛剛建立完的lang目錄下,建立一個en_US.lang
檔案;這個檔案是用來辨別當我們現在的Minecraft是使用英文語言時,會使用這個檔案來找我們的本地化名稱。建立後,在裡面加上下面這一行文字:
tile.enderBlock.name=My Tutorial Ender Block
特別特別注意:在上面那一行的等號左右邊不要有任何空白。別怪我沒提醒你,之後你可能會因為這個原因而Debug你的程式很久很久都找不到問題點所在。
存檔,直接執行遊戲。你應該會在方塊頁籤中看到一個紫黑相間的方塊 (這是預設材質),並且名稱是我們剛剛給的本地化名稱"My Tutorial Ender Block"。恭喜,你完成了第一個你自己創造的方塊!
上圖畫面中括弧後面的(#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檔案變更,重新進入遊戲就可以了!