package su.a71.new_soviet.blocks; import net.minecraft.block.*; import net.minecraft.entity.ai.pathing.NavigationType; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.fluid.FluidState; import net.minecraft.fluid.Fluids; import net.minecraft.item.ItemPlacementContext; import net.minecraft.state.StateManager; import net.minecraft.state.property.BooleanProperty; import net.minecraft.state.property.IntProperty; import net.minecraft.state.property.Properties; import net.minecraft.state.property.Property; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.BlockView; import net.minecraft.world.World; import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldView; import org.jetbrains.annotations.Nullable; public class CheckerBlock extends Block implements Waterloggable { public static final int MAX_PICKLES = 4; public static final IntProperty CHECKERS; public static final BooleanProperty WATERLOGGED; protected static final VoxelShape ONE_CHECKER; protected static final VoxelShape TWO_CHECKER; protected static final VoxelShape THREE_CHECKER; protected static final VoxelShape FOUR_CHECKER; public CheckerBlock(AbstractBlock.Settings settings) { super(settings); this.setDefaultState((BlockState)((BlockState)((BlockState)this.stateManager.getDefaultState()).with(CHECKERS, 1)).with(WATERLOGGED, true)); } @Nullable public BlockState getPlacementState(ItemPlacementContext ctx) { BlockState blockState = ctx.getWorld().getBlockState(ctx.getBlockPos()); if (blockState.isOf(this)) { return (BlockState)blockState.with(CHECKERS, Math.min(4, (Integer)blockState.get(CHECKERS) + 1)); } else { FluidState fluidState = ctx.getWorld().getFluidState(ctx.getBlockPos()); boolean bl = fluidState.getFluid() == Fluids.WATER; return (BlockState)super.getPlacementState(ctx).with(WATERLOGGED, bl); } } protected boolean canPlantOnTop(BlockState floor, BlockView world, BlockPos pos) { return !floor.getCollisionShape(world, pos).getFace(Direction.UP).isEmpty() || floor.isSideSolidFullSquare(world, pos, Direction.UP); } public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { BlockPos blockPos = pos.down(); return this.canPlantOnTop(world.getBlockState(blockPos), world, blockPos); } public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { if (!state.canPlaceAt(world, pos)) { return Blocks.AIR.getDefaultState(); } else { if ((Boolean)state.get(WATERLOGGED)) { world.scheduleFluidTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); } return super.getStateForNeighborUpdate(state, direction, neighborState, world, pos, neighborPos); } } public boolean canReplace(BlockState state, ItemPlacementContext context) { return !context.shouldCancelInteraction() && context.getStack().isOf(this.asItem()) && (Integer) state.get(CHECKERS) < 4 || super.canReplace(state, context); } public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { switch ((Integer)state.get(CHECKERS)) { case 1: default: return ONE_CHECKER; case 2: return TWO_CHECKER; case 3: return THREE_CHECKER; case 4: return FOUR_CHECKER; } } public FluidState getFluidState(BlockState state) { return (Boolean)state.get(WATERLOGGED) ? Fluids.WATER.getStill(false) : super.getFluidState(state); } protected void appendProperties(StateManager.Builder builder) { builder.add(new Property[]{CHECKERS, WATERLOGGED}); } public boolean canPathfindThrough(BlockState state, BlockView world, BlockPos pos, NavigationType type) { return false; } static { CHECKERS = IntProperty.of("checkers", 1, 4);; WATERLOGGED = Properties.WATERLOGGED; ONE_CHECKER = Block.createCuboidShape(2.0, 0.0, 2.0, 14.0, 4.0, 14.0); TWO_CHECKER = Block.createCuboidShape(2.0, 0.0, 2.0, 14.0, 8.0, 14.0); THREE_CHECKER = Block.createCuboidShape(2.0, 0.0, 2.0, 14.0, 12.0, 14.0); FOUR_CHECKER = Block.createCuboidShape(2.0, 0.0, 2.0, 14.0, 16.0, 14.0); } }