content: package thebetweenlands.common.block.structure;
  
  import javax.annotation.Nullable;
  
  import net.minecraft.block.Block;
  import net.minecraft.block.BlockHorizontal;
  import net.minecraft.block.SoundType;
  import net.minecraft.block.material.Material;
  import net.minecraft.block.properties.IProperty;
  import net.minecraft.block.properties.PropertyBool;
  import net.minecraft.block.state.BlockFaceShape;
  import net.minecraft.block.state.BlockStateContainer;
  import net.minecraft.block.state.IBlockState;
  import net.minecraft.entity.EntityLivingBase;
  import net.minecraft.pathfinding.PathNodeType;
  import net.minecraft.util.EnumBlockRenderType;
  import net.minecraft.util.EnumFacing;
  import net.minecraft.util.EnumFacing.Axis;
  import net.minecraft.util.Mirror;
  import net.minecraft.util.Rotation;
  import net.minecraft.util.math.AxisAlignedBB;
  import net.minecraft.util.math.BlockPos;
  import net.minecraft.world.IBlockAccess;
  import net.minecraft.world.World;
  import thebetweenlands.client.tab.BLCreativeTabs;
  
  public class BlockWoodenSupportBeam extends BlockHorizontal {
  	private static final AxisAlignedBB[] SELECTION_AABB = new AxisAlignedBB[] {
  		new AxisAlignedBB(0.28D, 0, 0, 0.72D, 1, 1), //north/south
  		new AxisAlignedBB(0, 0, 0.28D, 1, 1, 0.72D)  //east/west
  	};
  	
  	public static final PropertyBool TOP = PropertyBool.create("top");
  
  	public BlockWoodenSupportBeam() {
  		this(Material.WOOD);
  	}
  
  	public BlockWoodenSupportBeam(Material material) {
  		super(material);
  		setHardness(2.0F);
  		setHarvestLevel("axe", 0);
  		setCreativeTab(BLCreativeTabs.PLANTS);
  		setDefaultState(blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH).withProperty(TOP, false));
  		setCreativeTab(BLCreativeTabs.BLOCKS);
  		setSoundType(SoundType.WOOD);
  	}
  
  	@Override
  	public boolean isWood(IBlockAccess world, BlockPos pos) {
  		return true;
  	}
  	
      @Override
  	@Nullable
  	public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, IBlockAccess worldIn, BlockPos pos) {
  		return NULL_AABB;
  	}
      
      @Override
      public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) {
      	EnumFacing facing = state.getValue(FACING);
      	return SELECTION_AABB[facing.getAxis() == Axis.Z ? 0 : 1];
      }
      
      // Entities should be able to path and walk through this otherwise it blocks the dungeon in some areas.
      @Override
      @Nullable
      public PathNodeType getAiPathNodeType(IBlockState state, IBlockAccess world, BlockPos pos) {
          return isBurning(world, pos) ? PathNodeType.DAMAGE_FIRE : PathNodeType.OPEN;
      }
  
      @Override
      public boolean isPassable(IBlockAccess world, BlockPos pos) {
          return true;
      }
  
      @Override
  	public boolean isOpaqueCube(IBlockState state) {
  		return false;
  	}
  
  	@Override
  	public boolean isFullBlock(IBlockState state) {
  		return false;
  	}
  
  	@Override
  	public boolean isFullCube(IBlockState state) {
  		return false;
  	}
  
  	@Override
  	public boolean isSideSolid(IBlockState base_state, IBlockAccess world, BlockPos pos, EnumFacing side) {
  		return false;
  	}
  	
  	@Override
  	public BlockFaceShape getBlockFaceShape(IBlockAccess worldIn, IBlockState state, BlockPos pos, EnumFacing face) {
  		return BlockFaceShape.UNDEFINED;
  	}
  	
  	@Override
  	public EnumBlockRenderType getRenderType(IBlockState state) {
  		return EnumBlockRenderType.MODEL;
  	}
  
  	@Override
  	 public IBlockState getStateForPlacement(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer) {
  		IBlockState state = getDefaultState().withProperty(FACING, facing);
  		if (this.canPlaceAt(world, pos, facing)) {
  			return facing != EnumFacing.DOWN && (facing == EnumFacing.UP || (double)hitY <= 0.5D) ? state.withProperty(TOP, false) : state.withProperty(TOP, true);
  		}
  		return this.getDefaultState();
  	}
  
  	@Override
  	public boolean canPlaceBlockOnSide(World worldIn, BlockPos pos, EnumFacing side) {
  		return worldIn.getBlockState(pos).getBlock().isReplaceable(worldIn, pos) && this.canPlaceAt(worldIn, pos, side);
  	}
  	
  	@Override
  	public boolean canPlaceBlockAt(World world, BlockPos pos) {
  		return false;
  	}
  
  	private boolean canPlaceAt(World world, BlockPos pos, EnumFacing facing) {
  		BlockPos blockpos = pos.offset(facing.getOpposite());
  		boolean isSide = facing.getAxis().isHorizontal();
  		return isSide && world.getBlockState(blockpos).isSideSolid(world, blockpos, facing);
  	}
  
  	@Override
  	public void neighborChanged(IBlockState state, World world, BlockPos pos, Block block, BlockPos fromPos) {
  		EnumFacing facing = world.getBlockState(pos).getValue(FACING);
      	if(!canPlaceAt((World) world, pos, facing)) {
              this.dropBlockAsItem((World) world, pos, world.getBlockState(pos), 0);
              ((World) world).setBlockToAir(pos);
          }
      }
  
  	@Override
  	public IBlockState getStateFromMeta(int meta) {
  		EnumFacing facing = EnumFacing.byHorizontalIndex(meta & 0b11);
  		if (facing.getAxis() == EnumFacing.Axis.Y)
  			facing = EnumFacing.NORTH;
  		return getDefaultState().withProperty(FACING, facing).withProperty(TOP, Boolean.valueOf((meta & 0b100) > 0));
  	}
  
  	@Override
  	public int getMetaFromState(IBlockState state) {
  		int meta = 0;
  		meta = meta | ((EnumFacing) state.getValue(FACING)).getHorizontalIndex();
  
  		if (((Boolean) state.getValue(TOP)).booleanValue())
  			meta |= 0b100;
  
  		return meta;
  	}
  
  	@Override
  	public IBlockState withRotation(IBlockState state, Rotation rot) {
  		return state.withProperty(FACING, rot.rotate((EnumFacing) state.getValue(FACING)));
  	}
  
  	@Override
  	public IBlockState withMirror(IBlockState state, Mirror mirrorIn) {
  		return state.withRotation(mirrorIn.toRotation((EnumFacing) state.getValue(FACING)));
  	}
  
  	@Override
  	protected BlockStateContainer createBlockState() {
  		return new BlockStateContainer(this, new IProperty[] { FACING, TOP });
  	}
  }
  