package net.minecraft.world.level.block; import com.mojang.serialization.MapCodec; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition.Builder; 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.Property; import net.minecraft.world.level.block.state.properties.RailShape; public class RailBlock extends BaseRailBlock { public static final MapCodec CODEC = simpleCodec(RailBlock::new); public static final EnumProperty SHAPE = BlockStateProperties.RAIL_SHAPE; @Override public MapCodec codec() { return CODEC; } protected RailBlock(BlockBehaviour.Properties properties) { super(false, properties); this.registerDefaultState(this.stateDefinition.any().setValue(SHAPE, RailShape.NORTH_SOUTH).setValue(WATERLOGGED, false)); } @Override protected void updateState(BlockState state, Level level, BlockPos pos, Block neighborBlock) { if (neighborBlock.defaultBlockState().isSignalSource() && new RailState(level, pos, state).countPotentialConnections() == 3) { this.updateDir(level, pos, state, false); } } @Override public Property getShapeProperty() { return SHAPE; } @Override protected BlockState rotate(BlockState state, Rotation rotation) { RailShape railShape = state.getValue(SHAPE); return state.setValue(SHAPE, switch (rotation) { case CLOCKWISE_180 -> { switch (railShape) { case NORTH_SOUTH: yield RailShape.NORTH_SOUTH; case EAST_WEST: yield RailShape.EAST_WEST; case ASCENDING_EAST: yield RailShape.ASCENDING_WEST; case ASCENDING_WEST: yield RailShape.ASCENDING_EAST; case ASCENDING_NORTH: yield RailShape.ASCENDING_SOUTH; case ASCENDING_SOUTH: yield RailShape.ASCENDING_NORTH; case SOUTH_EAST: yield RailShape.NORTH_WEST; case SOUTH_WEST: yield RailShape.NORTH_EAST; case NORTH_WEST: yield RailShape.SOUTH_EAST; case NORTH_EAST: yield RailShape.SOUTH_WEST; default: throw new MatchException(null, null); } } case COUNTERCLOCKWISE_90 -> { switch (railShape) { case NORTH_SOUTH: yield RailShape.EAST_WEST; case EAST_WEST: yield RailShape.NORTH_SOUTH; case ASCENDING_EAST: yield RailShape.ASCENDING_NORTH; case ASCENDING_WEST: yield RailShape.ASCENDING_SOUTH; case ASCENDING_NORTH: yield RailShape.ASCENDING_WEST; case ASCENDING_SOUTH: yield RailShape.ASCENDING_EAST; case SOUTH_EAST: yield RailShape.NORTH_EAST; case SOUTH_WEST: yield RailShape.SOUTH_EAST; case NORTH_WEST: yield RailShape.SOUTH_WEST; case NORTH_EAST: yield RailShape.NORTH_WEST; default: throw new MatchException(null, null); } } case CLOCKWISE_90 -> { switch (railShape) { case NORTH_SOUTH: yield RailShape.EAST_WEST; case EAST_WEST: yield RailShape.NORTH_SOUTH; case ASCENDING_EAST: yield RailShape.ASCENDING_SOUTH; case ASCENDING_WEST: yield RailShape.ASCENDING_NORTH; case ASCENDING_NORTH: yield RailShape.ASCENDING_EAST; case ASCENDING_SOUTH: yield RailShape.ASCENDING_WEST; case SOUTH_EAST: yield RailShape.SOUTH_WEST; case SOUTH_WEST: yield RailShape.NORTH_WEST; case NORTH_WEST: yield RailShape.NORTH_EAST; case NORTH_EAST: yield RailShape.SOUTH_EAST; default: throw new MatchException(null, null); } } default -> railShape; }); } @Override protected BlockState mirror(BlockState state, Mirror mirror) { RailShape railShape = state.getValue(SHAPE); switch (mirror) { case LEFT_RIGHT: switch (railShape) { case ASCENDING_NORTH: return state.setValue(SHAPE, RailShape.ASCENDING_SOUTH); case ASCENDING_SOUTH: return state.setValue(SHAPE, RailShape.ASCENDING_NORTH); case SOUTH_EAST: return state.setValue(SHAPE, RailShape.NORTH_EAST); case SOUTH_WEST: return state.setValue(SHAPE, RailShape.NORTH_WEST); case NORTH_WEST: return state.setValue(SHAPE, RailShape.SOUTH_WEST); case NORTH_EAST: return state.setValue(SHAPE, RailShape.SOUTH_EAST); default: return super.mirror(state, mirror); } case FRONT_BACK: switch (railShape) { case ASCENDING_EAST: return state.setValue(SHAPE, RailShape.ASCENDING_WEST); case ASCENDING_WEST: return state.setValue(SHAPE, RailShape.ASCENDING_EAST); case ASCENDING_NORTH: case ASCENDING_SOUTH: default: break; case SOUTH_EAST: return state.setValue(SHAPE, RailShape.SOUTH_WEST); case SOUTH_WEST: return state.setValue(SHAPE, RailShape.SOUTH_EAST); case NORTH_WEST: return state.setValue(SHAPE, RailShape.NORTH_EAST); case NORTH_EAST: return state.setValue(SHAPE, RailShape.NORTH_WEST); } } return super.mirror(state, mirror); } @Override protected void createBlockStateDefinition(Builder builder) { builder.add(SHAPE, WATERLOGGED); } }