我的世界Java版1.21.4的Fabric模组开发教程(十二)方块状态
这是适用于Minecraft Java版1.21.4的Fabric模组开发系列教程专栏第十二章——方块状态。想要阅读其他内容,请查看或订阅上面的专栏。
方块状态(blockstate) 指的是方块在世界中出现时展现的形式。有些复杂的方块可以与玩家交互,在此期间方块的状态可能因为玩家的交互而改变;或者是随时间推移,方块中某些数据的改变而导致方块状态的改变;又或者是世界、实体或者物品中某些数据发生改变而导致方块状态的改变。
在绝大多数情况下,方块状态改变的直接体现是方块外观的变化。例如,耕地由于周围有水从干燥变为湿润,或者是熔炉从最开始的熄灭状态,再到放入燃料后改变为燃烧状态。这些都是方块外观的变化,且均由方块状态的改变而引起。
某些方块状态已经由Minecraft API提前编写到位。例如,我们在本章中将创建一个带有多状态的方块——冰霜原木(ice_wood),它与其他原木没有差异,只是纹理有所变化。我们需要使用Minecraft API中提供的,带有AXIS
属性的自定义方块类来创建“冰霜原木”,使其能够在其他方块侧面放置时将方块进行旋转,使其顶部始终裸露在外。
在开始前,请确保已经掌握了方块创建的基本流程。如有需要,请参考我的世界Java版1.21.4的Fabric模组开发教程(十一)创建方块。
如果使用Minecraft API提供的自定义方块类来创建带有多状态的自定义方块,通常需要完成以下步骤:
- 直接在方块注册类中注册方块;
- 创建模型文件、模型描述文件和方块纹理
- 创建方块状态定义文件;
- 在语言文件中为方块添加翻译键值对并将方块添加到物品组中;
直接在方块注册类中注册方块
想创建类似原木的方块,我们可以在方块注册类中直接使用PillarBlock
注册方块。部分设置需要在配置文件中完成。
在方块注册类中声明静态常量ICE_WOOD
,使用封装的register()
方法对其初始化;
public static final Block ICE_WOOD = register("ice_wood",PillarBlock::new,AbstractBlock.Settings.create().sounds(BlockSoundGroup.WOOD),true);
参数列表中按顺序依次设置了物品名为“ice_wood”、抽象方块设置内部类对象和方块对象的函数式PillarBlock::new
、交互声音为BlockSoundGroup.WOOD
并要求注册方块对应的方块物品。
关于封装的register()
方法的使用,请参考我的世界Java版1.21.4的Fabric模组开发教程(十一)创建方块。
柱状方块类PillarBlock
PillarBlock
类是Minecraft API中提供的自定义方块类,用于创建形如柱子、树桩等形状的方块。这种方块有以下特点:
- 方块的横截面,即顶部,与方块的底部纹理相同;
- 方块的前后左右四个面的纹理相同,但与顶部和底部不同;
- 方块放置在其他方块的顶部或底部时,方块以默认的状态呈现;
- 方块放置在其他方块的前后左右四个部位时,方块将以X轴或Z轴旋转,使方块处于“躺倒”的状态呈现;
在PillarBlock
类中,设置了AXIS
属性,供开发者在模型文件中根据属性设置方块的状态;
public static final EnumProperty<Direction.Axis> AXIS = Properties.AXIS;
枚举属性类EnumProperty
与属性类Properties
EnumProperty
类用于为方块提供用于控制方块状态的枚举型属性,声明EnumProperty
对象时,需要添加泛型。在本章中暂时没有用到其中的方法,如果后续使用到相关方法将在此处补充。
Properties
类定义了游戏中用到的所有方块和流体的属性,是为自定义方块创建与游戏中相同的属性时用到的类。其中声明了大量的静态常量,供游戏中的方块和流体使用。例如,这里我们用到了“轴”属性;
public static final EnumProperty<Direction.Axis> AXIS = EnumProperty.of("axis", Direction.Axis.class);
空间轴内部枚举类Direction.Axis
Axis
类用于表示三维空间中的坐标轴方向,它在Direciton
内部类中声明,可以作为方块状态属性来控制方块状态。
在Axis
类中声明了三个枚举常量X
、Y
和Z
,分别代表立体空间的三个坐标轴方向。
在立体空间直角坐标系中,Z轴沿东西走向延伸,X轴沿南北走向延伸。
创建模型文件、模型描述文件和方块纹理
现在我们为“冰霜原木”分别创建模型文件、模型描述文件和方块纹理图,这里的写法与创建物品对应的文件写法有很大出入。
1.在assets/test/models/block
目录中创建ice_wood.json
,代表方块的模型文件;
{"parent": "minecraft:block/cube_column","textures": {"end": "test:block/ice_wood_horizontal","side": "test:block/ice_wood"}
}
这里要使用block/cube_column
父模型,代表柱状模型。按照Minecraft API中cube_column
模型的约定,方块顶部和底部共用同一纹理,配置项为"end"
;方块的其他面共用同一纹理,配置项为"side"
。
2.在assets/test/items
目录中创建创建ice_wood.json
,代表方块的模型描述文件;
{"model": {"type": "minecraft:model","model": "test:block/ice_wood"}
}
3.在assets/test/textures/block
目录中创建ice_wood.png
,作为原木前后左右四个面的纹理图;
然后再创建ice_wood_horizontal.png
,作为原木顶部和底部的纹理图。
创建方块状态定义文件
在这里我们为“冰霜原木”添加三种方块状态,分别是方块沿X、Y、Z轴摆放时方块的朝向。
在assets/test/blockstates
目录中创建ice_wood.json
,作为方块状态定义文件;
{"variants": {"axis=x": {"model": "test:block/ice_wood","x": 90,"y": 90},"axis=y": {"model": "test:block/ice_wood"},"axis=z": {"model": "test:block/ice_wood","x": 90}}
}
三种变种都需要应用test:block/ice_wood
模型且:
"axis=x"
:当方块沿X轴摆放(东西走向),将方块绕X轴顺时针旋转90度,然后再绕Y轴顺时针旋转90度;"axis=y"
:当方块沿Y轴摆放,保持原状;"axis=z"
:当方块沿Z轴摆放(南北走向),将方块绕X轴顺时针旋转90度;
在语言文件中为方块添加翻译键值对并将方块添加到物品组中
现在我们为方块添加中文翻译,并将其添加到指定物品组中。
1.在语言文件zh-cn.json
中添加一条键值对;
{..."item.test.ice_wood": "冰霜原木",...
}
将方块翻译为“冰霜原木”。
2.在入口点类的onInitialize()
方法中,将方块添加到指定物品组中;
ItemGroupEvents.modifyEntriesEvent(CUSTOM_ITEM_GROUP_KEY).register((itemGroup) -> {//...itemGroup.add(ModBlocks.ICE_WOOD.asItem());//...});
启动游戏测试
现在可以启动游戏,测试方块是否正常工作。
1.打开创造模式物品栏,找到“冰霜原木”;
可以看到物品名和物品纹理显示正常;
2.将其放置在地面上,并沿X轴和Z轴各摆放一个;
方块的朝向和显示均正常。
本章小结
本章详细阐述了创建特定方块状态的自定义方块的步骤。本文难度较小,篇幅较短,所有内容均基于创建方块的基本步骤,因此阅读本章需要有创建方块的相关知识基础。感谢各位的阅读,有兴趣可以订阅此专栏!