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.setCreativeTab(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 /**
043 * Callback for item usage. If the item does something special on right clicking, he will have one of those. Return
044 * True if something happen and false if it don't. This is for ITEMS, not BLOCKS
045 */
046 public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10)
047 {
048 if (!par2EntityPlayer.canPlayerEdit(par4, par5, par6))
049 {
050 return false;
051 }
052 else
053 {
054 int var11;
055 int var12;
056
057 if (par1ItemStack.getItemDamage() == 15)
058 {
059 var11 = par3World.getBlockId(par4, par5, par6);
060
061 BonemealEvent event = new BonemealEvent(par2EntityPlayer, par3World, var11, par4, par5, par6);
062 if (MinecraftForge.EVENT_BUS.post(event))
063 {
064 return false;
065 }
066
067 if (event.isHandeled())
068 {
069 if (!par3World.isRemote)
070 {
071 par1ItemStack.stackSize--;
072 }
073 return true;
074 }
075
076 if (var11 == Block.sapling.blockID)
077 {
078 if (!par3World.isRemote)
079 {
080 ((BlockSapling)Block.sapling).growTree(par3World, par4, par5, par6, par3World.rand);
081 --par1ItemStack.stackSize;
082 }
083
084 return true;
085 }
086
087 if (var11 == Block.mushroomBrown.blockID || var11 == Block.mushroomRed.blockID)
088 {
089 if (!par3World.isRemote && ((BlockMushroom)Block.blocksList[var11]).fertilizeMushroom(par3World, par4, par5, par6, par3World.rand))
090 {
091 --par1ItemStack.stackSize;
092 }
093
094 return true;
095 }
096
097 if (var11 == Block.melonStem.blockID || var11 == Block.pumpkinStem.blockID)
098 {
099 if (par3World.getBlockMetadata(par4, par5, par6) == 7)
100 {
101 return false;
102 }
103
104 if (!par3World.isRemote)
105 {
106 ((BlockStem)Block.blocksList[var11]).fertilizeStem(par3World, par4, par5, par6);
107 --par1ItemStack.stackSize;
108 }
109
110 return true;
111 }
112
113 if (var11 == Block.crops.blockID)
114 {
115 if (par3World.getBlockMetadata(par4, par5, par6) == 7)
116 {
117 return false;
118 }
119
120 if (!par3World.isRemote)
121 {
122 ((BlockCrops)Block.crops).fertilize(par3World, par4, par5, par6);
123 --par1ItemStack.stackSize;
124 }
125
126 return true;
127 }
128
129 if (var11 == Block.cocoaPlant.blockID)
130 {
131 if (!par3World.isRemote)
132 {
133 par3World.setBlockMetadataWithNotify(par4, par5, par6, 8 | BlockDirectional.getDirection(par3World.getBlockMetadata(par4, par5, par6)));
134 --par1ItemStack.stackSize;
135 }
136
137 return true;
138 }
139
140 if (var11 == Block.grass.blockID)
141 {
142 if (!par3World.isRemote)
143 {
144 --par1ItemStack.stackSize;
145 label135:
146
147 for (var12 = 0; var12 < 128; ++var12)
148 {
149 int var13 = par4;
150 int var14 = par5 + 1;
151 int var15 = par6;
152
153 for (int var16 = 0; var16 < var12 / 16; ++var16)
154 {
155 var13 += itemRand.nextInt(3) - 1;
156 var14 += (itemRand.nextInt(3) - 1) * itemRand.nextInt(3) / 2;
157 var15 += itemRand.nextInt(3) - 1;
158
159 if (par3World.getBlockId(var13, var14 - 1, var15) != Block.grass.blockID || par3World.isBlockNormalCube(var13, var14, var15))
160 {
161 continue label135;
162 }
163 }
164
165 if (par3World.getBlockId(var13, var14, var15) == 0)
166 {
167 if (itemRand.nextInt(10) != 0)
168 {
169 if (Block.tallGrass.canBlockStay(par3World, var13, var14, var15))
170 {
171 par3World.setBlockAndMetadataWithNotify(var13, var14, var15, Block.tallGrass.blockID, 1);
172 }
173 }
174 else
175 {
176 ForgeHooks.plantGrass(par3World, var13, var14, var15);
177 }
178 }
179 }
180 }
181
182 return true;
183 }
184 }
185 else if (par1ItemStack.getItemDamage() == 3)
186 {
187 var11 = par3World.getBlockId(par4, par5, par6);
188 var12 = par3World.getBlockMetadata(par4, par5, par6);
189
190 if (var11 == Block.wood.blockID && BlockLog.limitToValidMetadata(var12) == 3)
191 {
192 if (par7 == 0)
193 {
194 return false;
195 }
196
197 if (par7 == 1)
198 {
199 return false;
200 }
201
202 if (par7 == 2)
203 {
204 --par6;
205 }
206
207 if (par7 == 3)
208 {
209 ++par6;
210 }
211
212 if (par7 == 4)
213 {
214 --par4;
215 }
216
217 if (par7 == 5)
218 {
219 ++par4;
220 }
221
222 if (par3World.isAirBlock(par4, par5, par6))
223 {
224 par3World.setBlockWithNotify(par4, par5, par6, Block.cocoaPlant.blockID);
225
226 if (par3World.getBlockId(par4, par5, par6) == Block.cocoaPlant.blockID)
227 {
228 Block.blocksList[Block.cocoaPlant.blockID].updateBlockMetadata(par3World, par4, par5, par6, par7, par8, par9, par10);
229 }
230
231 if (!par2EntityPlayer.capabilities.isCreativeMode)
232 {
233 --par1ItemStack.stackSize;
234 }
235 }
236
237 return true;
238 }
239 }
240
241 return false;
242 }
243 }
244
245 /**
246 * dye sheep, place saddles, etc ...
247 */
248 public boolean itemInteractionForEntity(ItemStack par1ItemStack, EntityLiving par2EntityLiving)
249 {
250 if (par2EntityLiving instanceof EntitySheep)
251 {
252 EntitySheep var3 = (EntitySheep)par2EntityLiving;
253 int var4 = BlockCloth.getBlockFromDye(par1ItemStack.getItemDamage());
254
255 if (!var3.getSheared() && var3.getFleeceColor() != var4)
256 {
257 var3.setFleeceColor(var4);
258 --par1ItemStack.stackSize;
259 }
260
261 return true;
262 }
263 else
264 {
265 return false;
266 }
267 }
268
269 @SideOnly(Side.CLIENT)
270
271 /**
272 * returns a list of items with the same ID, but different meta (eg: dye returns 16 items)
273 */
274 public void getSubItems(int par1, CreativeTabs par2CreativeTabs, List par3List)
275 {
276 for (int var4 = 0; var4 < 16; ++var4)
277 {
278 par3List.add(new ItemStack(par1, 1, var4));
279 }
280 }
281 }