53 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| 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<BlockState, VoxelShape> getShapeCalculator(EnumProperty<Direction> directionProperty, IntegerProperty amountProperty) {
 | |
| 		Map<Direction, VoxelShape> 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<Direction> 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());
 | |
| 	}
 | |
| }
 |