====== 制作带朝向的方块 ======
使方块带有方向(朝向特定的方向)也是通过方块状态完成的。这个例子介绍了垂直版的安山岩台阶。
{{:tutorial:vertslab.png?200|}}
public class VerticalSlabBlock extends HorizontalFacingBlock {
// codec 从 1.20.5 开始是必需的,但是还没有在 Minecraft 中实际使用。
public static final MapCodec CODEC = Block.createCodec(VerticalSlabBlock::new);
public VerticalSlabBlock(Settings settings) {
super(settings);
setDefaultState(getDefaultState().with(Properties.HORIZONTAL_FACING, Direction.NORTH));
}
@Override
protected MapCodec extends VerticalSlabBlock> getCodec() {
return CODEC;
}
@Override
protected void appendProperties(StateManager.Builder builder) {
builder.add(Properties.HORIZONTAL_FACING);
}
@Override
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext ctx) {
Direction dir = state.get(FACING);
return switch (dir) {
case NORTH -> VoxelShapes.cuboid(0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.5f);
case SOUTH -> VoxelShapes.cuboid(0.0f, 0.0f, 0.5f, 1.0f, 1.0f, 1.0f);
case EAST -> VoxelShapes.cuboid(0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f);
case WEST -> VoxelShapes.cuboid(0.0f, 0.0f, 0.0f, 0.5f, 1.0f, 1.0f);
default -> VoxelShapes.fullCube();
};
}
@Override
public BlockState getPlacementState(ItemPlacementContext ctx) {
return super.getPlacementState(ctx).with(Properties.HORIZONTAL_FACING, ctx.getHorizontalPlayerFacing().getOpposite());
}
}
然后按照在 [[blocks]] 中提到的方法,注册方块:
public final class TutorialBlocks implements ModInitializer {
[...]
public static final VerticalSlabBlock POLISHED_ANDESITE_VERTICAL_SLAB = register("polished_andesite_vertical_slab",
new VerticalSlabBlock(Block.Settings.copy(Blocks.POLISHED_ANDESITE)));
}
==== 定义方块状态 JSON ====
{
"variants": {
"facing=north": { "model": "tutorial:block/polished_andesite_vertical_slab", "uvlock": true },
"facing=east": { "model": "tutorial:block/polished_andesite_vertical_slab", "y": 90, "uvlock": true },
"facing=south": { "model": "tutorial:block/polished_andesite_vertical_slab", "y": 180, "uvlock": true },
"facing=west": { "model": "tutorial:block/polished_andesite_vertical_slab", "y": 270, "uvlock": true }
}
}
==== 定义方块模型 ====
{ "parent": "block/block",
"textures": {
"particle": "#side"
},
"elements": [
{ "from": [ 0, 0, 0 ],
"to": [ 16, 16, 8 ],
"faces": {
"down": { "texture": "#bottom", "cullface": "down" },
"up": { "texture": "#top", "cullface": "up" },
"north": { "texture": "#side", "cullface": "north" },
"south": { "texture": "#side", "cullface": "south" },
"west": { "texture": "#side", "cullface": "west" },
"east": { "texture": "#side", "cullface": "east" }
}
}
]
}
{
"parent": "tutorial:block/vertical_slab",
"textures": {
"bottom": "block/polished_andesite",
"top": "block/polished_andesite",
"side": "block/polished_andesite"
}
}
===== 定义方块的旋转和翻转 =====
对于带有朝向的方块,你需要覆盖 ''rotate'' 和 ''mirror'' 方法,这样在结构方块中可以正确地被旋转或者翻转。不过,在这个例子中,''HorizontalFacingBlock'' 类已经帮你做好了。
===== 下一步 =====
尝试让它[[waterloggable|可含水]]