186 lines
9.2 KiB
Java
186 lines
9.2 KiB
Java
package net.minecraft.world.level.block;
|
|
|
|
import net.minecraft.world.level.block.state.AbstractStateHolder;
|
|
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
|
|
import net.minecraft.world.entity.EntityType;
|
|
import net.minecraft.world.level.LevelAccessor;
|
|
import net.minecraft.world.level.block.state.StateDefinition;
|
|
import net.minecraft.world.level.material.FluidState;
|
|
import net.minecraft.world.item.BlockPlaceContext;
|
|
import javax.annotation.Nullable;
|
|
import net.minecraft.world.level.LevelReader;
|
|
import net.minecraft.world.level.material.Fluids;
|
|
import net.minecraft.world.level.material.Material;
|
|
import net.minecraft.world.InteractionResult;
|
|
import net.minecraft.world.phys.BlockHitResult;
|
|
import net.minecraft.world.InteractionHand;
|
|
import net.minecraft.world.entity.player.Player;
|
|
import net.minecraft.world.level.Level;
|
|
import net.minecraft.world.level.pathfinder.PathComputationType;
|
|
import net.minecraft.world.phys.shapes.CollisionContext;
|
|
import net.minecraft.core.BlockPos;
|
|
import net.minecraft.world.level.BlockGetter;
|
|
import net.minecraft.world.level.block.state.properties.Property;
|
|
import net.minecraft.core.Direction;
|
|
import net.minecraft.world.level.block.state.BlockState;
|
|
import net.minecraft.world.phys.shapes.VoxelShape;
|
|
import net.minecraft.world.level.block.state.properties.Half;
|
|
import net.minecraft.world.level.block.state.properties.EnumProperty;
|
|
import net.minecraft.world.level.block.state.properties.BooleanProperty;
|
|
|
|
public class TrapDoorBlock extends HorizontalDirectionalBlock implements SimpleWaterloggedBlock {
|
|
public static final BooleanProperty OPEN;
|
|
public static final EnumProperty<Half> HALF;
|
|
public static final BooleanProperty POWERED;
|
|
public static final BooleanProperty WATERLOGGED;
|
|
protected static final VoxelShape EAST_OPEN_AABB;
|
|
protected static final VoxelShape WEST_OPEN_AABB;
|
|
protected static final VoxelShape SOUTH_OPEN_AABB;
|
|
protected static final VoxelShape NORTH_OPEN_AABB;
|
|
protected static final VoxelShape BOTTOM_AABB;
|
|
protected static final VoxelShape TOP_AABB;
|
|
|
|
protected TrapDoorBlock(final Properties c) {
|
|
super(c);
|
|
this.registerDefaultState(((((((AbstractStateHolder<O, BlockState>)this.stateDefinition.any()).setValue((Property<Comparable>)TrapDoorBlock.FACING, Direction.NORTH)).setValue((Property<Comparable>)TrapDoorBlock.OPEN, false)).setValue(TrapDoorBlock.HALF, Half.BOTTOM)).setValue((Property<Comparable>)TrapDoorBlock.POWERED, false)).<Comparable, Boolean>setValue((Property<Comparable>)TrapDoorBlock.WATERLOGGED, false));
|
|
}
|
|
|
|
@Override
|
|
public VoxelShape getShape(final BlockState byg, final BlockGetter bjd, final BlockPos fk, final CollisionContext cvn) {
|
|
if (!byg.<Boolean>getValue((Property<Boolean>)TrapDoorBlock.OPEN)) {
|
|
return (byg.<Half>getValue(TrapDoorBlock.HALF) == Half.TOP) ? TrapDoorBlock.TOP_AABB : TrapDoorBlock.BOTTOM_AABB;
|
|
}
|
|
switch (byg.<Direction>getValue((Property<Direction>)TrapDoorBlock.FACING)) {
|
|
default: {
|
|
return TrapDoorBlock.NORTH_OPEN_AABB;
|
|
}
|
|
case SOUTH: {
|
|
return TrapDoorBlock.SOUTH_OPEN_AABB;
|
|
}
|
|
case WEST: {
|
|
return TrapDoorBlock.WEST_OPEN_AABB;
|
|
}
|
|
case EAST: {
|
|
return TrapDoorBlock.EAST_OPEN_AABB;
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean isPathfindable(final BlockState byg, final BlockGetter bjd, final BlockPos fk, final PathComputationType cqo) {
|
|
switch (cqo) {
|
|
case LAND: {
|
|
return byg.<Boolean>getValue((Property<Boolean>)TrapDoorBlock.OPEN);
|
|
}
|
|
case WATER: {
|
|
return byg.<Boolean>getValue((Property<Boolean>)TrapDoorBlock.WATERLOGGED);
|
|
}
|
|
case AIR: {
|
|
return byg.<Boolean>getValue((Property<Boolean>)TrapDoorBlock.OPEN);
|
|
}
|
|
default: {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public InteractionResult use(BlockState byg, final Level bjt, final BlockPos fk, final Player ayg, final InteractionHand ajh, final BlockHitResult cvd) {
|
|
if (this.material == Material.METAL) {
|
|
return InteractionResult.PASS;
|
|
}
|
|
byg = ((AbstractStateHolder<O, BlockState>)byg).<Comparable>cycle((Property<Comparable>)TrapDoorBlock.OPEN);
|
|
bjt.setBlock(fk, byg, 2);
|
|
if (byg.<Boolean>getValue((Property<Boolean>)TrapDoorBlock.WATERLOGGED)) {
|
|
bjt.getLiquidTicks().scheduleTick(fk, Fluids.WATER, Fluids.WATER.getTickDelay(bjt));
|
|
}
|
|
this.playSound(ayg, bjt, fk, byg.<Boolean>getValue((Property<Boolean>)TrapDoorBlock.OPEN));
|
|
return InteractionResult.SUCCESS;
|
|
}
|
|
|
|
protected void playSound(@Nullable final Player ayg, final Level bjt, final BlockPos fk, final boolean boolean4) {
|
|
if (boolean4) {
|
|
final int integer6 = (this.material == Material.METAL) ? 1037 : 1007;
|
|
bjt.levelEvent(ayg, integer6, fk, 0);
|
|
}
|
|
else {
|
|
final int integer6 = (this.material == Material.METAL) ? 1036 : 1013;
|
|
bjt.levelEvent(ayg, integer6, fk, 0);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void neighborChanged(BlockState byg, final Level bjt, final BlockPos fk3, final Block bpe, final BlockPos fk5, final boolean boolean6) {
|
|
if (bjt.isClientSide) {
|
|
return;
|
|
}
|
|
final boolean boolean7 = bjt.hasNeighborSignal(fk3);
|
|
if (boolean7 != byg.<Boolean>getValue((Property<Boolean>)TrapDoorBlock.POWERED)) {
|
|
if (byg.<Boolean>getValue((Property<Boolean>)TrapDoorBlock.OPEN) != boolean7) {
|
|
byg = ((AbstractStateHolder<O, BlockState>)byg).<Comparable, Boolean>setValue((Property<Comparable>)TrapDoorBlock.OPEN, boolean7);
|
|
this.playSound(null, bjt, fk3, boolean7);
|
|
}
|
|
bjt.setBlock(fk3, ((AbstractStateHolder<O, BlockState>)byg).<Comparable, Boolean>setValue((Property<Comparable>)TrapDoorBlock.POWERED, boolean7), 2);
|
|
if (byg.<Boolean>getValue((Property<Boolean>)TrapDoorBlock.WATERLOGGED)) {
|
|
bjt.getLiquidTicks().scheduleTick(fk3, Fluids.WATER, Fluids.WATER.getTickDelay(bjt));
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public BlockState getStateForPlacement(final BlockPlaceContext bcn) {
|
|
BlockState byg3 = this.defaultBlockState();
|
|
final FluidState cog4 = bcn.getLevel().getFluidState(bcn.getClickedPos());
|
|
final Direction fp5 = bcn.getClickedFace();
|
|
if (bcn.replacingClickedOnBlock() || !fp5.getAxis().isHorizontal()) {
|
|
byg3 = (((AbstractStateHolder<O, BlockState>)byg3).setValue((Property<Comparable>)TrapDoorBlock.FACING, bcn.getHorizontalDirection().getOpposite())).<Half, Half>setValue(TrapDoorBlock.HALF, (fp5 == Direction.UP) ? Half.BOTTOM : Half.TOP);
|
|
}
|
|
else {
|
|
byg3 = (((AbstractStateHolder<O, BlockState>)byg3).setValue((Property<Comparable>)TrapDoorBlock.FACING, fp5)).<Half, Half>setValue(TrapDoorBlock.HALF, (bcn.getClickLocation().y - bcn.getClickedPos().getY() > 0.5) ? Half.TOP : Half.BOTTOM);
|
|
}
|
|
if (bcn.getLevel().hasNeighborSignal(bcn.getClickedPos())) {
|
|
byg3 = (((AbstractStateHolder<O, BlockState>)byg3).setValue((Property<Comparable>)TrapDoorBlock.OPEN, true)).<Comparable, Boolean>setValue((Property<Comparable>)TrapDoorBlock.POWERED, true);
|
|
}
|
|
return ((AbstractStateHolder<O, BlockState>)byg3).<Comparable, Boolean>setValue((Property<Comparable>)TrapDoorBlock.WATERLOGGED, cog4.getType() == Fluids.WATER);
|
|
}
|
|
|
|
@Override
|
|
protected void createBlockStateDefinition(final StateDefinition.Builder<Block, BlockState> a) {
|
|
a.add(TrapDoorBlock.FACING, TrapDoorBlock.OPEN, TrapDoorBlock.HALF, TrapDoorBlock.POWERED, TrapDoorBlock.WATERLOGGED);
|
|
}
|
|
|
|
@Override
|
|
public FluidState getFluidState(final BlockState byg) {
|
|
if (byg.<Boolean>getValue((Property<Boolean>)TrapDoorBlock.WATERLOGGED)) {
|
|
return Fluids.WATER.getSource(false);
|
|
}
|
|
return super.getFluidState(byg);
|
|
}
|
|
|
|
@Override
|
|
public BlockState updateShape(final BlockState byg1, final Direction fp, final BlockState byg3, final LevelAccessor bju, final BlockPos fk5, final BlockPos fk6) {
|
|
if (byg1.<Boolean>getValue((Property<Boolean>)TrapDoorBlock.WATERLOGGED)) {
|
|
bju.getLiquidTicks().scheduleTick(fk5, Fluids.WATER, Fluids.WATER.getTickDelay(bju));
|
|
}
|
|
return super.updateShape(byg1, fp, byg3, bju, fk5, fk6);
|
|
}
|
|
|
|
@Override
|
|
public boolean isValidSpawn(final BlockState byg, final BlockGetter bjd, final BlockPos fk, final EntityType<?> akr) {
|
|
return false;
|
|
}
|
|
|
|
static {
|
|
OPEN = BlockStateProperties.OPEN;
|
|
HALF = BlockStateProperties.HALF;
|
|
POWERED = BlockStateProperties.POWERED;
|
|
WATERLOGGED = BlockStateProperties.WATERLOGGED;
|
|
EAST_OPEN_AABB = Block.box(0.0, 0.0, 0.0, 3.0, 16.0, 16.0);
|
|
WEST_OPEN_AABB = Block.box(13.0, 0.0, 0.0, 16.0, 16.0, 16.0);
|
|
SOUTH_OPEN_AABB = Block.box(0.0, 0.0, 0.0, 16.0, 16.0, 3.0);
|
|
NORTH_OPEN_AABB = Block.box(0.0, 0.0, 13.0, 16.0, 16.0, 16.0);
|
|
BOTTOM_AABB = Block.box(0.0, 0.0, 0.0, 16.0, 3.0, 16.0);
|
|
TOP_AABB = Block.box(0.0, 13.0, 0.0, 16.0, 16.0, 16.0);
|
|
}
|
|
}
|