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 }