    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 BlockAnvil extends BlockSand
    008    {
    009        /** List of types/statues the Anvil can be in. */
    010        public static final String[] statuses = new String[] {"intact", "slightlyDamaged", "veryDamaged"};
    011        public int field_82521_b = 0;
    012
    013        protected BlockAnvil(int par1)
    014        {
    015            super(par1, 215, Material.anvil);
    016            this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.75F, 1.0F);
    017            this.setLightOpacity(0);
    018            this.setCreativeTab(CreativeTabs.tabDecorations);
    019        }
    020
    021        /**
    022         * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
    023         */
    024        public boolean renderAsNormalBlock()
    025        {
    026            return false;
    027        }
    028
    029        /**
    030         * Is this block (a) opaque and (b) a full 1m cube?  This determines whether or not to render the shared face of two
    031         * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block.
    032         */
    033        public boolean isOpaqueCube()
    034        {
    035            return false;
    036        }
    037
    038        /**
    039         * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata
    040         */
    041        public int getBlockTextureFromSideAndMetadata(int par1, int par2)
    042        {
    043            if (this.field_82521_b == 3 && par1 == 1)
    044            {
    045                int var3 = par2 >> 2;
    046
    047                switch (var3)
    048                {
    049                    case 1:
    050                        return this.blockIndexInTexture + 1;
    051                    case 2:
    052                        return this.blockIndexInTexture + 16 + 1;
    053                    default:
    054                        return this.blockIndexInTexture + 16;
    055                }
    056            }
    057            else
    058            {
    059                return this.blockIndexInTexture;
    060            }
    061        }
    062
    063        /**
    064         * Returns the block texture based on the side being looked at.  Args: side
    065         */
    066        public int getBlockTextureFromSide(int par1)
    067        {
    068            return super.getBlockTextureFromSide(par1);
    069        }
    070
    071        /**
    072         * Called when the block is placed in the world.
    073         */
    074        public void onBlockPlacedBy(World par1World, int par2, int par3, int par4, EntityLiving par5EntityLiving)
    075        {
    076            int var6 = MathHelper.floor_double((double)(par5EntityLiving.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;
    077            int var7 = par1World.getBlockMetadata(par2, par3, par4) >> 2;
    078            ++var6;
    079            var6 %= 4;
    080
    081            if (var6 == 0)
    082            {
    083                par1World.setBlockMetadataWithNotify(par2, par3, par4, 2 | var7 << 2);
    084            }
    085
    086            if (var6 == 1)
    087            {
    088                par1World.setBlockMetadataWithNotify(par2, par3, par4, 3 | var7 << 2);
    089            }
    090
    091            if (var6 == 2)
    092            {
    093                par1World.setBlockMetadataWithNotify(par2, par3, par4, 0 | var7 << 2);
    094            }
    095
    096            if (var6 == 3)
    097            {
    098                par1World.setBlockMetadataWithNotify(par2, par3, par4, 1 | var7 << 2);
    099            }
    100        }
    101
    102        /**
    103         * Called upon block activation (right click on the block.)
    104         */
    105        public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9)
    106        {
    107            if (par1World.isRemote)
    108            {
    109                return true;
    110            }
    111            else
    112            {
    113                par5EntityPlayer.displayGUIAnvil(par2, par3, par4);
    114                return true;
    115            }
    116        }
    117
    118        /**
    119         * The type of render function that is called for this block
    120         */
    121        public int getRenderType()
    122        {
    123            return 35;
    124        }
    125
    126        /**
    127         * Determines the damage on the item the block drops. Used in cloth and wood.
    128         */
    129        public int damageDropped(int par1)
    130        {
    131            return par1 >> 2;
    132        }
    133
    134        @SideOnly(Side.CLIENT)
    135
    136        /**
    137         * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks)
    138         */
    139        public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List)
    140        {
    141            par3List.add(new ItemStack(par1, 1, 0));
    142            par3List.add(new ItemStack(par1, 1, 1));
    143            par3List.add(new ItemStack(par1, 1, 2));
    144        }
    145
    146        /**
    147         * Called when the falling block entity for this block is created
    148         */
    149        protected void onStartFalling(EntityFallingSand par1EntityFallingSand)
    150        {
    151            par1EntityFallingSand.func_82154_e(true);
    152        }
    153
    154        /**
    155         * Called when the falling block entity for this block hits the ground and turns back into a block
    156         */
    157        public void onFinishFalling(World par1World, int par2, int par3, int par4, int par5)
    158        {
    159            par1World.playAuxSFX(1022, par2, par3, par4, 0);
    160        }
    161
    162        @SideOnly(Side.CLIENT)
    163
    164        /**
    165         * Returns true if the given side of this block type should be rendered, if the adjacent block is at the given
    166         * coordinates.  Args: blockAccess, x, y, z, side
    167         */
    168        public boolean shouldSideBeRendered(IBlockAccess var1, int var2, int var3, int var4, int var5)
    169        {
    170            return true;
    171        }
    172    }