    001package net.minecraft.block;
    002
    003import cpw.mods.fml.relauncher.Side;
    004import cpw.mods.fml.relauncher.SideOnly;
    005import java.util.List;
    006import net.minecraft.block.material.Material;
    007import net.minecraft.creativetab.CreativeTabs;
    008import net.minecraft.entity.EntityLiving;
    009import net.minecraft.entity.item.EntityFallingSand;
    010import net.minecraft.entity.player.EntityPlayer;
    011import net.minecraft.item.ItemStack;
    012import net.minecraft.util.MathHelper;
    013import net.minecraft.world.IBlockAccess;
    014import net.minecraft.world.World;
    015
    016public 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}