    001package net.minecraft.item;
    002
    003import cpw.mods.fml.relauncher.Side;
    004import cpw.mods.fml.relauncher.SideOnly;
    005import java.util.List;
    006import net.minecraft.block.Block;
    007import net.minecraft.creativetab.CreativeTabs;
    008import net.minecraft.entity.Entity;
    009import net.minecraft.entity.player.EntityPlayer;
    010import net.minecraft.world.World;
    011
    012public class ItemBlock extends Item
    013{
    014    /** The block ID of the Block associated with this ItemBlock */
    015    private int blockID;
    016
    017    public ItemBlock(int par1)
    018    {
    019        super(par1);
    020        this.blockID = par1 + 256;
    021        this.setIconIndex(Block.blocksList[par1 + 256].getBlockTextureFromSide(2));
    022        isDefaultTexture = Block.blocksList[par1 + 256].isDefaultTexture;
    023    }
    024
    025    /**
    026     * Returns the blockID for this Item
    027     */
    028    public int getBlockID()
    029    {
    030        return this.blockID;
    031    }
    032
    033    /**
    034     * Callback for item usage. If the item does something special on right clicking, he will have one of those. Return
    035     * True if something happen and false if it don't. This is for ITEMS, not BLOCKS
    036     */
    037    public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10)
    038    {
    039        int var11 = par3World.getBlockId(par4, par5, par6);
    040
    041        if (var11 == Block.snow.blockID)
    042        {
    043            par7 = 1;
    044        }
    045        else if (var11 != Block.vine.blockID && var11 != Block.tallGrass.blockID && var11 != Block.deadBush.blockID
    046                && (Block.blocksList[var11] == null || !Block.blocksList[var11].isBlockReplaceable(par3World, par4, par5, par6)))
    047        {
    048            if (par7 == 0)
    049            {
    050                --par5;
    051            }
    052
    053            if (par7 == 1)
    054            {
    055                ++par5;
    056            }
    057
    058            if (par7 == 2)
    059            {
    060                --par6;
    061            }
    062
    063            if (par7 == 3)
    064            {
    065                ++par6;
    066            }
    067
    068            if (par7 == 4)
    069            {
    070                --par4;
    071            }
    072
    073            if (par7 == 5)
    074            {
    075                ++par4;
    076            }
    077        }
    078
    079        if (par1ItemStack.stackSize == 0)
    080        {
    081            return false;
    082        }
    083        else if (!par2EntityPlayer.canPlayerEdit(par4, par5, par6, par7, par1ItemStack))
    084        {
    085            return false;
    086        }
    087        else if (par5 == 255 && Block.blocksList[this.blockID].blockMaterial.isSolid())
    088        {
    089            return false;
    090        }
    091        else if (par3World.canPlaceEntityOnSide(this.blockID, par4, par5, par6, false, par7, par2EntityPlayer))
    092        {
    093            Block var12 = Block.blocksList[this.blockID];
    094            int var13 = this.getMetadata(par1ItemStack.getItemDamage());
    095            int var14 = Block.blocksList[this.blockID].onBlockPlaced(par3World, par4, par5, par6, par7, par8, par9, par10, var13);
    096
    097            if (placeBlockAt(par1ItemStack, par2EntityPlayer, par3World, par4, par5, par6, par7, par8, par9, par10, var14))
    098            {
    099                par3World.playSoundEffect((double)((float)par4 + 0.5F), (double)((float)par5 + 0.5F), (double)((float)par6 + 0.5F), var12.stepSound.getPlaceSound(), (var12.stepSound.getVolume() + 1.0F) / 2.0F, var12.stepSound.getPitch() * 0.8F);
    100                --par1ItemStack.stackSize;
    101            }
    102
    103            return true;
    104        }
    105        else
    106        {
    107            return false;
    108        }
    109    }
    110
    111    @SideOnly(Side.CLIENT)
    112
    113    /**
    114     * Returns true if the given ItemBlock can be placed on the given side of the given block position.
    115     */
    116    public boolean canPlaceItemBlockOnSide(World par1World, int par2, int par3, int par4, int par5, EntityPlayer par6EntityPlayer, ItemStack par7ItemStack)
    117    {
    118        int var8 = par1World.getBlockId(par2, par3, par4);
    119
    120        if (var8 == Block.snow.blockID)
    121        {
    122            par5 = 1;
    123        }
    124        else if (var8 != Block.vine.blockID && var8 != Block.tallGrass.blockID && var8 != Block.deadBush.blockID
    125                && (Block.blocksList[var8] == null || !Block.blocksList[var8].isBlockReplaceable(par1World, par2, par3, par4)))
    126        {
    127            if (par5 == 0)
    128            {
    129                --par3;
    130            }
    131
    132            if (par5 == 1)
    133            {
    134                ++par3;
    135            }
    136
    137            if (par5 == 2)
    138            {
    139                --par4;
    140            }
    141
    142            if (par5 == 3)
    143            {
    144                ++par4;
    145            }
    146
    147            if (par5 == 4)
    148            {
    149                --par2;
    150            }
    151
    152            if (par5 == 5)
    153            {
    154                ++par2;
    155            }
    156        }
    157
    158        return par1World.canPlaceEntityOnSide(this.getBlockID(), par2, par3, par4, false, par5, (Entity)null);
    159    }
    160
    161    public String getItemNameIS(ItemStack par1ItemStack)
    162    {
    163        return Block.blocksList[this.blockID].getBlockName();
    164    }
    165
    166    public String getItemName()
    167    {
    168        return Block.blocksList[this.blockID].getBlockName();
    169    }
    170
    171    @SideOnly(Side.CLIENT)
    172
    173    /**
    174     * gets the CreativeTab this item is displayed on
    175     */
    176    public CreativeTabs getCreativeTab()
    177    {
    178        return Block.blocksList[this.blockID].getCreativeTabToDisplayOn();
    179    }
    180
    181    @SideOnly(Side.CLIENT)
    182
    183    /**
    184     * returns a list of items with the same ID, but different meta (eg: dye returns 16 items)
    185     */
    186    public void getSubItems(int par1, CreativeTabs par2CreativeTabs, List par3List)
    187    {
    188        Block.blocksList[this.blockID].getSubBlocks(par1, par2CreativeTabs, par3List);
    189    }
    190
    191    /**
    192     * Called to actually place the block, after the location is determined
    193     * and all permission checks have been made.
    194     *
    195     * @param stack The item stack that was used to place the block. This can be changed inside the method.
    196     * @param player The player who is placing the block. Can be null if the block is not being placed by a player.
    197     * @param side The side the player (or machine) right-clicked on.
    198     */
    199    public boolean placeBlockAt(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int metadata)
    200    {
    201       if (!world.setBlockAndMetadataWithNotify(x, y, z, this.blockID, metadata))
    202       {
    203               return false;
    204       }
    205
    206       if (world.getBlockId(x, y, z) == this.blockID)
    207       {
    208           Block.blocksList[this.blockID].onBlockPlacedBy(world, x, y, z, player);
    209           Block.blocksList[this.blockID].onPostBlockPlaced(world, x, y, z, metadata);
    210       }
    211
    212       return true;
    213    }
    214}