001    package net.minecraft.src;
002    
003    import cpw.mods.fml.common.Side;
004    import cpw.mods.fml.common.asm.SideOnly;
005    import java.util.List;
006    
007    import net.minecraftforge.common.ForgeHooks;
008    import net.minecraftforge.common.MinecraftForge;
009    import net.minecraftforge.event.entity.player.BonemealEvent;
010    
011    public class ItemDye extends Item
012    {
013        /** List of dye color names */
014        public static final String[] dyeColorNames = new String[] {"black", "red", "green", "brown", "blue", "purple", "cyan", "silver", "gray", "pink", "lime", "yellow", "lightBlue", "magenta", "orange", "white"};
015        public static final int[] dyeColors = new int[] {1973019, 11743532, 3887386, 5320730, 2437522, 8073150, 2651799, 2651799, 4408131, 14188952, 4312372, 14602026, 6719955, 12801229, 15435844, 15790320};
016    
017        public ItemDye(int par1)
018        {
019            super(par1);
020            this.setHasSubtypes(true);
021            this.setMaxDamage(0);
022            this.setTabToDisplayOn(CreativeTabs.tabMaterials);
023        }
024    
025        @SideOnly(Side.CLIENT)
026    
027        /**
028         * Gets an icon index based on an item's damage value
029         */
030        public int getIconFromDamage(int par1)
031        {
032            int var2 = MathHelper.clamp_int(par1, 0, 15);
033            return this.iconIndex + var2 % 8 * 16 + var2 / 8;
034        }
035    
036        public String getItemNameIS(ItemStack par1ItemStack)
037        {
038            int var2 = MathHelper.clamp_int(par1ItemStack.getItemDamage(), 0, 15);
039            return super.getItemName() + "." + dyeColorNames[var2];
040        }
041    
042        public boolean tryPlaceIntoWorld(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10)
043        {
044            if (!par2EntityPlayer.canPlayerEdit(par4, par5, par6))
045            {
046                return false;
047            }
048            else
049            {
050                int var11;
051                int var12;
052    
053                if (par1ItemStack.getItemDamage() == 15)
054                {
055                    var11 = par3World.getBlockId(par4, par5, par6);
056    
057                    BonemealEvent event = new BonemealEvent(par2EntityPlayer, par3World, var11, par4, par5, par6);
058                    if (MinecraftForge.EVENT_BUS.post(event))
059                    {
060                        return false;
061                    }
062    
063                    if (event.isHandeled())
064                    {
065                       if (!par3World.isRemote)
066                        {
067                            par1ItemStack.stackSize--;
068                        }
069                        return true;
070                    }
071    
072                    if (var11 == Block.sapling.blockID)
073                    {
074                        if (!par3World.isRemote)
075                        {
076                            ((BlockSapling)Block.sapling).growTree(par3World, par4, par5, par6, par3World.rand);
077                            --par1ItemStack.stackSize;
078                        }
079    
080                        return true;
081                    }
082    
083                    if (var11 == Block.mushroomBrown.blockID || var11 == Block.mushroomRed.blockID)
084                    {
085                        if (!par3World.isRemote && ((BlockMushroom)Block.blocksList[var11]).fertilizeMushroom(par3World, par4, par5, par6, par3World.rand))
086                        {
087                            --par1ItemStack.stackSize;
088                        }
089    
090                        return true;
091                    }
092    
093                    if (var11 == Block.melonStem.blockID || var11 == Block.pumpkinStem.blockID)
094                    {
095                        if (par3World.getBlockMetadata(par4, par5, par6) == 7)
096                        {
097                            return false;
098                        }
099    
100                        if (!par3World.isRemote)
101                        {
102                            ((BlockStem)Block.blocksList[var11]).fertilizeStem(par3World, par4, par5, par6);
103                            --par1ItemStack.stackSize;
104                        }
105    
106                        return true;
107                    }
108    
109                    if (var11 == Block.crops.blockID)
110                    {
111                        if (par3World.getBlockMetadata(par4, par5, par6) == 7)
112                        {
113                            return false;
114                        }
115    
116                        if (!par3World.isRemote)
117                        {
118                            ((BlockCrops)Block.crops).fertilize(par3World, par4, par5, par6);
119                            --par1ItemStack.stackSize;
120                        }
121    
122                        return true;
123                    }
124    
125                    if (var11 == Block.cocoa.blockID)
126                    {
127                        if (!par3World.isRemote)
128                        {
129                            par3World.setBlockMetadataWithNotify(par4, par5, par6, 8 | BlockDirectional.getDirection(par3World.getBlockMetadata(par4, par5, par6)));
130                            --par1ItemStack.stackSize;
131                        }
132    
133                        return true;
134                    }
135    
136                    if (var11 == Block.grass.blockID)
137                    {
138                        if (!par3World.isRemote)
139                        {
140                            --par1ItemStack.stackSize;
141                            label135:
142    
143                            for (var12 = 0; var12 < 128; ++var12)
144                            {
145                                int var13 = par4;
146                                int var14 = par5 + 1;
147                                int var15 = par6;
148    
149                                for (int var16 = 0; var16 < var12 / 16; ++var16)
150                                {
151                                    var13 += itemRand.nextInt(3) - 1;
152                                    var14 += (itemRand.nextInt(3) - 1) * itemRand.nextInt(3) / 2;
153                                    var15 += itemRand.nextInt(3) - 1;
154    
155                                    if (par3World.getBlockId(var13, var14 - 1, var15) != Block.grass.blockID || par3World.isBlockNormalCube(var13, var14, var15))
156                                    {
157                                        continue label135;
158                                    }
159                                }
160    
161                                if (par3World.getBlockId(var13, var14, var15) == 0)
162                                {
163                                    if (itemRand.nextInt(10) != 0)
164                                    {
165                                        if (Block.tallGrass.canBlockStay(par3World, var13, var14, var15))
166                                        {
167                                            par3World.setBlockAndMetadataWithNotify(var13, var14, var15, Block.tallGrass.blockID, 1);
168                                        }
169                                    }
170                                    else
171                                    {
172                                        ForgeHooks.plantGrass(par3World, var13, var14, var15);
173                                    }
174                                }
175                            }
176                        }
177    
178                        return true;
179                    }
180                }
181                else if (par1ItemStack.getItemDamage() == 3)
182                {
183                    var11 = par3World.getBlockId(par4, par5, par6);
184                    var12 = par3World.getBlockMetadata(par4, par5, par6);
185    
186                    if (var11 == Block.wood.blockID && BlockLog.limitToValidMetadata(var12) == 3)
187                    {
188                        if (par7 == 0)
189                        {
190                            return false;
191                        }
192    
193                        if (par7 == 1)
194                        {
195                            return false;
196                        }
197    
198                        if (par7 == 2)
199                        {
200                            --par6;
201                        }
202    
203                        if (par7 == 3)
204                        {
205                            ++par6;
206                        }
207    
208                        if (par7 == 4)
209                        {
210                            --par4;
211                        }
212    
213                        if (par7 == 5)
214                        {
215                            ++par4;
216                        }
217    
218                        if (par3World.isAirBlock(par4, par5, par6))
219                        {
220                            par3World.setBlockWithNotify(par4, par5, par6, Block.cocoa.blockID);
221    
222                            if (par3World.getBlockId(par4, par5, par6) == Block.cocoa.blockID)
223                            {
224                                Block.blocksList[Block.cocoa.blockID].updateBlockMetadata(par3World, par4, par5, par6, par7, par8, par9, par10);
225                            }
226    
227                            if (!par2EntityPlayer.capabilities.isCreativeMode)
228                            {
229                                --par1ItemStack.stackSize;
230                            }
231                        }
232    
233                        return true;
234                    }
235                }
236    
237                return false;
238            }
239        }
240    
241        /**
242         * die sheep, place saddles, etc ...
243         */
244        public boolean itemInteractionForEntity(ItemStack par1ItemStack, EntityLiving par2EntityLiving)
245        {
246            if (par2EntityLiving instanceof EntitySheep)
247            {
248                EntitySheep var3 = (EntitySheep)par2EntityLiving;
249                int var4 = BlockCloth.getBlockFromDye(par1ItemStack.getItemDamage());
250    
251                if (!var3.getSheared() && var3.getFleeceColor() != var4)
252                {
253                    var3.setFleeceColor(var4);
254                    --par1ItemStack.stackSize;
255                }
256    
257                return true;
258            }
259            else
260            {
261                return false;
262            }
263        }
264    
265        @SideOnly(Side.CLIENT)
266    
267        /**
268         * returns a list of items with the same ID, but different meta (eg: dye returns 16 items)
269         */
270        public void getSubItems(int par1, CreativeTabs par2CreativeTabs, List par3List)
271        {
272            for (int var4 = 0; var4 < 16; ++var4)
273            {
274                par3List.add(new ItemStack(par1, 1, var4));
275            }
276        }
277    }