diff --git a/common/src/main/java/dev/dubhe/anvilcraft/block/LargeCakeBlock.java b/common/src/main/java/dev/dubhe/anvilcraft/block/LargeCakeBlock.java index 0ff00dc2a..56b5e4262 100644 --- a/common/src/main/java/dev/dubhe/anvilcraft/block/LargeCakeBlock.java +++ b/common/src/main/java/dev/dubhe/anvilcraft/block/LargeCakeBlock.java @@ -21,11 +21,102 @@ import net.minecraft.world.level.block.state.properties.Property; import net.minecraft.world.level.gameevent.GameEvent; import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.BooleanOp; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; import org.jetbrains.annotations.NotNull; +import java.util.stream.Stream; + public class LargeCakeBlock extends AbstractMultiplePartBlock { public static final EnumProperty HALF = EnumProperty.create("half", Cube3x3PartHalf.class); + protected static final VoxelShape BASE_ANGLE_NW = Stream.of( + Block.box(1, 0, 1, 16, 6, 16), Block.box(0, 6, 0, 16, 16, 16) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + protected static final VoxelShape BASE_ANGLE_SW = Stream.of( + Block.box(1, 0, 0, 16, 6, 15), Block.box(0, 6, 0, 16, 16, 16) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + protected static final VoxelShape BASE_ANGLE_SE = Stream.of( + Block.box(0, 0, 0, 15, 6, 15), Block.box(0, 6, 0, 16, 16, 16) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + protected static final VoxelShape BASE_ANGLE_NE = Stream.of( + Block.box(0, 0, 1, 15, 6, 16), Block.box(0, 6, 0, 16, 16, 16) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + + protected static final VoxelShape BASE_N = Stream.of( + Block.box(0, 6, 0, 16, 16, 16), Block.box(0, 0, 1, 16, 6, 16) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + protected static final VoxelShape BASE_W = Stream.of( + Block.box(0, 6, 0, 16, 16, 16), Block.box(1, 0, 0, 16, 6, 16) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + protected static final VoxelShape BASE_S = Stream.of( + Block.box(0, 6, 0, 16, 16, 16), Block.box(0, 0, 0, 16, 6, 15) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + protected static final VoxelShape BASE_E = Stream.of( + Block.box(0, 6, 0, 16, 16, 16), Block.box(0, 0, 0, 15, 6, 16) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + + protected static final VoxelShape MID_CENTER = Block.box(1, 0, 1, 15, 14, 15); + + protected static final VoxelShape MID_ANGLE_NW = Stream.of( + Block.box(5, 5, 5, 17, 14, 17), Block.box(6, 0, 6, 17, 5, 17) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + protected static final VoxelShape MID_ANGLE_SW = Stream.of( + Block.box(5, 5, -1, 17, 14, 11), Block.box(6, 0, -1, 17, 5, 10) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + protected static final VoxelShape MID_ANGLE_SE = Stream.of( + Block.box(-1, 5, -1, 11, 14, 11), Block.box(-1, 0, -1, 10, 5, 10) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + protected static final VoxelShape MID_ANGLE_NE = Stream.of( + Block.box(-1, 5, 5, 11, 14, 17), Block.box(-1, 0, 6, 10, 5, 17) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + + + protected static final VoxelShape MID_N = Stream.of( + Block.box(1, 5, 5, 15, 14, 17), Block.box(1, 0, 6, 15, 5, 17) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + protected static final VoxelShape MID_W = Stream.of( + Block.box(5, 5, 1, 17, 14, 15), Block.box(6, 0, 1, 17, 5, 15) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + protected static final VoxelShape MID_S = Stream.of( + Block.box(1, 5, -1, 15, 14, 11), Block.box(1, 0, -1, 15, 5, 10) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + protected static final VoxelShape MID_E = Stream.of( + Block.box(-1, 5, 1, 11, 14, 15), Block.box(-1, 0, 1, 10, 5, 15) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + + protected static final VoxelShape TOP_CENTER = Stream.of( + Block.box(5, 10, 5, 11, 13, 11), Block.box(2, -2, 2, 14, 10, 14) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + + protected static final VoxelShape TOP_ANGLE_NW = Stream.of( + Block.box(11, -2, 11, 18, 2, 18), Block.box(10, 2, 10, 18, 10, 18) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + protected static final VoxelShape TOP_ANGLE_SW = Stream.of( + Block.box(11, -2, -2, 18, 2, 5), Block.box(10, 2, -2, 18, 10, 6) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + protected static final VoxelShape TOP_ANGLE_SE = Stream.of( + Block.box(-2, -2, -2, 5, 2, 5), Block.box(-2, 2, -2, 6, 10, 6) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + protected static final VoxelShape TOP_ANGLE_NE = Stream.of( + Block.box(-2, -2, 11, 5, 2, 18), Block.box(-2, 2, 10, 6, 10, 18) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + + protected static final VoxelShape TOP_N = Stream.of( + Block.box(2, -2, 11, 14, 2, 18), Block.box(2, 2, 10, 14, 10, 18) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + protected static final VoxelShape TOP_W = Stream.of( + Block.box(11, -2, 2, 18, 2, 14), Block.box(10, 2, 2, 18, 10, 14) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + protected static final VoxelShape TOP_S = Stream.of( + Block.box(2, -2, -2, 14, 2, 5), Block.box(2, 2, -2, 14, 10, 6) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + protected static final VoxelShape TOP_E = Stream.of( + Block.box(-2, -2, 2, 5, 2, 14), Block.box(-2, 2, 2, 6, 10, 14) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + /** * @param properties 属性 */ @@ -37,6 +128,45 @@ public LargeCakeBlock(Properties properties) { ); } + @SuppressWarnings("deprecation") + @Override + public @NotNull VoxelShape getShape( + @NotNull BlockState state, + @NotNull BlockGetter level, + @NotNull BlockPos pos, + @NotNull CollisionContext context + ) { + return switch (state.getValue(HALF)) { + case TOP_CENTER -> TOP_CENTER; + case TOP_E -> TOP_E; + case TOP_W -> TOP_W; + case TOP_N -> TOP_N; + case TOP_S -> TOP_S; + case TOP_EN -> TOP_ANGLE_NE; + case TOP_ES -> TOP_ANGLE_SE; + case TOP_WN -> TOP_ANGLE_NW; + case TOP_WS -> TOP_ANGLE_SW; + case MID_CENTER -> MID_CENTER; + case MID_E -> MID_E; + case MID_W -> MID_W; + case MID_N -> MID_N; + case MID_S -> MID_S; + case MID_EN -> MID_ANGLE_NE; + case MID_ES -> MID_ANGLE_SE; + case MID_WN -> MID_ANGLE_NW; + case MID_WS -> MID_ANGLE_SW; + case BOTTOM_E -> BASE_E; + case BOTTOM_W -> BASE_W; + case BOTTOM_N -> BASE_N; + case BOTTOM_S -> BASE_S; + case BOTTOM_EN -> BASE_ANGLE_NE; + case BOTTOM_ES -> BASE_ANGLE_SE; + case BOTTOM_WN -> BASE_ANGLE_NW; + case BOTTOM_WS -> BASE_ANGLE_SW; + default -> Block.box(0, 1, 0, 16, 16, 16); + }; + } + @Override protected void createBlockStateDefinition(@NotNull StateDefinition.Builder builder) { builder.add(HALF);