Table of Contents

制作带朝向的方块

使方块带有方向(朝向特定的方向)也是通过方块状态完成的。这个例子介绍了垂直版的安山岩台阶。

VerticalSlabBlock.java
public class VerticalSlabBlock extends HorizontalFacingBlock {
	// codec 从 1.20.5 开始是必需的,但是还没有在 Minecraft 中实际使用。
	public static final MapCodec<VerticalSlabBlock> 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<Block, BlockState> 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 中提到的方法,注册方块:

TutorialBlocks.java
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

src/main/resources/assets/tutorial/blockstates/polished_andesite_vertical_slab.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 }
  }
}

定义方块模型

src/main/resources/assets/tutorial/models/block/vertical_slab.json
{   "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" }
            }
        }
    ]
}
src/main/resources/assets/tutorial/models/block/polished_andesite_vertical_slab.json
{
    "parent": "tutorial:block/vertical_slab",
    "textures": {
        "bottom": "block/polished_andesite",
        "top": "block/polished_andesite",
        "side": "block/polished_andesite"
    }
}

定义方块的旋转和翻转

对于带有朝向的方块,你需要覆盖 rotatemirror 方法,这样在结构方块中可以正确地被旋转或者翻转。不过,在这个例子中,HorizontalFacingBlock 类已经帮你做好了。

下一步

尝试让它可含水