    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    }