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}