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:09] – solidblock | zh_cn:tutorial:directionalblock [2024/12/08 14:06] (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 100: | Line 104: | ||
===== 定义方块的旋转和翻转 ===== | ===== 定义方块的旋转和翻转 ===== | ||
对于带有朝向的方块,你需要覆盖 '' | 对于带有朝向的方块,你需要覆盖 '' | ||
+ | |||
+ | |||
+ | ===== 影响寻路 ===== | ||
+ | 如果在游戏内放置这些方块,可能会发现个问题,生物寻路时,会尝试这些方块,似乎这些方块不存在,结果被这些方块阻挡。这是因为,生物会将这些非完整的方块视为不挡路的方块。要修改这一寻路行为,需要修改 '' | ||
+ | <code java> | ||
+ | @Override | ||
+ | protected boolean canPathfindThrough(BlockState state, NavigationType type) { | ||
+ | return false; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | 在原版中,有些方块有不同的路径节点类型(path node type)。例如,生物会避免危险的方块,比如岩浆块、凋零玫瑰和仙人掌。你也可以让你的生物以不同方式对待这些方块,方法就是利用 Fabric API 中的 '' | ||
===== 下一步 ===== | ===== 下一步 ===== | ||
尝试让它[[waterloggable|可含水]] | 尝试让它[[waterloggable|可含水]] | ||
zh_cn/tutorial/directionalblock.1671156552.txt.gz · Last modified: 2022/12/16 02:09 by solidblock