108 lines
4.6 KiB
Java
108 lines
4.6 KiB
Java
|
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<Block, BlockState> 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);
|
||
|
}
|
||
|
}
|