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

最终效果

posted @ 2020-02-10 09:44  0.0~~  阅读(2103)  评论(0编辑  收藏  举报