    001    package net.minecraft.src;
    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
    008    public class BlockPane extends Block
    009    {
    010        /**
    011         * Holds the texture index of the side of the pane (the thin lateral side)
    012         */
    013        private int sideTextureIndex;
    014
    015        /**
    016         * If this field is true, the pane block drops itself when destroyed (like the iron fences), otherwise, it's just
    017         * destroyed (like glass panes)
    018         */
    019        private final boolean canDropItself;
    020
    021        protected BlockPane(int par1, int par2, int par3, Material par4Material, boolean par5)
    022        {
    023            super(par1, par2, par4Material);
    024            this.sideTextureIndex = par3;
    025            this.canDropItself = par5;
    026            this.setCreativeTab(CreativeTabs.tabDecorations);
    027        }
    028
    029        /**
    030         * Returns the ID of the items to drop on destruction.
    031         */
    032        public int idDropped(int par1, Random par2Random, int par3)
    033        {
    034            return !this.canDropItself ? 0 : super.idDropped(par1, par2Random, par3);
    035        }
    036
    037        /**
    038         * Is this block (a) opaque and (b) a full 1m cube?  This determines whether or not to render the shared face of two
    039         * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block.
    040         */
    041        public boolean isOpaqueCube()
    042        {
    043            return false;
    044        }
    045
    046        /**
    047         * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
    048         */
    049        public boolean renderAsNormalBlock()
    050        {
    051            return false;
    052        }
    053
    054        /**
    055         * The type of render function that is called for this block
    056         */
    057        public int getRenderType()
    058        {
    059            return 18;
    060        }
    061
    062        @SideOnly(Side.CLIENT)
    063
    064        /**
    065         * Returns true if the given side of this block type should be rendered, if the adjacent block is at the given
    066         * coordinates.  Args: blockAccess, x, y, z, side
    067         */
    068        public boolean shouldSideBeRendered(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5)
    069        {
    070            int var6 = par1IBlockAccess.getBlockId(par2, par3, par4);
    071            return var6 == this.blockID ? false : super.shouldSideBeRendered(par1IBlockAccess, par2, par3, par4, par5);
    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            boolean var8 = this.canThisPaneConnectToThisBlockID(par1World.getBlockId(par2, par3, par4 - 1));
    080            boolean var9 = this.canThisPaneConnectToThisBlockID(par1World.getBlockId(par2, par3, par4 + 1));
    081            boolean var10 = this.canThisPaneConnectToThisBlockID(par1World.getBlockId(par2 - 1, par3, par4));
    082            boolean var11 = this.canThisPaneConnectToThisBlockID(par1World.getBlockId(par2 + 1, par3, par4));
    083
    084            if ((!var10 || !var11) && (var10 || var11 || var8 || var9))
    085            {
    086                if (var10 && !var11)
    087                {
    088                    this.setBlockBounds(0.0F, 0.0F, 0.4375F, 0.5F, 1.0F, 0.5625F);
    089                    super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity);
    090                }
    091                else if (!var10 && var11)
    092                {
    093                    this.setBlockBounds(0.5F, 0.0F, 0.4375F, 1.0F, 1.0F, 0.5625F);
    094                    super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity);
    095                }
    096            }
    097            else
    098            {
    099                this.setBlockBounds(0.0F, 0.0F, 0.4375F, 1.0F, 1.0F, 0.5625F);
    100                super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity);
    101            }
    102
    103            if ((!var8 || !var9) && (var10 || var11 || var8 || var9))
    104            {
    105                if (var8 && !var9)
    106                {
    107                    this.setBlockBounds(0.4375F, 0.0F, 0.0F, 0.5625F, 1.0F, 0.5F);
    108                    super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity);
    109                }
    110                else if (!var8 && var9)
    111                {
    112                    this.setBlockBounds(0.4375F, 0.0F, 0.5F, 0.5625F, 1.0F, 1.0F);
    113                    super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity);
    114                }
    115            }
    116            else
    117            {
    118                this.setBlockBounds(0.4375F, 0.0F, 0.0F, 0.5625F, 1.0F, 1.0F);
    119                super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity);
    120            }
    121        }
    122
    123        /**
    124         * Sets the block's bounds for rendering it as an item
    125         */
    126        public void setBlockBoundsForItemRender()
    127        {
    128            this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
    129        }
    130
    131        /**
    132         * Updates the blocks bounds based on its current state. Args: world, x, y, z
    133         */
    134        public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)
    135        {
    136            float var5 = 0.4375F;
    137            float var6 = 0.5625F;
    138            float var7 = 0.4375F;
    139            float var8 = 0.5625F;
    140            boolean var9 = this.canThisPaneConnectToThisBlockID(par1IBlockAccess.getBlockId(par2, par3, par4 - 1));
    141            boolean var10 = this.canThisPaneConnectToThisBlockID(par1IBlockAccess.getBlockId(par2, par3, par4 + 1));
    142            boolean var11 = this.canThisPaneConnectToThisBlockID(par1IBlockAccess.getBlockId(par2 - 1, par3, par4));
    143            boolean var12 = this.canThisPaneConnectToThisBlockID(par1IBlockAccess.getBlockId(par2 + 1, par3, par4));
    144
    145            if ((!var11 || !var12) && (var11 || var12 || var9 || var10))
    146            {
    147                if (var11 && !var12)
    148                {
    149                    var5 = 0.0F;
    150                }
    151                else if (!var11 && var12)
    152                {
    153                    var6 = 1.0F;
    154                }
    155            }
    156            else
    157            {
    158                var5 = 0.0F;
    159                var6 = 1.0F;
    160            }
    161
    162            if ((!var9 || !var10) && (var11 || var12 || var9 || var10))
    163            {
    164                if (var9 && !var10)
    165                {
    166                    var7 = 0.0F;
    167                }
    168                else if (!var9 && var10)
    169                {
    170                    var8 = 1.0F;
    171                }
    172            }
    173            else
    174            {
    175                var7 = 0.0F;
    176                var8 = 1.0F;
    177            }
    178
    179            this.setBlockBounds(var5, 0.0F, var7, var6, 1.0F, var8);
    180        }
    181
    182        @SideOnly(Side.CLIENT)
    183
    184        /**
    185         * Returns the texture index of the thin side of the pane.
    186         */
    187        public int getSideTextureIndex()
    188        {
    189            return this.sideTextureIndex;
    190        }
    191
    192        /**
    193         * Gets passed in the blockID of the block adjacent and supposed to return true if its allowed to connect to the
    194         * type of blockID passed in. Args: blockID
    195         */
    196        public final boolean canThisPaneConnectToThisBlockID(int par1)
    197        {
    198            return Block.opaqueCubeLookup[par1] || par1 == this.blockID || par1 == Block.glass.blockID;
    199        }
    200
    201        /**
    202         * Return true if a player with Silk Touch can harvest this block directly, and not its normal drops.
    203         */
    204        protected boolean canSilkHarvest()
    205        {
    206            return true;
    207        }
    208
    209        /**
    210         * Returns an item stack containing a single instance of the current block type. 'i' is the block's subtype/damage
    211         * and is ignored for blocks which do not support subtypes. Blocks which cannot be harvested should return null.
    212         */
    213        protected ItemStack createStackedBlock(int par1)
    214        {
    215            return new ItemStack(this.blockID, 1, par1);
    216        }
    217    }