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