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