001    package net.minecraft.src;
002    
003    import net.minecraftforge.common.MinecraftForge;
004    import net.minecraftforge.event.entity.player.ArrowLooseEvent;
005    import net.minecraftforge.event.entity.player.ArrowNockEvent;
006    
007    public class ItemBow extends Item
008    {
009        public ItemBow(int par1)
010        {
011            super(par1);
012            this.maxStackSize = 1;
013            this.setMaxDamage(384);
014            this.setCreativeTab(CreativeTabs.tabCombat);
015        }
016    
017        /**
018         * called when the player releases the use item button. Args: itemstack, world, entityplayer, itemInUseCount
019         */
020        public void onPlayerStoppedUsing(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer, int par4)
021        {
022            int var6 = this.getMaxItemUseDuration(par1ItemStack) - par4;
023            
024            ArrowLooseEvent event = new ArrowLooseEvent(par3EntityPlayer, par1ItemStack, var6);
025            MinecraftForge.EVENT_BUS.post(event);
026            if (event.isCanceled())
027            {
028                return;
029            }
030            var6 = event.charge;
031            
032            boolean var5 = par3EntityPlayer.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, par1ItemStack) > 0;
033    
034            if (var5 || par3EntityPlayer.inventory.hasItem(Item.arrow.shiftedIndex))
035            {
036                float var7 = (float)var6 / 20.0F;
037                var7 = (var7 * var7 + var7 * 2.0F) / 3.0F;
038    
039                if ((double)var7 < 0.1D)
040                {
041                    return;
042                }
043    
044                if (var7 > 1.0F)
045                {
046                    var7 = 1.0F;
047                }
048    
049                EntityArrow var8 = new EntityArrow(par2World, par3EntityPlayer, var7 * 2.0F);
050    
051                if (var7 == 1.0F)
052                {
053                    var8.setIsCritical(true);
054                }
055    
056                int var9 = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, par1ItemStack);
057    
058                if (var9 > 0)
059                {
060                    var8.setDamage(var8.getDamage() + (double)var9 * 0.5D + 0.5D);
061                }
062    
063                int var10 = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, par1ItemStack);
064    
065                if (var10 > 0)
066                {
067                    var8.setKnockbackStrength(var10);
068                }
069    
070                if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, par1ItemStack) > 0)
071                {
072                    var8.setFire(100);
073                }
074    
075                par1ItemStack.damageItem(1, par3EntityPlayer);
076                par2World.playSoundAtEntity(par3EntityPlayer, "random.bow", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + var7 * 0.5F);
077    
078                if (var5)
079                {
080                    var8.canBePickedUp = 2;
081                }
082                else
083                {
084                    par3EntityPlayer.inventory.consumeInventoryItem(Item.arrow.shiftedIndex);
085                }
086    
087                if (!par2World.isRemote)
088                {
089                    par2World.spawnEntityInWorld(var8);
090                }
091            }
092        }
093    
094        public ItemStack onFoodEaten(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
095        {
096            return par1ItemStack;
097        }
098    
099        /**
100         * How long it takes to use or consume an item
101         */
102        public int getMaxItemUseDuration(ItemStack par1ItemStack)
103        {
104            return 72000;
105        }
106    
107        /**
108         * returns the action that specifies what animation to play when the items is being used
109         */
110        public EnumAction getItemUseAction(ItemStack par1ItemStack)
111        {
112            return EnumAction.bow;
113        }
114    
115        /**
116         * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer
117         */
118        public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
119        {
120            ArrowNockEvent event = new ArrowNockEvent(par3EntityPlayer, par1ItemStack);
121            MinecraftForge.EVENT_BUS.post(event);
122            if (event.isCanceled())
123            {
124                return event.result;
125            }
126            
127            if (par3EntityPlayer.capabilities.isCreativeMode || par3EntityPlayer.inventory.hasItem(Item.arrow.shiftedIndex))
128            {
129                par3EntityPlayer.setItemInUse(par1ItemStack, this.getMaxItemUseDuration(par1ItemStack));
130            }
131    
132            return par1ItemStack;
133        }
134    
135        /**
136         * Return the enchantability factor of the item, most of the time is based on material.
137         */
138        public int getItemEnchantability()
139        {
140            return 1;
141        }
142    }