方塊和物品類似:
- 創建方塊
- 注冊方塊
- 給方塊和對應的物品添加模型和材質
- (設置語言文件)
我們試着創建一個6面全是X的方塊。
創建方塊
在包 moonfan.mymod.block
下新建類 BlockCross
並繼承 Block 類:
public class BlockCross extends Block {
public BlockCross() {
super(Material.ROCK);
setCreativeTab(MyMod.MY_TAB);
}
}
和 Item 不同的是,創建 Block 必須先傳入一個材質對象,目前來看,這個材質對象規定了 Minecraft 地圖上顯示的顏色,比如設置成 ROCK 之后地圖上顯示的方塊顏色就是石頭的灰色。其他作用比如區分木門/鐵門?暫時不清楚。
注冊方塊
在包 moonfan.mymod.block
下新建 BlockLoader 類:
@Mod.EventBusSubscriber
public class BlockLoader {
public static Block cross = new BlockCross();
@SubscribeEvent
public static void registerBlock(RegistryEvent.Register<Block> event){
event.getRegistry().register(cross.setRegistryName("mymod:cross_block"));
}
}
不僅要注冊放在地上的方塊,也要注冊方塊所對應的物品欄的物品,這個“對應的物品”用 ItemBlock 來表示,注冊名同方塊。
@SubscribeEvent
public static void registerItems(RegistryEvent.Register<Item> event){
event.getRegistry().register(new ItemBlock(cross).setRegistryName("mymod:cross_block"));
}
添加模型和材質
方塊模型
Minecraft 支持 json/obj/b3d 三種格式的模型,我們這里先用最基本的 json 模型。
json模型的詳細解釋見 wiki
方塊模型的總體結構是:方塊狀態表-方塊模型-方塊材質,對每一個方塊來說,規定若干個狀態,根據特定狀態加載特定模型。比如不同的樓梯連接狀態,活塞伸出狀態等。於是,
新建目錄 resources/assets/mymod/blockstates/,再新建文件 cross_block.json ,文件名即為方塊注冊名:
{
"variants": {
"normal": {
"model": "mymod:cross_block"
}
}
}
- variants 其下包括方塊的每一個狀態
- normal 默認狀態
這個 blockstate 表示,在默認 normal 狀態下加載 mymod/models/block/cross_block.json 這個模型,於是我們在該目錄下新建cross_block.json:
{
"parent": "block/cube",
"textures": {
"particle": "mymod:blocks/cross_block",
"down": "mymod:blocks/cross_block",
"up": "mymod:blocks/cross_block",
"north": "mymod:blocks/cross_block",
"south": "mymod:blocks/cross_block",
"west": "mymod:blocks/cross_block",
"east": "mymod:blocks/cross_block"
}
}
或者:
{
"parent": "block/cube_all",
"textures": {
"all": "mymod:blocks/cross_block"
}
}
- parent 方塊模型的繼承關系,目前來看常用的比如:
- block 最基本的方塊模型
- cube 這個模型可自由規定上/下/東/西/南/北六個面和破碎后粒子的材質
- cube_all 是 cube 的特例,用 all 表示 cube 的6個面和破碎后的粒子,用於以上全相同的方塊
- cube_bottom_top 是 cube 的特例,用 top/bottom/side 表示上下和四周6個面
- cube_column 是 cube 的特例,用 end/side 表示上下和四周
- 更多的參照 jar 包······
- particle 破碎后粒子效果的材質
現在我們可以把准備好的貼圖 放在 mymod/textures/blocks/ 文件夾下了
如果現在啟動游戲,會發現拿在手里的方塊依舊是紫黑塊,放在地上時正常,於是我們要添加物品模型
注意:blockstate 中的 model 默認就在 modid/models/block/,但 model 文件里面的 parent 和textures 默認是在 modid/models/ 和 modid/textures/
方塊對應的物品的模型
方塊對應的物品依然是物品,采用物品添加材質那一套,即手動添加材質事件,在 mymod/models/item/ 下新建 cross_block.json 模型文件,不過因為物品的材質和方塊一般是一致的,我們可以直接繼承方塊的材質:
{
"parent": "mymod:block/cross_block"
}
接着,我們添加材質的事件,使用 Item.getItemFromBlock()
獲取方塊對應的物品
@SubscribeEvent
public static void registerItemBlockModel(ModelRegistryEvent event){
ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(cross),0,new ModelResourceLocation(cross.getRegistryName(),"inventory"));
}
本地化
最后,我們發現方塊和物品的名字是 tile.null.name
,根據之前什么不正常等號左邊寫什么的原則,我們對方塊進行本地化。不過只需要對方塊本身進行操作,不需要對方塊對應物品操作。
BlockCross.java
public class BlockCross extends Block {
public BlockCross() {
super(Material.ROCK);
setCreativeTab(MyMod.MY_TAB);
setUnlocalizedName("mymod.cross_block");
}
}
en_us.lang
tile.mymod.cross_block.name=Cross Block