方块和物品类似:
- 创建方块
- 注册方块
- 给方块和对应的物品添加模型和材质
- (设置语言文件)
我们试着创建一个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
最终效果