    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    }