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