63 lines
2.4 KiB
Java
63 lines
2.4 KiB
Java
package fr.adrien1106.reframed.block;
|
|
|
|
import fr.adrien1106.reframed.util.blocks.Edge;
|
|
import net.minecraft.block.BlockState;
|
|
import net.minecraft.block.ShapeContext;
|
|
import net.minecraft.util.function.BooleanBiFunction;
|
|
import net.minecraft.util.math.BlockPos;
|
|
import net.minecraft.util.math.Direction;
|
|
import net.minecraft.util.shape.VoxelShape;
|
|
import net.minecraft.util.shape.VoxelShapes;
|
|
import net.minecraft.world.BlockView;
|
|
|
|
import static fr.adrien1106.reframed.block.ReFramedHalfLayerBlock.getHalfLayerShape;
|
|
import static fr.adrien1106.reframed.block.ReFramedStepBlock.getStepShape;
|
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.EDGE;
|
|
import static fr.adrien1106.reframed.util.blocks.BlockProperties.EDGE_FACE;
|
|
import static net.minecraft.state.property.Properties.LAYERS;
|
|
|
|
public class ReFramedStepsHalfLayerBlock extends HalfLayerDoubleReFramedBlock {
|
|
|
|
private static final VoxelShape[] SLABS_HALF_LAYER_VOXELS = new VoxelShape[196];
|
|
|
|
public ReFramedStepsHalfLayerBlock(Settings settings) {
|
|
super(settings);
|
|
}
|
|
|
|
@Override
|
|
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
|
|
return getStepsHalfLayerShape(state.get(EDGE), state.get(EDGE_FACE), state.get(LAYERS));
|
|
}
|
|
|
|
public static VoxelShape getStepsHalfLayerShape(Edge edge, int face, int layers) {
|
|
int i = edge.ordinal() * 16 + face * 8 + layers - 1;
|
|
VoxelShape shape = SLABS_HALF_LAYER_VOXELS[i];
|
|
if (shape == null) {
|
|
shape = VoxelShapes.combineAndSimplify(
|
|
getShape(edge, edge.getDirection(face), layers, 1),
|
|
getShape(edge, edge.getDirection(face), layers, 2),
|
|
BooleanBiFunction.OR
|
|
);
|
|
SLABS_HALF_LAYER_VOXELS[i] = shape;
|
|
}
|
|
return shape;
|
|
}
|
|
|
|
@Override
|
|
public VoxelShape getShape(BlockState state, int i) {
|
|
Edge edge = state.get(EDGE);
|
|
Direction face = edge.getDirection(state.get(EDGE_FACE));
|
|
return getShape(edge, face, state.get(LAYERS), i);
|
|
}
|
|
|
|
private static VoxelShape getShape(Edge edge, Direction face, int layers, int i) {
|
|
if (i == 2) {
|
|
face = edge.getOtherDirection(face);
|
|
edge = edge.getOpposite(face);
|
|
}
|
|
return i == 2
|
|
? getHalfLayerShape(edge, edge.getDirectionIndex(face), layers)
|
|
: getStepShape(edge);
|
|
}
|
|
}
|