User Tools

Site Tools


zh_cn:tutorial:directionalblock

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
zh_cn:tutorial:directionalblock [2022/12/16 02:07] solidblockzh_cn:tutorial:directionalblock [2024/12/08 14:06] (current) – [下一步] solidblock
Line 1: Line 1:
-===== 制作带朝向的方块 =====+====== 制作带朝向的方块 ======
  
 使方块带有方向(朝向特定的方向)也是通过方块状态完成的。这个例子介绍了垂直版的安山岩台阶。 使方块带有方向(朝向特定的方向)也是通过方块状态完成的。这个例子介绍了垂直版的安山岩台阶。
Line 5: Line 5:
 {{:tutorial:vertslab.png?200|}} {{:tutorial:vertslab.png?200|}}
  
-<code java>+<code java VerticalSlabBlock.java>
 public class VerticalSlabBlock extends HorizontalFacingBlock { public class VerticalSlabBlock extends HorizontalFacingBlock {
 + // codec 从 1.20.5 开始是必需的,但是还没有在 Minecraft 中实际使用。
 + public static final MapCodec<VerticalSlabBlock> CODEC = Block.createCodec(VerticalSlabBlock::new);
  
  public VerticalSlabBlock(Settings settings) {  public VerticalSlabBlock(Settings settings) {
  super(settings);  super(settings);
  setDefaultState(getDefaultState().with(Properties.HORIZONTAL_FACING, Direction.NORTH));  setDefaultState(getDefaultState().with(Properties.HORIZONTAL_FACING, Direction.NORTH));
 + }
 +
 + @Override
 + protected MapCodec<? extends VerticalSlabBlock> getCodec() {
 + 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 switch (dir) { 
- case NORTH+ case NORTH -> VoxelShapes.cuboid(0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.5f); 
- return 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 SOUTH+ case EAST -> VoxelShapes.cuboid(0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f); 
- return VoxelShapes.cuboid(0.0f, 0.0f, 0.5f, 1.0f, 1.0f, 1.0f); + case WEST -> VoxelShapes.cuboid(0.0f, 0.0f, 0.0f, 0.5f, 1.0f, 1.0f); 
- case EAST+ default -> VoxelShapes.fullCube(); 
- return VoxelShapes.cuboid(0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f); + };
- case WEST+
- return VoxelShapes.cuboid(0.0f, 0.0f, 0.0f, 0.5f, 1.0f, 1.0f); +
- default+
- return VoxelShapes.fullCube(); +
- }+
  }  }
  
         @Override         @Override
  public BlockState getPlacementState(ItemPlacementContext ctx) {  public BlockState getPlacementState(ItemPlacementContext ctx) {
- return super.getPlacementState(ctx).with(Properties.HORIZONTAL_FACING, ctx.getPlayerFacing().getOpposite());+ return super.getPlacementState(ctx).with(Properties.HORIZONTAL_FACING, ctx.getHorizontalPlayerFacing().getOpposite());
  }  }
  
 } }
 </code> </code>
-<code java> + 
-public class ExampleMod implements ModInitialzer +然后按照在 [[blocks]] 中提到的方法,注册方块: 
-    public static final VerticalSlabBlock POLISHED_ANDESITE_VERTICAL_SLAB = Registry.register( +<code java TutorialBlocks.java> 
-        Registries.BLOCK, +public final class TutorialBlocks implements ModInitializer { 
-        new Identifier("tutorial", "polished_andesite_vertical_slab")+    [...] 
-        new VerticalSlabBlock(FabricBlockSettings.copyOf(Blocks.POLISHED_ANDESITE)));+     
 +    public static final VerticalSlabBlock POLISHED_ANDESITE_VERTICAL_SLAB = register("polished_andesite_vertical_slab",  
 +        new VerticalSlabBlock(Block.Settings.copy(Blocks.POLISHED_ANDESITE)));
 } }
 </code> </code>
Line 97: Line 101:
 } }
 </code> </code>
 +
 +===== 定义方块的旋转和翻转 =====
 +对于带有朝向的方块,你需要覆盖 ''rotate'' 和 ''mirror'' 方法,这样在结构方块中可以正确地被旋转或者翻转。不过,在这个例子中,''HorizontalFacingBlock'' 类已经帮你做好了。
 +
 +
 +===== 影响寻路 =====
 +如果在游戏内放置这些方块,可能会发现个问题,生物寻路时,会尝试这些方块,似乎这些方块不存在,结果被这些方块阻挡。这是因为,生物会将这些非完整的方块视为不挡路的方块。要修改这一寻路行为,需要修改 ''canPathfindThrough'' 方法:
 +<code java>
 +  @Override
 +  protected boolean canPathfindThrough(BlockState state, NavigationType type) {
 +    return false;
 +  }
 +</code>
 +
 +在原版中,有些方块有不同的路径节点类型(path node type)。例如,生物会避免危险的方块,比如岩浆块、凋零玫瑰和仙人掌。你也可以让你的生物以不同方式对待这些方块,方法就是利用 Fabric API 中的 ''LandPathNodeTypesRegistry'' 修改路径节点类型。
 +
 +===== 下一步 =====
 +尝试让它[[waterloggable|可含水]]
 +
zh_cn/tutorial/directionalblock.1671156440.txt.gz · Last modified: 2022/12/16 02:07 by solidblock