    001    package net.minecraft.block;
    002
    003    import cpw.mods.fml.common.Side;
    004    import cpw.mods.fml.common.asm.SideOnly;
    005    import java.util.List;
    006    import java.util.Random;
    007    import net.minecraft.block.material.Material;
    008    import net.minecraft.entity.Entity;
    009    import net.minecraft.util.AxisAlignedBB;
    010    import net.minecraft.util.Facing;
    011    import net.minecraft.world.IBlockAccess;
    012    import net.minecraft.world.World;
    013
    014    public abstract class BlockHalfSlab extends Block
    015    {
    016        private final boolean isDoubleSlab;
    017
    018        public BlockHalfSlab(int par1, boolean par2, Material par3Material)
    019        {
    020            super(par1, 6, par3Material);
    021            this.isDoubleSlab = par2;
    022
    023            if (par2)
    024            {
    025                opaqueCubeLookup[par1] = true;
    026            }
    027            else
    028            {
    029                this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F);
    030            }
    031
    032            this.setLightOpacity(255);
    033        }
    034
    035        /**
    036         * Updates the blocks bounds based on its current state. Args: world, x, y, z
    037         */
    038        public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)
    039        {
    040            if (this.isDoubleSlab)
    041            {
    042                this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
    043            }
    044            else
    045            {
    046                boolean var5 = (par1IBlockAccess.getBlockMetadata(par2, par3, par4) & 8) != 0;
    047
    048                if (var5)
    049                {
    050                    this.setBlockBounds(0.0F, 0.5F, 0.0F, 1.0F, 1.0F, 1.0F);
    051                }
    052                else
    053                {
    054                    this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F);
    055                }
    056            }
    057        }
    058
    059        /**
    060         * Sets the block's bounds for rendering it as an item
    061         */
    062        public void setBlockBoundsForItemRender()
    063        {
    064            if (this.isDoubleSlab)
    065            {
    066                this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
    067            }
    068            else
    069            {
    070                this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F);
    071            }
    072        }
    073
    074        /**
    075         * if the specified block is in the given AABB, add its collision bounding box to the given list
    076         */
    077        public void addCollidingBlockToList(World par1World, int par2, int par3, int par4, AxisAlignedBB par5AxisAlignedBB, List par6List, Entity par7Entity)
    078        {
    079            this.setBlockBoundsBasedOnState(par1World, par2, par3, par4);
    080            super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity);
    081        }
    082
    083        /**
    084         * Returns the block texture based on the side being looked at.  Args: side
    085         */
    086        public int getBlockTextureFromSide(int par1)
    087        {
    088            return this.getBlockTextureFromSideAndMetadata(par1, 0);
    089        }
    090
    091        /**
    092         * Is this block (a) opaque and (b) a full 1m cube?  This determines whether or not to render the shared face of two
    093         * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block.
    094         */
    095        public boolean isOpaqueCube()
    096        {
    097            return this.isDoubleSlab;
    098        }
    099
    100        public int func_85104_a(World par1World, int par2, int par3, int par4, int par5, float par6, float par7, float par8, int par9)
    101        {
    102            return this.isDoubleSlab ? 0 : (par5 != 0 && (par5 == 1 || (double)par7 <= 0.5D) ? par9 : par9 | 8);
    103        }
    104
    105        /**
    106         * Returns the quantity of items to drop on block destruction.
    107         */
    108        public int quantityDropped(Random par1Random)
    109        {
    110            return this.isDoubleSlab ? 2 : 1;
    111        }
    112
    113        /**
    114         * Determines the damage on the item the block drops. Used in cloth and wood.
    115         */
    116        public int damageDropped(int par1)
    117        {
    118            return par1 & 7;
    119        }
    120
    121        /**
    122         * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
    123         */
    124        public boolean renderAsNormalBlock()
    125        {
    126            return this.isDoubleSlab;
    127        }
    128
    129        @SideOnly(Side.CLIENT)
    130
    131        /**
    132         * Returns true if the given side of this block type should be rendered, if the adjacent block is at the given
    133         * coordinates.  Args: blockAccess, x, y, z, side
    134         */
    135        public boolean shouldSideBeRendered(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5)
    136        {
    137            if (this.isDoubleSlab)
    138            {
    139                return super.shouldSideBeRendered(par1IBlockAccess, par2, par3, par4, par5);
    140            }
    141            else if (par5 != 1 && par5 != 0 && !super.shouldSideBeRendered(par1IBlockAccess, par2, par3, par4, par5))
    142            {
    143                return false;
    144            }
    145            else
    146            {
    147                int var6 = par2 + Facing.offsetsXForSide[Facing.faceToSide[par5]];
    148                int var7 = par3 + Facing.offsetsYForSide[Facing.faceToSide[par5]];
    149                int var8 = par4 + Facing.offsetsZForSide[Facing.faceToSide[par5]];
    150                boolean var9 = (par1IBlockAccess.getBlockMetadata(var6, var7, var8) & 8) != 0;
    151                return var9 ? (par5 == 0 ? true : (par5 == 1 && super.shouldSideBeRendered(par1IBlockAccess, par2, par3, par4, par5) ? true : !isBlockSingleSlab(par1IBlockAccess.getBlockId(par2, par3, par4)) || (par1IBlockAccess.getBlockMetadata(par2, par3, par4) & 8) == 0)) : (par5 == 1 ? true : (par5 == 0 && super.shouldSideBeRendered(par1IBlockAccess, par2, par3, par4, par5) ? true : !isBlockSingleSlab(par1IBlockAccess.getBlockId(par2, par3, par4)) || (par1IBlockAccess.getBlockMetadata(par2, par3, par4) & 8) != 0));
    152            }
    153        }
    154
    155        @SideOnly(Side.CLIENT)
    156
    157        /**
    158         * Takes a block ID, returns true if it's the same as the ID for a stone or wooden single slab.
    159         */
    160        private static boolean isBlockSingleSlab(int par0)
    161        {
    162            return par0 == Block.stoneSingleSlab.blockID || par0 == Block.woodSingleSlab.blockID;
    163        }
    164
    165        /**
    166         * Returns the slab block name with step type.
    167         */
    168        public abstract String getFullSlabName(int var1);
    169    }