    001    package net.minecraft.item;
    002
    003    import cpw.mods.fml.common.Side;
    004    import cpw.mods.fml.common.asm.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, 2651799, 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].func_85104_a(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    }