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