Minecraft 1.12.2 Mod開發筆記——新的方塊


方塊和物品類似:

  • 創建方塊
  • 注冊方塊
  • 給方塊和對應的物品添加模型和材質
  • (設置語言文件)

我們試着創建一個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

最終效果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM