    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            boolean var5 = this.canConnectWallTo(par1World, par2, par3, par4 - 1);
    117            boolean var6 = this.canConnectWallTo(par1World, par2, par3, par4 + 1);
    118            boolean var7 = this.canConnectWallTo(par1World, par2 - 1, par3, par4);
    119            boolean var8 = this.canConnectWallTo(par1World, par2 + 1, par3, par4);
    120            float var9 = 0.375F;
    121            float var10 = 0.625F;
    122            float var11 = 0.375F;
    123            float var12 = 0.625F;
    124
    125            if (var5)
    126            {
    127                var11 = 0.0F;
    128            }
    129
    130            if (var6)
    131            {
    132                var12 = 1.0F;
    133            }
    134
    135            if (var7)
    136            {
    137                var9 = 0.0F;
    138            }
    139
    140            if (var8)
    141            {
    142                var10 = 1.0F;
    143            }
    144
    145            return AxisAlignedBB.getAABBPool().addOrModifyAABBInPool((double)((float)par2 + var9), (double)par3, (double)((float)par4 + var11), (double)((float)par2 + var10), (double)((float)par3 + 1.5F), (double)((float)par4 + var12));
    146        }
    147
    148        /**
    149         * Return whether an adjacent block can connect to a wall.
    150         */
    151        public boolean canConnectWallTo(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)
    152        {
    153            int var5 = par1IBlockAccess.getBlockId(par2, par3, par4);
    154
    155            if (var5 != this.blockID && var5 != Block.fenceGate.blockID)
    156            {
    157                Block var6 = Block.blocksList[var5];
    158                return var6 != null && var6.blockMaterial.isOpaque() && var6.renderAsNormalBlock() ? var6.blockMaterial != Material.pumpkin : false;
    159            }
    160            else
    161            {
    162                return true;
    163            }
    164        }
    165
    166        @SideOnly(Side.CLIENT)
    167
    168        /**
    169         * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks)
    170         */
    171        public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List)
    172        {
    173            par3List.add(new ItemStack(par1, 1, 0));
    174            par3List.add(new ItemStack(par1, 1, 1));
    175        }
    176
    177        /**
    178         * Determines the damage on the item the block drops. Used in cloth and wood.
    179         */
    180        public int damageDropped(int par1)
    181        {
    182            return par1;
    183        }
    184
    185        @SideOnly(Side.CLIENT)
    186
    187        /**
    188         * Returns true if the given side of this block type should be rendered, if the adjacent block is at the given
    189         * coordinates.  Args: blockAccess, x, y, z, side
    190         */
    191        public boolean shouldSideBeRendered(IBlockAccess var1, int var2, int var3, int var4, int var5)
    192        {
    193            return var5 == 0 ? super.shouldSideBeRendered(var1, var2, var3, var4, var5) : true;
    194        }
    195    }