package net.minecraft.world.level.block; import java.util.Map; import java.util.function.Function; import net.minecraft.core.Direction; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.EnumProperty; import net.minecraft.world.level.block.state.properties.IntegerProperty; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; public interface SegmentableBlock { int MIN_SEGMENT = 1; int MAX_SEGMENT = 4; IntegerProperty AMOUNT = BlockStateProperties.SEGMENT_AMOUNT; default Function getShapeCalculator(EnumProperty directionProperty, IntegerProperty amountProperty) { Map map = Shapes.rotateHorizontal(Block.box(0.0, 0.0, 0.0, 8.0, this.getShapeHeight(), 8.0)); return blockState -> { VoxelShape voxelShape = Shapes.empty(); Direction direction = blockState.getValue(directionProperty); int i = (Integer)blockState.getValue(amountProperty); for (int j = 0; j < i; j++) { voxelShape = Shapes.or(voxelShape, (VoxelShape)map.get(direction)); direction = direction.getCounterClockWise(); } return voxelShape.singleEncompassing(); }; } default IntegerProperty getSegmentAmountProperty() { return AMOUNT; } default double getShapeHeight() { return 1.0; } default boolean canBeReplaced(BlockState state, BlockPlaceContext context, IntegerProperty amountProperty) { return !context.isSecondaryUseActive() && context.getItemInHand().is(state.getBlock().asItem()) && (Integer)state.getValue(amountProperty) < 4; } default BlockState getStateForPlacement(BlockPlaceContext context, Block block, IntegerProperty amountProperty, EnumProperty directionProperty) { BlockState blockState = context.getLevel().getBlockState(context.getClickedPos()); return blockState.is(block) ? blockState.setValue(amountProperty, Math.min(4, (Integer)blockState.getValue(amountProperty) + 1)) : block.defaultBlockState().setValue(directionProperty, context.getHorizontalDirection().getOpposite()); } }