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.block.BlockCloth;
008import net.minecraft.block.BlockCocoa;
009import net.minecraft.block.BlockCrops;
010import net.minecraft.block.BlockDirectional;
011import net.minecraft.block.BlockLog;
012import net.minecraft.block.BlockMushroom;
013import net.minecraft.block.BlockSapling;
014import net.minecraft.block.BlockStem;
015import net.minecraft.client.renderer.texture.IconRegister;
016import net.minecraft.creativetab.CreativeTabs;
017import net.minecraft.entity.EntityLiving;
018import net.minecraft.entity.passive.EntitySheep;
019import net.minecraft.entity.player.EntityPlayer;
020import net.minecraft.util.Icon;
021import net.minecraft.util.MathHelper;
022import net.minecraft.world.World;
023
024import net.minecraftforge.common.FakePlayerFactory;
025import net.minecraftforge.common.ForgeHooks;
026import net.minecraftforge.common.MinecraftForge;
027import net.minecraftforge.event.Event.Result;
028import net.minecraftforge.event.entity.player.BonemealEvent;
029
030public class ItemDye extends Item
031{
032    /** List of dye color names */
033    public static final String[] dyeColorNames = new String[] {"black", "red", "green", "brown", "blue", "purple", "cyan", "silver", "gray", "pink", "lime", "yellow", "lightBlue", "magenta", "orange", "white"};
034    public static final String[] field_94595_b = new String[] {"dyePowder_black", "dyePowder_red", "dyePowder_green", "dyePowder_brown", "dyePowder_blue", "dyePowder_purple", "dyePowder_cyan", "dyePowder_silver", "dyePowder_gray", "dyePowder_pink", "dyePowder_lime", "dyePowder_yellow", "dyePowder_lightBlue", "dyePowder_magenta", "dyePowder_orange", "dyePowder_white"};
035    public static final int[] dyeColors = new int[] {1973019, 11743532, 3887386, 5320730, 2437522, 8073150, 2651799, 11250603, 4408131, 14188952, 4312372, 14602026, 6719955, 12801229, 15435844, 15790320};
036    @SideOnly(Side.CLIENT)
037    private Icon[] field_94594_d;
038
039    public ItemDye(int par1)
040    {
041        super(par1);
042        this.setHasSubtypes(true);
043        this.setMaxDamage(0);
044        this.setCreativeTab(CreativeTabs.tabMaterials);
045    }
046
047    @SideOnly(Side.CLIENT)
048
049    /**
050     * Gets an icon index based on an item's damage value
051     */
052    public Icon getIconFromDamage(int par1)
053    {
054        int j = MathHelper.clamp_int(par1, 0, 15);
055        return this.field_94594_d[j];
056    }
057
058    /**
059     * Returns the unlocalized name of this item. This version accepts an ItemStack so different stacks can have
060     * different names based on their damage or NBT.
061     */
062    public String getUnlocalizedName(ItemStack par1ItemStack)
063    {
064        int i = MathHelper.clamp_int(par1ItemStack.getItemDamage(), 0, 15);
065        return super.getUnlocalizedName() + "." + dyeColorNames[i];
066    }
067
068    /**
069     * Callback for item usage. If the item does something special on right clicking, he will have one of those. Return
070     * True if something happen and false if it don't. This is for ITEMS, not BLOCKS
071     */
072    public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10)
073    {
074        if (!par2EntityPlayer.canPlayerEdit(par4, par5, par6, par7, par1ItemStack))
075        {
076            return false;
077        }
078        else
079        {
080            if (par1ItemStack.getItemDamage() == 15)
081            {
082                if (applyBonemeal(par1ItemStack, par3World, par4, par5, par6, par2EntityPlayer))
083                {
084                    if (!par3World.isRemote)
085                    {
086                        par3World.playAuxSFX(2005, par4, par5, par6, 0);
087                    }
088
089                    return true;
090                }
091            }
092            else if (par1ItemStack.getItemDamage() == 3)
093            {
094                int i1 = par3World.getBlockId(par4, par5, par6);
095                int j1 = par3World.getBlockMetadata(par4, par5, par6);
096
097                if (i1 == Block.wood.blockID && BlockLog.limitToValidMetadata(j1) == 3)
098                {
099                    if (par7 == 0)
100                    {
101                        return false;
102                    }
103
104                    if (par7 == 1)
105                    {
106                        return false;
107                    }
108
109                    if (par7 == 2)
110                    {
111                        --par6;
112                    }
113
114                    if (par7 == 3)
115                    {
116                        ++par6;
117                    }
118
119                    if (par7 == 4)
120                    {
121                        --par4;
122                    }
123
124                    if (par7 == 5)
125                    {
126                        ++par4;
127                    }
128
129                    if (par3World.isAirBlock(par4, par5, par6))
130                    {
131                        int k1 = Block.blocksList[Block.cocoaPlant.blockID].onBlockPlaced(par3World, par4, par5, par6, par7, par8, par9, par10, 0);
132                        par3World.setBlock(par4, par5, par6, Block.cocoaPlant.blockID, k1, 2);
133
134                        if (!par2EntityPlayer.capabilities.isCreativeMode)
135                        {
136                            --par1ItemStack.stackSize;
137                        }
138                    }
139
140                    return true;
141                }
142            }
143
144            return false;
145        }
146    }
147
148    public static boolean func_96604_a(ItemStack par0ItemStack, World par1World, int par2, int par3, int par4)
149    {
150        return applyBonemeal(par0ItemStack, par1World, par2, par3, par4, FakePlayerFactory.getMinecraft(par1World));
151    }
152
153    public static boolean applyBonemeal(ItemStack par0ItemStack, World par1World, int par2, int par3, int par4, EntityPlayer player)
154    {
155        int l = par1World.getBlockId(par2, par3, par4);
156
157        BonemealEvent event = new BonemealEvent(player, par1World, l, par2, par3, par4);
158        if (MinecraftForge.EVENT_BUS.post(event))
159        {
160            return false;
161        }
162
163        if (event.getResult() == Result.ALLOW)
164        {
165            if (!par1World.isRemote)
166            {
167                par0ItemStack.stackSize--;
168            }
169            return true;
170        }
171
172        if (l == Block.sapling.blockID)
173        {
174            if (!par1World.isRemote)
175            {
176                if ((double)par1World.rand.nextFloat() < 0.45D)
177                {
178                    ((BlockSapling)Block.sapling).func_96477_c(par1World, par2, par3, par4, par1World.rand);
179                }
180
181                --par0ItemStack.stackSize;
182            }
183
184            return true;
185        }
186        else if (l != Block.mushroomBrown.blockID && l != Block.mushroomRed.blockID)
187        {
188            if (l != Block.melonStem.blockID && l != Block.pumpkinStem.blockID)
189            {
190                if (l > 0 && Block.blocksList[l] instanceof BlockCrops)
191                {
192                    if (par1World.getBlockMetadata(par2, par3, par4) == 7)
193                    {
194                        return false;
195                    }
196                    else
197                    {
198                        if (!par1World.isRemote)
199                        {
200                            ((BlockCrops)Block.blocksList[l]).fertilize(par1World, par2, par3, par4);
201                            --par0ItemStack.stackSize;
202                        }
203
204                        return true;
205                    }
206                }
207                else
208                {
209                    int i1;
210                    int j1;
211                    int k1;
212
213                    if (l == Block.cocoaPlant.blockID)
214                    {
215                        i1 = par1World.getBlockMetadata(par2, par3, par4);
216                        j1 = BlockDirectional.getDirection(i1);
217                        k1 = BlockCocoa.func_72219_c(i1);
218
219                        if (k1 >= 2)
220                        {
221                            return false;
222                        }
223                        else
224                        {
225                            if (!par1World.isRemote)
226                            {
227                                ++k1;
228                                par1World.setBlockMetadataWithNotify(par2, par3, par4, k1 << 2 | j1, 2);
229                                --par0ItemStack.stackSize;
230                            }
231
232                            return true;
233                        }
234                    }
235                    else if (l != Block.grass.blockID)
236                    {
237                        return false;
238                    }
239                    else
240                    {
241                        if (!par1World.isRemote)
242                        {
243                            --par0ItemStack.stackSize;
244                            label102:
245
246                            for (i1 = 0; i1 < 128; ++i1)
247                            {
248                                j1 = par2;
249                                k1 = par3 + 1;
250                                int l1 = par4;
251
252                                for (int i2 = 0; i2 < i1 / 16; ++i2)
253                                {
254                                    j1 += itemRand.nextInt(3) - 1;
255                                    k1 += (itemRand.nextInt(3) - 1) * itemRand.nextInt(3) / 2;
256                                    l1 += itemRand.nextInt(3) - 1;
257
258                                    if (par1World.getBlockId(j1, k1 - 1, l1) != Block.grass.blockID || par1World.isBlockNormalCube(j1, k1, l1))
259                                    {
260                                        continue label102;
261                                    }
262                                }
263
264                                if (par1World.getBlockId(j1, k1, l1) == 0)
265                                {
266                                    if (itemRand.nextInt(10) != 0)
267                                    {
268                                        if (Block.tallGrass.canBlockStay(par1World, j1, k1, l1))
269                                        {
270                                            par1World.setBlock(j1, k1, l1, Block.tallGrass.blockID, 1, 3);
271                                        }
272                                    }
273                                    else
274                                    {
275                                        ForgeHooks.plantGrass(par1World, j1, k1, l1);
276                                    }
277                                }
278                            }
279                        }
280
281                        return true;
282                    }
283                }
284            }
285            else if (par1World.getBlockMetadata(par2, par3, par4) == 7)
286            {
287                return false;
288            }
289            else
290            {
291                if (!par1World.isRemote)
292                {
293                    ((BlockStem)Block.blocksList[l]).fertilizeStem(par1World, par2, par3, par4);
294                    --par0ItemStack.stackSize;
295                }
296
297                return true;
298            }
299        }
300        else
301        {
302            if (!par1World.isRemote)
303            {
304                if ((double)par1World.rand.nextFloat() < 0.4D)
305                {
306                    ((BlockMushroom)Block.blocksList[l]).fertilizeMushroom(par1World, par2, par3, par4, par1World.rand);
307                }
308
309                --par0ItemStack.stackSize;
310            }
311
312            return true;
313        }
314    }
315
316    @SideOnly(Side.CLIENT)
317    public static void func_96603_a(World par0World, int par1, int par2, int par3, int par4)
318    {
319        int i1 = par0World.getBlockId(par1, par2, par3);
320
321        if (par4 == 0)
322        {
323            par4 = 15;
324        }
325
326        Block block = i1 > 0 && i1 < Block.blocksList.length ? Block.blocksList[i1] : null;
327
328        if (block != null)
329        {
330            block.setBlockBoundsBasedOnState(par0World, par1, par2, par3);
331
332            for (int j1 = 0; j1 < par4; ++j1)
333            {
334                double d0 = itemRand.nextGaussian() * 0.02D;
335                double d1 = itemRand.nextGaussian() * 0.02D;
336                double d2 = itemRand.nextGaussian() * 0.02D;
337                par0World.spawnParticle("happyVillager", (double)((float)par1 + itemRand.nextFloat()), (double)par2 + (double)itemRand.nextFloat() * block.getBlockBoundsMaxY(), (double)((float)par3 + itemRand.nextFloat()), d0, d1, d2);
338            }
339        }
340    }
341
342    /**
343     * Called when a player right clicks an entity with an item.
344     */
345    public boolean itemInteractionForEntity(ItemStack par1ItemStack, EntityLiving par2EntityLiving)
346    {
347        if (par2EntityLiving instanceof EntitySheep)
348        {
349            EntitySheep entitysheep = (EntitySheep)par2EntityLiving;
350            int i = BlockCloth.getBlockFromDye(par1ItemStack.getItemDamage());
351
352            if (!entitysheep.getSheared() && entitysheep.getFleeceColor() != i)
353            {
354                entitysheep.setFleeceColor(i);
355                --par1ItemStack.stackSize;
356            }
357
358            return true;
359        }
360        else
361        {
362            return false;
363        }
364    }
365
366    @SideOnly(Side.CLIENT)
367
368    /**
369     * returns a list of items with the same ID, but different meta (eg: dye returns 16 items)
370     */
371    public void getSubItems(int par1, CreativeTabs par2CreativeTabs, List par3List)
372    {
373        for (int j = 0; j < 16; ++j)
374        {
375            par3List.add(new ItemStack(par1, 1, j));
376        }
377    }
378
379    @SideOnly(Side.CLIENT)
380    public void updateIcons(IconRegister par1IconRegister)
381    {
382        this.field_94594_d = new Icon[field_94595_b.length];
383
384        for (int i = 0; i < field_94595_b.length; ++i)
385        {
386            this.field_94594_d[i] = par1IconRegister.registerIcon(field_94595_b[i]);
387        }
388    }
389}