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