    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.shiftedIndex))
    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.shiftedIndex);
    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.shiftedIndex))
    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    }