    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    }