    001package net.minecraft.item;
    002
    003import cpw.mods.fml.relauncher.Side;
    004import cpw.mods.fml.relauncher.SideOnly;
    005import java.util.List;
    006import net.minecraft.block.Block;
    007import net.minecraft.block.BlockCloth;
    008import net.minecraft.block.BlockCocoa;
    009import net.minecraft.block.BlockCrops;
    010import net.minecraft.block.BlockDirectional;
    011import net.minecraft.block.BlockLog;
    012import net.minecraft.block.BlockMushroom;
    013import net.minecraft.block.BlockSapling;
    014import net.minecraft.block.BlockStem;
    015import net.minecraft.client.renderer.texture.IconRegister;
    016import net.minecraft.creativetab.CreativeTabs;
    017import net.minecraft.entity.EntityLiving;
    018import net.minecraft.entity.passive.EntitySheep;
    019import net.minecraft.entity.player.EntityPlayer;
    020import net.minecraft.util.Icon;
    021import net.minecraft.util.MathHelper;
    022import net.minecraft.world.World;
    023
    024import net.minecraftforge.common.FakePlayerFactory;
    025import net.minecraftforge.common.ForgeHooks;
    026import net.minecraftforge.common.MinecraftForge;
    027import net.minecraftforge.event.Event.Result;
    028import net.minecraftforge.event.entity.player.BonemealEvent;
    029
    030public class ItemDye extends Item
    031{
    032    /** List of dye color names */
    033    public static final String[] dyeColorNames = new String[] {"black", "red", "green", "brown", "blue", "purple", "cyan", "silver", "gray", "pink", "lime", "yellow", "lightBlue", "magenta", "orange", "white"};
    034    public static final String[] field_94595_b = new String[] {"dyePowder_black", "dyePowder_red", "dyePowder_green", "dyePowder_brown", "dyePowder_blue", "dyePowder_purple", "dyePowder_cyan", "dyePowder_silver", "dyePowder_gray", "dyePowder_pink", "dyePowder_lime", "dyePowder_yellow", "dyePowder_lightBlue", "dyePowder_magenta", "dyePowder_orange", "dyePowder_white"};
    035    public static final int[] dyeColors = new int[] {1973019, 11743532, 3887386, 5320730, 2437522, 8073150, 2651799, 11250603, 4408131, 14188952, 4312372, 14602026, 6719955, 12801229, 15435844, 15790320};
    036    @SideOnly(Side.CLIENT)
    037    private Icon[] field_94594_d;
    038
    039    public ItemDye(int par1)
    040    {
    041        super(par1);
    042        this.setHasSubtypes(true);
    043        this.setMaxDamage(0);
    044        this.setCreativeTab(CreativeTabs.tabMaterials);
    045    }
    046
    047    @SideOnly(Side.CLIENT)
    048
    049    /**
    050     * Gets an icon index based on an item's damage value
    051     */
    052    public Icon getIconFromDamage(int par1)
    053    {
    054        int j = MathHelper.clamp_int(par1, 0, 15);
    055        return this.field_94594_d[j];
    056    }
    057
    058    /**
    059     * Returns the unlocalized name of this item. This version accepts an ItemStack so different stacks can have
    060     * different names based on their damage or NBT.
    061     */
    062    public String getUnlocalizedName(ItemStack par1ItemStack)
    063    {
    064        int i = MathHelper.clamp_int(par1ItemStack.getItemDamage(), 0, 15);
    065        return super.getUnlocalizedName() + "." + dyeColorNames[i];
    066    }
    067
    068    /**
    069     * Callback for item usage. If the item does something special on right clicking, he will have one of those. Return
    070     * True if something happen and false if it don't. This is for ITEMS, not BLOCKS
    071     */
    072    public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10)
    073    {
    074        if (!par2EntityPlayer.canPlayerEdit(par4, par5, par6, par7, par1ItemStack))
    075        {
    076            return false;
    077        }
    078        else
    079        {
    080            if (par1ItemStack.getItemDamage() == 15)
    081            {
    082                if (applyBonemeal(par1ItemStack, par3World, par4, par5, par6, par2EntityPlayer))
    083                {
    084                    if (!par3World.isRemote)
    085                    {
    086                        par3World.playAuxSFX(2005, par4, par5, par6, 0);
    087                    }
    088
    089                    return true;
    090                }
    091            }
    092            else if (par1ItemStack.getItemDamage() == 3)
    093            {
    094                int i1 = par3World.getBlockId(par4, par5, par6);
    095                int j1 = par3World.getBlockMetadata(par4, par5, par6);
    096
    097                if (i1 == Block.wood.blockID && BlockLog.limitToValidMetadata(j1) == 3)
    098                {
    099                    if (par7 == 0)
    100                    {
    101                        return false;
    102                    }
    103
    104                    if (par7 == 1)
    105                    {
    106                        return false;
    107                    }
    108
    109                    if (par7 == 2)
    110                    {
    111                        --par6;
    112                    }
    113
    114                    if (par7 == 3)
    115                    {
    116                        ++par6;
    117                    }
    118
    119                    if (par7 == 4)
    120                    {
    121                        --par4;
    122                    }
    123
    124                    if (par7 == 5)
    125                    {
    126                        ++par4;
    127                    }
    128
    129                    if (par3World.isAirBlock(par4, par5, par6))
    130                    {
    131                        int k1 = Block.blocksList[Block.cocoaPlant.blockID].onBlockPlaced(par3World, par4, par5, par6, par7, par8, par9, par10, 0);
    132                        par3World.setBlock(par4, par5, par6, Block.cocoaPlant.blockID, k1, 2);
    133
    134                        if (!par2EntityPlayer.capabilities.isCreativeMode)
    135                        {
    136                            --par1ItemStack.stackSize;
    137                        }
    138                    }
    139
    140                    return true;
    141                }
    142            }
    143
    144            return false;
    145        }
    146    }
    147
    148    public static boolean func_96604_a(ItemStack par0ItemStack, World par1World, int par2, int par3, int par4)
    149    {
    150        return applyBonemeal(par0ItemStack, par1World, par2, par3, par4, FakePlayerFactory.getMinecraft(par1World));
    151    }
    152
    153    public static boolean applyBonemeal(ItemStack par0ItemStack, World par1World, int par2, int par3, int par4, EntityPlayer player)
    154    {
    155        int l = par1World.getBlockId(par2, par3, par4);
    156
    157        BonemealEvent event = new BonemealEvent(player, par1World, l, par2, par3, par4);
    158        if (MinecraftForge.EVENT_BUS.post(event))
    159        {
    160            return false;
    161        }
    162
    163        if (event.getResult() == Result.ALLOW)
    164        {
    165            if (!par1World.isRemote)
    166            {
    167                par0ItemStack.stackSize--;
    168            }
    169            return true;
    170        }
    171
    172        if (l == Block.sapling.blockID)
    173        {
    174            if (!par1World.isRemote)
    175            {
    176                if ((double)par1World.rand.nextFloat() < 0.45D)
    177                {
    178                    ((BlockSapling)Block.sapling).func_96477_c(par1World, par2, par3, par4, par1World.rand);
    179                }
    180
    181                --par0ItemStack.stackSize;
    182            }
    183
    184            return true;
    185        }
    186        else if (l != Block.mushroomBrown.blockID && l != Block.mushroomRed.blockID)
    187        {
    188            if (l != Block.melonStem.blockID && l != Block.pumpkinStem.blockID)
    189            {
    190                if (l > 0 && Block.blocksList[l] instanceof BlockCrops)
    191                {
    192                    if (par1World.getBlockMetadata(par2, par3, par4) == 7)
    193                    {
    194                        return false;
    195                    }
    196                    else
    197                    {
    198                        if (!par1World.isRemote)
    199                        {
    200                            ((BlockCrops)Block.blocksList[l]).fertilize(par1World, par2, par3, par4);
    201                            --par0ItemStack.stackSize;
    202                        }
    203
    204                        return true;
    205                    }
    206                }
    207                else
    208                {
    209                    int i1;
    210                    int j1;
    211                    int k1;
    212
    213                    if (l == Block.cocoaPlant.blockID)
    214                    {
    215                        i1 = par1World.getBlockMetadata(par2, par3, par4);
    216                        j1 = BlockDirectional.getDirection(i1);
    217                        k1 = BlockCocoa.func_72219_c(i1);
    218
    219                        if (k1 >= 2)
    220                        {
    221                            return false;
    222                        }
    223                        else
    224                        {
    225                            if (!par1World.isRemote)
    226                            {
    227                                ++k1;
    228                                par1World.setBlockMetadataWithNotify(par2, par3, par4, k1 << 2 | j1, 2);
    229                                --par0ItemStack.stackSize;
    230                            }
    231
    232                            return true;
    233                        }
    234                    }
    235                    else if (l != Block.grass.blockID)
    236                    {
    237                        return false;
    238                    }
    239                    else
    240                    {
    241                        if (!par1World.isRemote)
    242                        {
    243                            --par0ItemStack.stackSize;
    244                            label102:
    245
    246                            for (i1 = 0; i1 < 128; ++i1)
    247                            {
    248                                j1 = par2;
    249                                k1 = par3 + 1;
    250                                int l1 = par4;
    251
    252                                for (int i2 = 0; i2 < i1 / 16; ++i2)
    253                                {
    254                                    j1 += itemRand.nextInt(3) - 1;
    255                                    k1 += (itemRand.nextInt(3) - 1) * itemRand.nextInt(3) / 2;
    256                                    l1 += itemRand.nextInt(3) - 1;
    257
    258                                    if (par1World.getBlockId(j1, k1 - 1, l1) != Block.grass.blockID || par1World.isBlockNormalCube(j1, k1, l1))
    259                                    {
    260                                        continue label102;
    261                                    }
    262                                }
    263
    264                                if (par1World.getBlockId(j1, k1, l1) == 0)
    265                                {
    266                                    if (itemRand.nextInt(10) != 0)
    267                                    {
    268                                        if (Block.tallGrass.canBlockStay(par1World, j1, k1, l1))
    269                                        {
    270                                            par1World.setBlock(j1, k1, l1, Block.tallGrass.blockID, 1, 3);
    271                                        }
    272                                    }
    273                                    else
    274                                    {
    275                                        ForgeHooks.plantGrass(par1World, j1, k1, l1);
    276                                    }
    277                                }
    278                            }
    279                        }
    280
    281                        return true;
    282                    }
    283                }
    284            }
    285            else if (par1World.getBlockMetadata(par2, par3, par4) == 7)
    286            {
    287                return false;
    288            }
    289            else
    290            {
    291                if (!par1World.isRemote)
    292                {
    293                    ((BlockStem)Block.blocksList[l]).fertilizeStem(par1World, par2, par3, par4);
    294                    --par0ItemStack.stackSize;
    295                }
    296
    297                return true;
    298            }
    299        }
    300        else
    301        {
    302            if (!par1World.isRemote)
    303            {
    304                if ((double)par1World.rand.nextFloat() < 0.4D)
    305                {
    306                    ((BlockMushroom)Block.blocksList[l]).fertilizeMushroom(par1World, par2, par3, par4, par1World.rand);
    307                }
    308
    309                --par0ItemStack.stackSize;
    310            }
    311
    312            return true;
    313        }
    314    }
    315
    316    @SideOnly(Side.CLIENT)
    317    public static void func_96603_a(World par0World, int par1, int par2, int par3, int par4)
    318    {
    319        int i1 = par0World.getBlockId(par1, par2, par3);
    320
    321        if (par4 == 0)
    322        {
    323            par4 = 15;
    324        }
    325
    326        Block block = i1 > 0 && i1 < Block.blocksList.length ? Block.blocksList[i1] : null;
    327
    328        if (block != null)
    329        {
    330            block.setBlockBoundsBasedOnState(par0World, par1, par2, par3);
    331
    332            for (int j1 = 0; j1 < par4; ++j1)
    333            {
    334                double d0 = itemRand.nextGaussian() * 0.02D;
    335                double d1 = itemRand.nextGaussian() * 0.02D;
    336                double d2 = itemRand.nextGaussian() * 0.02D;
    337                par0World.spawnParticle("happyVillager", (double)((float)par1 + itemRand.nextFloat()), (double)par2 + (double)itemRand.nextFloat() * block.getBlockBoundsMaxY(), (double)((float)par3 + itemRand.nextFloat()), d0, d1, d2);
    338            }
    339        }
    340        else
    341        {
    342            for (int j1 = 0; j1 < par4; ++j1)
    343            {
    344                double d0 = itemRand.nextGaussian() * 0.02D;
    345                double d1 = itemRand.nextGaussian() * 0.02D;
    346                double d2 = itemRand.nextGaussian() * 0.02D;
    347                par0World.spawnParticle("happyVillager", (double)((float)par1 + itemRand.nextFloat()), (double)par2 + (double)itemRand.nextFloat() * 1.0f, (double)((float)par3 + itemRand.nextFloat()), d0, d1, d2);
    348            }
    349        }
    350    }
    351
    352    /**
    353     * Called when a player right clicks an entity with an item.
    354     */
    355    public boolean itemInteractionForEntity(ItemStack par1ItemStack, EntityLiving par2EntityLiving)
    356    {
    357        if (par2EntityLiving instanceof EntitySheep)
    358        {
    359            EntitySheep entitysheep = (EntitySheep)par2EntityLiving;
    360            int i = BlockCloth.getBlockFromDye(par1ItemStack.getItemDamage());
    361
    362            if (!entitysheep.getSheared() && entitysheep.getFleeceColor() != i)
    363            {
    364                entitysheep.setFleeceColor(i);
    365                --par1ItemStack.stackSize;
    366            }
    367
    368            return true;
    369        }
    370        else
    371        {
    372            return false;
    373        }
    374    }
    375
    376    @SideOnly(Side.CLIENT)
    377
    378    /**
    379     * returns a list of items with the same ID, but different meta (eg: dye returns 16 items)
    380     */
    381    public void getSubItems(int par1, CreativeTabs par2CreativeTabs, List par3List)
    382    {
    383        for (int j = 0; j < 16; ++j)
    384        {
    385            par3List.add(new ItemStack(par1, 1, j));
    386        }
    387    }
    388
    389    @SideOnly(Side.CLIENT)
    390    public void registerIcons(IconRegister par1IconRegister)
    391    {
    392        this.field_94594_d = new Icon[field_94595_b.length];
    393
    394        for (int i = 0; i < field_94595_b.length; ++i)
    395        {
    396            this.field_94594_d[i] = par1IconRegister.registerIcon(field_94595_b[i]);
    397        }
    398    }
    399}