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    
007    public class BlockWall extends Block
008    {
009        /** The types of the wall. */
010        public static final String[] types = new String[] {"normal", "mossy"};
011    
012        public BlockWall(int par1, Block par2Block)
013        {
014            super(par1, par2Block.blockIndexInTexture, par2Block.blockMaterial);
015            this.setHardness(par2Block.blockHardness);
016            this.setResistance(par2Block.blockResistance / 3.0F);
017            this.setStepSound(par2Block.stepSound);
018            this.setCreativeTab(CreativeTabs.tabBlock);
019        }
020    
021        /**
022         * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata
023         */
024        public int getBlockTextureFromSideAndMetadata(int par1, int par2)
025        {
026            return par2 == 1 ? Block.cobblestoneMossy.blockIndexInTexture : super.getBlockTextureFromSide(par1);
027        }
028    
029        /**
030         * The type of render function that is called for this block
031         */
032        public int getRenderType()
033        {
034            return 32;
035        }
036    
037        /**
038         * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
039         */
040        public boolean renderAsNormalBlock()
041        {
042            return false;
043        }
044    
045        public boolean getBlocksMovement(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)
046        {
047            return false;
048        }
049    
050        /**
051         * Is this block (a) opaque and (b) a full 1m cube?  This determines whether or not to render the shared face of two
052         * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block.
053         */
054        public boolean isOpaqueCube()
055        {
056            return false;
057        }
058    
059        /**
060         * Updates the blocks bounds based on its current state. Args: world, x, y, z
061         */
062        public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)
063        {
064            boolean var5 = this.canConnectWallTo(par1IBlockAccess, par2, par3, par4 - 1);
065            boolean var6 = this.canConnectWallTo(par1IBlockAccess, par2, par3, par4 + 1);
066            boolean var7 = this.canConnectWallTo(par1IBlockAccess, par2 - 1, par3, par4);
067            boolean var8 = this.canConnectWallTo(par1IBlockAccess, par2 + 1, par3, par4);
068            float var9 = 0.25F;
069            float var10 = 0.75F;
070            float var11 = 0.25F;
071            float var12 = 0.75F;
072            float var13 = 1.0F;
073    
074            if (var5)
075            {
076                var11 = 0.0F;
077            }
078    
079            if (var6)
080            {
081                var12 = 1.0F;
082            }
083    
084            if (var7)
085            {
086                var9 = 0.0F;
087            }
088    
089            if (var8)
090            {
091                var10 = 1.0F;
092            }
093    
094            if (var5 && var6 && !var7 && !var8)
095            {
096                var13 = 0.8125F;
097                var9 = 0.3125F;
098                var10 = 0.6875F;
099            }
100            else if (!var5 && !var6 && var7 && var8)
101            {
102                var13 = 0.8125F;
103                var11 = 0.3125F;
104                var12 = 0.6875F;
105            }
106    
107            this.setBlockBounds(var9, 0.0F, var11, var10, var13, var12);
108        }
109    
110        /**
111         * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been
112         * cleared to be reused)
113         */
114        public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
115        {
116            this.setBlockBoundsBasedOnState(par1World, par2, par3, par4);
117            return super.getCollisionBoundingBoxFromPool(par1World, par2, par3, par4);
118        }
119    
120        /**
121         * Return whether an adjacent block can connect to a wall.
122         */
123        public boolean canConnectWallTo(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)
124        {
125            int var5 = par1IBlockAccess.getBlockId(par2, par3, par4);
126    
127            if (var5 != this.blockID && var5 != Block.fenceGate.blockID)
128            {
129                Block var6 = Block.blocksList[var5];
130                return var6 != null && var6.blockMaterial.isOpaque() && var6.renderAsNormalBlock() ? var6.blockMaterial != Material.pumpkin : false;
131            }
132            else
133            {
134                return true;
135            }
136        }
137    
138        @SideOnly(Side.CLIENT)
139    
140        /**
141         * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks)
142         */
143        public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List)
144        {
145            par3List.add(new ItemStack(par1, 1, 0));
146            par3List.add(new ItemStack(par1, 1, 1));
147        }
148    
149        /**
150         * Determines the damage on the item the block drops. Used in cloth and wood.
151         */
152        public int damageDropped(int par1)
153        {
154            return par1;
155        }
156    
157        @SideOnly(Side.CLIENT)
158    
159        /**
160         * Returns true if the given side of this block type should be rendered, if the adjacent block is at the given
161         * coordinates.  Args: blockAccess, x, y, z, side
162         */
163        public boolean shouldSideBeRendered(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5)
164        {
165            return par5 == 0 ? super.shouldSideBeRendered(par1IBlockAccess, par2, par3, par4, par5) : true;
166        }
167    }