zh_cn:tutorial:directionalblock
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| zh_cn:tutorial:directionalblock [2022/12/16 02:07] – solidblock | zh_cn:tutorial:directionalblock [2025/04/01 09:22] (current) – [下一步] solidblock | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ===== 制作带朝向的方块 ===== | + | ====== 制作带朝向的方块 |
| 使方块带有方向(朝向特定的方向)也是通过方块状态完成的。这个例子介绍了垂直版的安山岩台阶。 | 使方块带有方向(朝向特定的方向)也是通过方块状态完成的。这个例子介绍了垂直版的安山岩台阶。 | ||
| Line 5: | Line 5: | ||
| {{: | {{: | ||
| - | <code java> | + | < |
| public class VerticalSlabBlock extends HorizontalFacingBlock { | public class VerticalSlabBlock extends HorizontalFacingBlock { | ||
| + | // codec 从 1.20.5 开始是必需的,但是还没有在 Minecraft 中实际使用。 | ||
| + | public static final MapCodec< | ||
| public VerticalSlabBlock(Settings settings) { | public VerticalSlabBlock(Settings settings) { | ||
| super(settings); | super(settings); | ||
| setDefaultState(getDefaultState().with(Properties.HORIZONTAL_FACING, | setDefaultState(getDefaultState().with(Properties.HORIZONTAL_FACING, | ||
| + | } | ||
| + | |||
| + | @Override | ||
| + | protected MapCodec<? | ||
| + | return CODEC; | ||
| } | } | ||
| Line 21: | Line 28: | ||
| public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext ctx) { | public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext ctx) { | ||
| Direction dir = state.get(FACING); | Direction dir = state.get(FACING); | ||
| - | switch(dir) { | + | return |
| - | case NORTH: | + | case NORTH -> VoxelShapes.cuboid(0.0f, |
| - | return | + | case SOUTH -> VoxelShapes.cuboid(0.0f, |
| - | case SOUTH: | + | case EAST -> VoxelShapes.cuboid(0.5f, |
| - | return | + | case WEST -> VoxelShapes.cuboid(0.0f, |
| - | case EAST: | + | default |
| - | return | + | }; |
| - | case WEST: | + | |
| - | return | + | |
| - | default: | + | |
| - | return | + | |
| - | } | + | |
| } | } | ||
| @Override | @Override | ||
| public BlockState getPlacementState(ItemPlacementContext ctx) { | public BlockState getPlacementState(ItemPlacementContext ctx) { | ||
| - | return super.getPlacementState(ctx).with(Properties.HORIZONTAL_FACING, | + | return super.getPlacementState(ctx).with(Properties.HORIZONTAL_FACING, |
| } | } | ||
| } | } | ||
| </ | </ | ||
| - | <code java> | + | |
| - | public class ExampleMod | + | 然后按照在 [[blocks]] 中提到的方法,注册方块: |
| - | public static final VerticalSlabBlock POLISHED_ANDESITE_VERTICAL_SLAB = Registry.register( | + | < |
| - | Registries.BLOCK, | + | public |
| - | new Identifier(" | + | [...] |
| - | new VerticalSlabBlock(FabricBlockSettings.copyOf(Blocks.POLISHED_ANDESITE))); | + | |
| + | public static final VerticalSlabBlock POLISHED_ANDESITE_VERTICAL_SLAB = register(" | ||
| + | new VerticalSlabBlock(Block.Settings.copy(Blocks.POLISHED_ANDESITE))); | ||
| } | } | ||
| </ | </ | ||
| Line 97: | Line 101: | ||
| } | } | ||
| </ | </ | ||
| + | |||
| + | ===== 定义方块的旋转和翻转 ===== | ||
| + | 对于带有朝向的方块,你需要覆盖 '' | ||
| + | |||
| + | |||
| + | ===== 影响寻路 ===== | ||
| + | 如果在游戏内放置这些方块,可能会发现个问题,生物寻路时,会尝试这些方块,似乎这些方块不存在,结果被这些方块阻挡。这是因为,生物会将这些非完整的方块视为不挡路的方块。要修改这一寻路行为,需要修改 '' | ||
| + | <code java> | ||
| + | @Override | ||
| + | protected boolean canPathfindThrough(BlockState state, NavigationType type) { | ||
| + | return false; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | 在原版中,有些方块有不同的路径节点类型(path node type)。例如,生物会避免危险的方块,比如岩浆块、凋零玫瑰和仙人掌。你也可以让你的生物以不同方式对待这些方块,方法就是利用 Fabric API 中的 '' | ||
| + | |||
| + | ===== 下一步 ===== | ||
| + | 尝试让它[[waterloggable|可含水]]。 | ||
| + | |||
zh_cn/tutorial/directionalblock.1671156440.txt.gz · Last modified: 2022/12/16 02:07 by solidblock