package net.minecraft.block;
import java.util.Iterator;
import java.util.Random;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyBool;
import net.minecraft.block.properties.PropertyEnum;
import net.minecraft.block.state.BlockState;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.util.BlockPos;
import net.minecraft.util.ChatComponentTranslation;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.IStringSerializable;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraft.world.biome.BiomeGenBase;
public class BlockBed extends BlockDirectional
{
public static final PropertyEnum PART_PROP = PropertyEnum.create("part", BlockBed.EnumPartType.class);
public static final PropertyBool OCCUPIED_PROP = PropertyBool.create("occupied");
private static final String __OBFID = "CL_00000198";
public BlockBed()
{
super(Material.cloth);
this.setDefaultState(this.blockState.getBaseState().withProperty(PART_PROP, BlockBed.EnumPartType.FOOT).withProperty(OCCUPIED_PROP, Boolean.valueOf(false)));
this.setBedBounds();
}
public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumFacing side, float hitX, float hitY, float hitZ)
{
if (worldIn.isRemote)
{
return true;
}
else
{
if (state.getValue(PART_PROP) != BlockBed.EnumPartType.HEAD)
{
pos = pos.offset((EnumFacing)state.getValue(AGE));
state = worldIn.getBlockState(pos);
if (state.getBlock() != this)
{
return true;
}
}
if (worldIn.provider.canRespawnHere() && worldIn.getBiomeGenForCoords(pos) != BiomeGenBase.hell)
{
if (((Boolean)state.getValue(OCCUPIED_PROP)).booleanValue())
{
EntityPlayer var10 = this.func_176470_e(worldIn, pos);
if (var10 != null)
{
playerIn.addChatComponentMessage(new ChatComponentTranslation("tile.bed.occupied", new Object[0]));
return true;
}
state = state.withProperty(OCCUPIED_PROP, Boolean.valueOf(false));
worldIn.setBlockState(pos, state, 4);
}
EntityPlayer.EnumStatus var11 = playerIn.func_180469_a(pos);
if (var11 == EntityPlayer.EnumStatus.OK)
{
state = state.withProperty(OCCUPIED_PROP, Boolean.valueOf(true));
worldIn.setBlockState(pos, state, 4);
return true;
}
else
{
if (var11 == EntityPlayer.EnumStatus.NOT_POSSIBLE_NOW)
{
playerIn.addChatComponentMessage(new ChatComponentTranslation("tile.bed.noSleep", new Object[0]));
}
else if (var11 == EntityPlayer.EnumStatus.NOT_SAFE)
{
playerIn.addChatComponentMessage(new ChatComponentTranslation("tile.bed.notSafe", new Object[0]));
}
return true;
}
}
else
{
worldIn.setBlockToAir(pos);
BlockPos var9 = pos.offset(((EnumFacing)state.getValue(AGE)).getOpposite());
if (worldIn.getBlockState(var9).getBlock() == this)
{
worldIn.setBlockToAir(var9);
}
worldIn.newExplosion((Entity)null, (double)pos.getX() + 0.5D, (double)pos.getY() + 0.5D, (double)pos.getZ() + 0.5D, 5.0F, true, true);
return true;
}
}
}
private EntityPlayer func_176470_e(World worldIn, BlockPos p_176470_2_)
{
Iterator var3 = worldIn.playerEntities.iterator();
EntityPlayer var4;
do
{
if (!var3.hasNext())
{
return null;
}
var4 = (EntityPlayer)var3.next();
}
while (!var4.isPlayerSleeping() || !var4.playerLocation.equals(p_176470_2_));
return var4;
}
public boolean isFullCube()
{
return false;
}
public boolean isOpaqueCube()
{
return false;
}
public void setBlockBoundsBasedOnState(IBlockAccess access, BlockPos pos)
{
this.setBedBounds();
}
public void onNeighborBlockChange(World worldIn, BlockPos pos, IBlockState state, Block neighborBlock)
{
EnumFacing var5 = (EnumFacing)state.getValue(AGE);
if (state.getValue(PART_PROP) == BlockBed.EnumPartType.HEAD)
{
if (worldIn.getBlockState(pos.offset(var5.getOpposite())).getBlock() != this)
{
worldIn.setBlockToAir(pos);
}
}
else if (worldIn.getBlockState(pos.offset(var5)).getBlock() != this)
{
worldIn.setBlockToAir(pos);
if (!worldIn.isRemote)
{
this.dropBlockAsItem(worldIn, pos, state, 0);
}
}
}
/**
* Get the Item that this Block should drop when harvested.
*
* @param fortune the level of the Fortune enchantment on the player's tool
*/
public Item getItemDropped(IBlockState state, Random rand, int fortune)
{
return state.getValue(PART_PROP) == BlockBed.EnumPartType.HEAD ? null : Items.bed;
}
private void setBedBounds()
{
this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5625F, 1.0F);
}
/**
* Returns a safe BlockPos to disembark the bed
*/
public static BlockPos getSafeExitLocation(World worldIn, BlockPos p_176468_1_, int p_176468_2_)
{
EnumFacing var3 = (EnumFacing)worldIn.getBlockState(p_176468_1_).getValue(AGE);
int var4 = p_176468_1_.getX();
int var5 = p_176468_1_.getY();
int var6 = p_176468_1_.getZ();
for (int var7 = 0; var7 <= 1; ++var7)
{
int var8 = var4 - var3.getFrontOffsetX() * var7 - 1;
int var9 = var6 - var3.getFrontOffsetZ() * var7 - 1;
int var10 = var8 + 2;
int var11 = var9 + 2;
for (int var12 = var8; var12 <= var10; ++var12)
{
for (int var13 = var9; var13 <= var11; ++var13)
{
BlockPos var14 = new BlockPos(var12, var5, var13);
if (func_176469_d(worldIn, var14))
{
if (p_176468_2_ <= 0)
{
return var14;
}
--p_176468_2_;
}
}
}
}
return null;
}
protected static boolean func_176469_d(World worldIn, BlockPos p_176469_1_)
{
return World.doesBlockHaveSolidTopSurface(worldIn, p_176469_1_.offsetDown()) && !worldIn.getBlockState(p_176469_1_).getBlock().getMaterial().isSolid() && !worldIn.getBlockState(p_176469_1_.offsetUp()).getBlock().getMaterial().isSolid();
}
/**
* Spawns this Block's drops into the World as EntityItems.
*
* @param chance The chance that each Item is actually spawned (1.0 = always, 0.0 = never)
* @param fortune The player's fortune level
*/
public void dropBlockAsItemWithChance(World worldIn, BlockPos pos, IBlockState state, float chance, int fortune)
{
if (state.getValue(PART_PROP) == BlockBed.EnumPartType.FOOT)
{
super.dropBlockAsItemWithChance(worldIn, pos, state, chance, 0);
}
}
public int getMobilityFlag()
{
return 1;
}
public void onBlockHarvested(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn)
{
if (playerIn.capabilities.isCreativeMode && state.getValue(PART_PROP) == BlockBed.EnumPartType.HEAD)
{
BlockPos var5 = pos.offset(((EnumFacing)state.getValue(AGE)).getOpposite());
if (worldIn.getBlockState(var5).getBlock() == this)
{
worldIn.setBlockToAir(var5);
}
}
}
/**
* Convert the given metadata into a BlockState for this Block
*/
public IBlockState getStateFromMeta(int meta)
{
EnumFacing var2 = EnumFacing.getHorizontal(meta);
return (meta & 8) > 0 ? this.getDefaultState().withProperty(PART_PROP, BlockBed.EnumPartType.HEAD).withProperty(AGE, var2).withProperty(OCCUPIED_PROP, Boolean.valueOf((meta & 4) > 0)) : this.getDefaultState().withProperty(PART_PROP, BlockBed.EnumPartType.FOOT).withProperty(AGE, var2);
}
/**
* Get the actual Block state of this Block at the given position. This applies properties not visible in the
* metadata, such as fence connections.
*/
public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos)
{
if (state.getValue(PART_PROP) == BlockBed.EnumPartType.FOOT)
{
IBlockState var4 = worldIn.getBlockState(pos.offset((EnumFacing)state.getValue(AGE)));
if (var4.getBlock() == this)
{
state = state.withProperty(OCCUPIED_PROP, var4.getValue(OCCUPIED_PROP));
}
}
return state;
}
/**
* Convert the BlockState into the correct metadata value
*/
public int getMetaFromState(IBlockState state)
{
byte var2 = 0;
int var3 = var2 | ((EnumFacing)state.getValue(AGE)).getHorizontalIndex();
if (state.getValue(PART_PROP) == BlockBed.EnumPartType.HEAD)
{
var3 |= 8;
if (((Boolean)state.getValue(OCCUPIED_PROP)).booleanValue())
{
var3 |= 4;
}
}
return var3;
}
protected BlockState createBlockState()
{
return new BlockState(this, new IProperty[] {AGE, PART_PROP, OCCUPIED_PROP});
}
public static enum EnumPartType implements IStringSerializable
{
HEAD("HEAD", 0, "head"),
FOOT("FOOT", 1, "foot");
private final String field_177036_c;
private static final BlockBed.EnumPartType[] $VALUES = new BlockBed.EnumPartType[]{HEAD, FOOT};
private static final String __OBFID = "CL_00002134";
private EnumPartType(String p_i45735_1_, int p_i45735_2_, String p_i45735_3_)
{
this.field_177036_c = p_i45735_3_;
}
public String toString()
{
return this.field_177036_c;
}
public String getName()
{
return this.field_177036_c;
}
}
}