    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            this.maxY = 1.5D;
    118            return super.getCollisionBoundingBoxFromPool(par1World, par2, par3, par4);
    119        }
    120
    121        /**
    122         * Return whether an adjacent block can connect to a wall.
    123         */
    124        public boolean canConnectWallTo(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)
    125        {
    126            int var5 = par1IBlockAccess.getBlockId(par2, par3, par4);
    127
    128            if (var5 != this.blockID && var5 != Block.fenceGate.blockID)
    129            {
    130                Block var6 = Block.blocksList[var5];
    131                return var6 != null && var6.blockMaterial.isOpaque() && var6.renderAsNormalBlock() ? var6.blockMaterial != Material.pumpkin : false;
    132            }
    133            else
    134            {
    135                return true;
    136            }
    137        }
    138
    139        @SideOnly(Side.CLIENT)
    140
    141        /**
    142         * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks)
    143         */
    144        public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List)
    145        {
    146            par3List.add(new ItemStack(par1, 1, 0));
    147            par3List.add(new ItemStack(par1, 1, 1));
    148        }
    149
    150        /**
    151         * Determines the damage on the item the block drops. Used in cloth and wood.
    152         */
    153        public int damageDropped(int par1)
    154        {
    155            return par1;
    156        }
    157
    158        @SideOnly(Side.CLIENT)
    159
    160        /**
    161         * Returns true if the given side of this block type should be rendered, if the adjacent block is at the given
    162         * coordinates.  Args: blockAccess, x, y, z, side
    163         */
    164        public boolean shouldSideBeRendered(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5)
    165        {
    166            return par5 == 0 ? super.shouldSideBeRendered(par1IBlockAccess, par2, par3, par4, par5) : true;
    167        }
    168    }