• 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
    

    最终效果

  • 相关阅读:
    POJ 1062 坑爹的聘礼(枚举等级差选择性找边)
    c++ string函数详细返回值及用法!
    POJ 2240 利率变权值 Floyd变乘法
    POJ 1797 最大运载量
    API code
    编程题目的讨论
    C语言位运算符:与、或、异或、取反、左移和右移
    &与&& C语言
    反思
    CreateWindow的出错解决
  • 原文地址:https://www.cnblogs.com/moonfan/p/12289902.html
Copyright © 2020-2023  润新知