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