在Minecraft中每一个方块都由一个Block的实例来表示,当我们需要单独更改某一个方块的属性时,我们不能简单的通过修改这个实例的属性来进行更改,这样会导致其他的方块也发生变化,这时候我们就需要使用BlockState了。
有关于原版方块的方块状态在Wiki上有非常详细的说明:方块状态 - Minecraft Wik
接下来就着手创建自己的方块。
我们创建一个包含7种状态的方块,我们需要指定其属性
public static final IntProperty COLOR = IntProperty.of("color", 0, 6);
这是Int类型的属性,从0到6分别7种不同的状态,我们打算让它分别代表7种不同的颜色。
当然除了Int类型的属性,还有BooleanProperty(布尔)、DirectionProperty(方向)、EnumProperty(枚举),这3种。我们也可以创建自己的类型,具体的方法可以去看官方的代码是如何实现的。
BlockColor.java
public class BlockColor extends Block
{
public static final IntProperty COLOR = IntProperty.of("color", 0, 6);
public BlockColor()
{
super(FabricBlockSettings.of(Material.STONE).strength(2.0f, 4.0f));
this.setDefaultState(this.getStateManager().getDefaultState().with(COLOR, 0));
}
@Override
protected void appendProperties(StateManager.Builder stateManager)
{
stateManager.add(COLOR);
}
@Override
public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit)
{
world.setBlockState(pos, state.with(COLOR, state.get(COLOR) >= 6 ? 0 : state.get(COLOR) + 1));
return ActionResult.SUCCESS;
}
}
我们在构造函数中设置了默认的方块状态,然后重载了appendProperties方法,相当于注册了我们自己的方块状态,然后重载的onUse方法是当我们右键方块的时候切换其方块状态,看起来就是这样子的。
当然,我们首先需要对其添加材质。
assets/haha/blockstates/color.json
{
"variants": {
"color=0": { "model": "haha:block/color_0" },
"color=1": { "model": "haha:block/color_1" },
"color=2": { "model": "haha:block/color_2" },
"color=3": { "model": "haha:block/color_3" },
"color=4": { "model": "haha:block/color_4" },
"color=5": { "model": "haha:block/color_5" },
"color=6": { "model": "haha:block/color_6" }
}
}
assets/haha/models/block/color_0.json
{
"parent": "block/cube_all",
"textures": {
"all": "haha:block/color_0"
}
}
assets/haha/models/block/color_1.json
{
"parent": "block/cube_all",
"textures": {
"all": "haha:block/color_1"
}
}
照着这样我们需要添加7个json文件。
assets/haha/models/item/color.json
{
"parent": "haha:block/color_0"
}
这样所有的工作就完成了,可以去尝试创造一个自己的方块了。



