minecraft-source/src/net/minecraft/world/level/block/TrapDoorBlock.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);
}
}