package net.minecraft.block; 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.PropertyDirection; import net.minecraft.block.properties.PropertyEnum; import net.minecraft.block.state.BlockState; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.BlockPos; import net.minecraft.util.EnumFacing; import net.minecraft.util.IStringSerializable; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; public class BlockDoor extends Block { public static final PropertyDirection FACING_PROP = PropertyDirection.create("facing", EnumFacing.Plane.HORIZONTAL); public static final PropertyBool OPEN_PROP = PropertyBool.create("open"); public static final PropertyEnum HINGEPOSITION_PROP = PropertyEnum.create("hinge", BlockDoor.EnumHingePosition.class); public static final PropertyBool POWERED_PROP = PropertyBool.create("powered"); public static final PropertyEnum HALF_PROP = PropertyEnum.create("half", BlockDoor.EnumDoorHalf.class); private static final String __OBFID = "CL_00000230"; protected BlockDoor(Material p_i45402_1_) { super(p_i45402_1_); this.setDefaultState(this.blockState.getBaseState().withProperty(FACING_PROP, EnumFacing.NORTH).withProperty(OPEN_PROP, Boolean.valueOf(false)).withProperty(HINGEPOSITION_PROP, BlockDoor.EnumHingePosition.LEFT).withProperty(POWERED_PROP, Boolean.valueOf(false)).withProperty(HALF_PROP, BlockDoor.EnumDoorHalf.LOWER)); } public boolean isOpaqueCube() { return false; } public boolean isPassable(IBlockAccess blockAccess, BlockPos pos) { return func_176516_g(func_176515_e(blockAccess, pos)); } public boolean isFullCube() { return false; } public AxisAlignedBB getCollisionBoundingBox(World worldIn, BlockPos pos, IBlockState state) { this.setBlockBoundsBasedOnState(worldIn, pos); return super.getCollisionBoundingBox(worldIn, pos, state); } public void setBlockBoundsBasedOnState(IBlockAccess access, BlockPos pos) { this.func_150011_b(func_176515_e(access, pos)); } private void func_150011_b(int p_150011_1_) { float var2 = 0.1875F; this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 2.0F, 1.0F); EnumFacing var3 = func_176511_f(p_150011_1_); boolean var4 = func_176516_g(p_150011_1_); boolean var5 = func_176513_j(p_150011_1_); if (var4) { if (var3 == EnumFacing.EAST) { if (!var5) { this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, var2); } else { this.setBlockBounds(0.0F, 0.0F, 1.0F - var2, 1.0F, 1.0F, 1.0F); } } else if (var3 == EnumFacing.SOUTH) { if (!var5) { this.setBlockBounds(1.0F - var2, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); } else { this.setBlockBounds(0.0F, 0.0F, 0.0F, var2, 1.0F, 1.0F); } } else if (var3 == EnumFacing.WEST) { if (!var5) { this.setBlockBounds(0.0F, 0.0F, 1.0F - var2, 1.0F, 1.0F, 1.0F); } else { this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, var2); } } else if (var3 == EnumFacing.NORTH) { if (!var5) { this.setBlockBounds(0.0F, 0.0F, 0.0F, var2, 1.0F, 1.0F); } else { this.setBlockBounds(1.0F - var2, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); } } } else if (var3 == EnumFacing.EAST) { this.setBlockBounds(0.0F, 0.0F, 0.0F, var2, 1.0F, 1.0F); } else if (var3 == EnumFacing.SOUTH) { this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, var2); } else if (var3 == EnumFacing.WEST) { this.setBlockBounds(1.0F - var2, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); } else if (var3 == EnumFacing.NORTH) { this.setBlockBounds(0.0F, 0.0F, 1.0F - var2, 1.0F, 1.0F, 1.0F); } } public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumFacing side, float hitX, float hitY, float hitZ) { if (this.blockMaterial == Material.iron) { return true; } else { BlockPos var9 = state.getValue(HALF_PROP) == BlockDoor.EnumDoorHalf.LOWER ? pos : pos.offsetDown(); IBlockState var10 = pos.equals(var9) ? state : worldIn.getBlockState(var9); if (var10.getBlock() != this) { return false; } else { state = var10.cycleProperty(OPEN_PROP); worldIn.setBlockState(var9, state, 2); worldIn.markBlockRangeForRenderUpdate(var9, pos); worldIn.playAuxSFXAtEntity(playerIn, ((Boolean)state.getValue(OPEN_PROP)).booleanValue() ? 1003 : 1006, pos, 0); return true; } } } public void func_176512_a(World worldIn, BlockPos p_176512_2_, boolean p_176512_3_) { IBlockState var4 = worldIn.getBlockState(p_176512_2_); if (var4.getBlock() == this) { BlockPos var5 = var4.getValue(HALF_PROP) == BlockDoor.EnumDoorHalf.LOWER ? p_176512_2_ : p_176512_2_.offsetDown(); IBlockState var6 = p_176512_2_ == var5 ? var4 : worldIn.getBlockState(var5); if (var6.getBlock() == this && ((Boolean)var6.getValue(OPEN_PROP)).booleanValue() != p_176512_3_) { worldIn.setBlockState(var5, var6.withProperty(OPEN_PROP, Boolean.valueOf(p_176512_3_)), 2); worldIn.markBlockRangeForRenderUpdate(var5, p_176512_2_); worldIn.playAuxSFXAtEntity((EntityPlayer)null, p_176512_3_ ? 1003 : 1006, p_176512_2_, 0); } } } public void onNeighborBlockChange(World worldIn, BlockPos pos, IBlockState state, Block neighborBlock) { if (state.getValue(HALF_PROP) == BlockDoor.EnumDoorHalf.UPPER) { BlockPos var5 = pos.offsetDown(); IBlockState var6 = worldIn.getBlockState(var5); if (var6.getBlock() != this) { worldIn.setBlockToAir(pos); } else if (neighborBlock != this) { this.onNeighborBlockChange(worldIn, var5, var6, neighborBlock); } } else { boolean var9 = false; BlockPos var10 = pos.offsetUp(); IBlockState var7 = worldIn.getBlockState(var10); if (var7.getBlock() != this) { worldIn.setBlockToAir(pos); var9 = true; } if (!World.doesBlockHaveSolidTopSurface(worldIn, pos.offsetDown())) { worldIn.setBlockToAir(pos); var9 = true; if (var7.getBlock() == this) { worldIn.setBlockToAir(var10); } } if (var9) { if (!worldIn.isRemote) { this.dropBlockAsItem(worldIn, pos, state, 0); } } else { boolean var8 = worldIn.isBlockPowered(pos) || worldIn.isBlockPowered(var10); if ((var8 || neighborBlock.canProvidePower()) && neighborBlock != this && var8 != ((Boolean)var7.getValue(POWERED_PROP)).booleanValue()) { worldIn.setBlockState(var10, var7.withProperty(POWERED_PROP, Boolean.valueOf(var8)), 2); if (var8 != ((Boolean)state.getValue(OPEN_PROP)).booleanValue()) { worldIn.setBlockState(pos, state.withProperty(OPEN_PROP, Boolean.valueOf(var8)), 2); worldIn.markBlockRangeForRenderUpdate(pos, pos); worldIn.playAuxSFXAtEntity((EntityPlayer)null, var8 ? 1003 : 1006, pos, 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(HALF_PROP) == BlockDoor.EnumDoorHalf.UPPER ? null : this.func_176509_j(); } /** * Ray traces through the blocks collision from start vector to end vector returning a ray trace hit. * * @param start The start vector * @param end The end vector */ public MovingObjectPosition collisionRayTrace(World worldIn, BlockPos pos, Vec3 start, Vec3 end) { this.setBlockBoundsBasedOnState(worldIn, pos); return super.collisionRayTrace(worldIn, pos, start, end); } public boolean canPlaceBlockAt(World worldIn, BlockPos pos) { return pos.getY() >= 255 ? false : World.doesBlockHaveSolidTopSurface(worldIn, pos.offsetDown()) && super.canPlaceBlockAt(worldIn, pos) && super.canPlaceBlockAt(worldIn, pos.offsetUp()); } public int getMobilityFlag() { return 1; } public static int func_176515_e(IBlockAccess p_176515_0_, BlockPos p_176515_1_) { IBlockState var2 = p_176515_0_.getBlockState(p_176515_1_); int var3 = var2.getBlock().getMetaFromState(var2); boolean var4 = func_176518_i(var3); IBlockState var5 = p_176515_0_.getBlockState(p_176515_1_.offsetDown()); int var6 = var5.getBlock().getMetaFromState(var5); int var7 = var4 ? var6 : var3; IBlockState var8 = p_176515_0_.getBlockState(p_176515_1_.offsetUp()); int var9 = var8.getBlock().getMetaFromState(var8); int var10 = var4 ? var3 : var9; boolean var11 = (var10 & 1) != 0; boolean var12 = (var10 & 2) != 0; return func_176510_b(var7) | (var4 ? 8 : 0) | (var11 ? 16 : 0) | (var12 ? 32 : 0); } private Item func_176509_j() { return this == Blocks.iron_door ? Items.iron_door : (this == Blocks.spruce_door ? Items.spruce_door : (this == Blocks.birch_door ? Items.birch_door : (this == Blocks.jungle_door ? Items.jungle_door : (this == Blocks.acacia_door ? Items.acacia_door : (this == Blocks.dark_oak_door ? Items.dark_oak_door : Items.oak_door))))); } public void onBlockHarvested(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn) { BlockPos var5 = pos.offsetDown(); if (playerIn.capabilities.isCreativeMode && state.getValue(HALF_PROP) == BlockDoor.EnumDoorHalf.UPPER && worldIn.getBlockState(var5).getBlock() == this) { worldIn.setBlockToAir(var5); } } /** * 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) { IBlockState var4; if (state.getValue(HALF_PROP) == BlockDoor.EnumDoorHalf.LOWER) { var4 = worldIn.getBlockState(pos.offsetUp()); if (var4.getBlock() == this) { state = state.withProperty(HINGEPOSITION_PROP, var4.getValue(HINGEPOSITION_PROP)).withProperty(POWERED_PROP, var4.getValue(POWERED_PROP)); } } else { var4 = worldIn.getBlockState(pos.offsetDown()); if (var4.getBlock() == this) { state = state.withProperty(FACING_PROP, var4.getValue(FACING_PROP)).withProperty(OPEN_PROP, var4.getValue(OPEN_PROP)); } } return state; } /** * Convert the given metadata into a BlockState for this Block */ public IBlockState getStateFromMeta(int meta) { return (meta & 8) > 0 ? this.getDefaultState().withProperty(HALF_PROP, BlockDoor.EnumDoorHalf.UPPER).withProperty(HINGEPOSITION_PROP, (meta & 1) > 0 ? BlockDoor.EnumHingePosition.RIGHT : BlockDoor.EnumHingePosition.LEFT).withProperty(POWERED_PROP, Boolean.valueOf((meta & 2) > 0)) : this.getDefaultState().withProperty(HALF_PROP, BlockDoor.EnumDoorHalf.LOWER).withProperty(FACING_PROP, EnumFacing.getHorizontal(meta & 3).rotateYCCW()).withProperty(OPEN_PROP, Boolean.valueOf((meta & 4) > 0)); } /** * Convert the BlockState into the correct metadata value */ public int getMetaFromState(IBlockState state) { byte var2 = 0; int var3; if (state.getValue(HALF_PROP) == BlockDoor.EnumDoorHalf.UPPER) { var3 = var2 | 8; if (state.getValue(HINGEPOSITION_PROP) == BlockDoor.EnumHingePosition.RIGHT) { var3 |= 1; } if (((Boolean)state.getValue(POWERED_PROP)).booleanValue()) { var3 |= 2; } } else { var3 = var2 | ((EnumFacing)state.getValue(FACING_PROP)).rotateY().getHorizontalIndex(); if (((Boolean)state.getValue(OPEN_PROP)).booleanValue()) { var3 |= 4; } } return var3; } protected static int func_176510_b(int p_176510_0_) { return p_176510_0_ & 7; } public static boolean func_176514_f(IBlockAccess p_176514_0_, BlockPos p_176514_1_) { return func_176516_g(func_176515_e(p_176514_0_, p_176514_1_)); } public static EnumFacing func_176517_h(IBlockAccess p_176517_0_, BlockPos p_176517_1_) { return func_176511_f(func_176515_e(p_176517_0_, p_176517_1_)); } public static EnumFacing func_176511_f(int p_176511_0_) { return EnumFacing.getHorizontal(p_176511_0_ & 3).rotateYCCW(); } protected static boolean func_176516_g(int p_176516_0_) { return (p_176516_0_ & 4) != 0; } protected static boolean func_176518_i(int p_176518_0_) { return (p_176518_0_ & 8) != 0; } protected static boolean func_176513_j(int p_176513_0_) { return (p_176513_0_ & 16) != 0; } protected BlockState createBlockState() { return new BlockState(this, new IProperty[] {HALF_PROP, FACING_PROP, OPEN_PROP, HINGEPOSITION_PROP, POWERED_PROP}); } public static enum EnumDoorHalf implements IStringSerializable { UPPER("UPPER", 0), LOWER("LOWER", 1); private static final BlockDoor.EnumDoorHalf[] $VALUES = new BlockDoor.EnumDoorHalf[]{UPPER, LOWER}; private static final String __OBFID = "CL_00002124"; private EnumDoorHalf(String p_i45726_1_, int p_i45726_2_) {} public String toString() { return this.getName(); } public String getName() { return this == UPPER ? "upper" : "lower"; } } public static enum EnumHingePosition implements IStringSerializable { LEFT("LEFT", 0), RIGHT("RIGHT", 1); private static final BlockDoor.EnumHingePosition[] $VALUES = new BlockDoor.EnumHingePosition[]{LEFT, RIGHT}; private static final String __OBFID = "CL_00002123"; private EnumHingePosition(String p_i45725_1_, int p_i45725_2_) {} public String toString() { return this.getName(); } public String getName() { return this == LEFT ? "left" : "right"; } } }