Java 类net.minecraft.item.ItemArrow 实例源码

项目:CrystalMod    文件:EventHandler.java   
@SubscribeEvent
public void handleNock(ArrowNockEvent event){
    if(event.getEntityPlayer() !=null){
        ExtendedPlayer exPlayer = ExtendedPlayerProvider.getExtendedPlayer(event.getEntityPlayer()); 
        if(exPlayer !=null){
            ExtendedPlayerInventory inv = exPlayer.getInventory();
            ItemStack backpack = inv.getStackInSlot(ExtendedPlayerInventory.BACKPACK_SLOT_ID);
            if(ItemStackTools.isValid(backpack)){
                InventoryBackpackUpgrades upgrades = BackpackUtil.getUpgradeInventory(event.getEntityPlayer(), backpack);
                if(upgrades !=null && upgrades.hasUpgrade(BackpackUpgrade.BOW)){
                    InventoryBackpack backpackInv = BackpackUtil.getInventory(event.getEntityPlayer(), backpack);
                    if(backpackInv !=null){
                        for(int i = 0; i < backpackInv.getSize(); i++){
                            ItemStack st = backpackInv.getStackInSlot(i);
                            if(ItemStackTools.isValid(st) && st.getItem() instanceof ItemArrow){
                                event.getEntityPlayer().setActiveHand(event.getHand());
                                event.setAction(new ActionResult<ItemStack>(EnumActionResult.SUCCESS, event.getBow()));
                                return;
                            }
                        }
                    }
                }
            }
        }
    }
}
项目:MCDoom    文件:DoomHUDRenderer.java   
private int countAmmo(EntityPlayerSP player) {
    ItemStack current = player.inventory.getCurrentItem();
    if(current != null) {
        if(current.getItem() instanceof ItemBow) {
            int enchant = net.minecraft.enchantment.EnchantmentHelper.getEnchantmentLevel(net.minecraft.init.Enchantments.INFINITY, current);
            if(enchant > 0) {
                return INFINITE_AMMO;
            }
            return countItem(player.inventory, ItemArrow.class);
        } else if(current.getItem() instanceof FunWeaponItem) {
            return INFINITE_AMMO;
        } else if(current.getItem() instanceof WeaponItem) {
            return countAmmo(player.inventory, ((WeaponItem) current.getItem()).getDefinition().getAmmoType());
        }
    }
    return INFINITE_AMMO;
}
项目:Battlegear2    文件:ItemQuiver.java   
@Override
public void onArrowFired(World world, EntityPlayer player, ItemStack stack, ItemStack bow, EntityArrow arrow) {
    if(!player.capabilities.isCreativeMode){
        int selectedSlot = getSelectedSlot(stack);
        ItemStack arrowStack = getStackInSlot(stack, selectedSlot);
        if(!(arrowStack.getItem() instanceof ItemArrow) || !((ItemArrow) arrowStack.getItem()).isInfinite(arrowStack, bow, player)) {
            arrowStack.shrink(1);
            if (arrowStack.isEmpty()) {
                //ForgeEventFactory.onPlayerDestroyItem(player, arrowStack);
                arrowStack = ItemStack.EMPTY;
            }
            setStackInSlot(stack, selectedSlot, arrowStack);
        }
    }
    bow.getTagCompound().removeTag("Battlegear2-LoadedArrow");
}
项目:CrystalMod    文件:EventHandler.java   
@SubscribeEvent
public void handleLoose(ArrowLooseEvent event){
    if(event.getEntityPlayer() !=null){
        ExtendedPlayer exPlayer = ExtendedPlayerProvider.getExtendedPlayer(event.getEntityPlayer()); 
        if(exPlayer !=null){
            ExtendedPlayerInventory inv = exPlayer.getInventory();
            ItemStack backpack = inv.getStackInSlot(ExtendedPlayerInventory.BACKPACK_SLOT_ID);
            if(ItemStackTools.isValid(backpack)){
                InventoryBackpackUpgrades upgrades = BackpackUtil.getUpgradeInventory(event.getEntityPlayer(), backpack);
                if(upgrades !=null && upgrades.hasUpgrade(BackpackUpgrade.BOW)){
                    InventoryBackpack backpackInv = BackpackUtil.getInventory(event.getEntityPlayer(), backpack);
                    if(backpackInv !=null){
                        for(int i = 0; i < backpackInv.getSize(); i++){
                            ItemStack st = backpackInv.getStackInSlot(i);
                            if(ItemStackTools.isValid(st) && st.getItem() instanceof ItemArrow){
                                if(!EntityUtil.shootArrow(event.getWorld(), event.getEntityPlayer(), event.getBow(), st, event.getCharge())){
                                    backpackInv.decrStackSize(i, 1);
                                    backpackInv.markDirty();
                                    backpackInv.guiSave(event.getEntityPlayer());
                                    inv.setChanged(ExtendedPlayerInventory.BACKPACK_SLOT_ID, true);
                                    event.setCanceled(true);
                                    return;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
项目:Battlegear2    文件:MobHookContainerClass.java   
/**
 * Listen to {@link EntityJoinWorldEvent} :
 * Adds random special {@link EntityArrow}s data to {@link AbstractSkeleton}s {@link net.minecraft.network.datasync.EntityDataManager} (for display)
 * Replace the vanilla fired {@link EntityTippedArrow} with the custom {@link AbstractMBArrow} (for actual action)
 * Note: Fails silently
 */
@SubscribeEvent(priority = EventPriority.LOW)
public void onEntityJoinWorld(EntityJoinWorldEvent event){
    if(event.getEntity() instanceof AbstractSkeleton){
        registerArrowType((AbstractSkeleton)event.getEntity());
    }else if(event.getEntity() instanceof EntityTippedArrow && ((EntityTippedArrow) event.getEntity()).getColor() == 0){
        EntityArrow arrow = ((EntityArrow)event.getEntity());
        if (arrow.shootingEntity instanceof AbstractSkeleton) {
            AbstractSkeleton skeleton = (AbstractSkeleton) arrow.shootingEntity;
            if(skeleton.getAttackTarget() != null) {
                ItemStack type = getArrowForMob(skeleton);
                if (type.getItem() instanceof ItemArrow) {
                    EntityArrow mbArrow = ((ItemArrow)type.getItem()).createArrow(skeleton.world, type, skeleton);
                    if (!(mbArrow instanceof EntityTippedArrow)) {
                        EntityLivingBase target = skeleton.getAttackTarget();
                        float pow = MathHelper.sqrt(skeleton.getDistanceSq(target.posX, target.getEntityBoundingBox().minY, target.posZ)) / 15F;
                        pow = MathHelper.clamp(pow, 0.1F, 1.0F);

                        mbArrow.setEnchantmentEffectsFromEntity(skeleton, pow);
                        if (skeleton instanceof EntityWitherSkeleton)
                            mbArrow.setFire(100);
                        double d0 = target.posX - skeleton.posX;
                        double d1 = target.getEntityBoundingBox().minY + (double)(target.height / 3.0F) - mbArrow.posY;
                        double d2 = target.posZ - skeleton.posZ;
                        double d3 = (double)MathHelper.sqrt(d0 * d0 + d2 * d2);
                        mbArrow.setThrowableHeading(d0, d1 + d3 * 0.2D, d2, 1.6F, (float)(14 - skeleton.world.getDifficulty().getDifficultyId() * 4));
                        mbArrow.setDamage(arrow.getDamage());
                        if (skeleton.world.spawnEntity(mbArrow))
                            event.setCanceled(true);
                    }
                }
            }
        }
    }
}
项目:CompositeGear    文件:ItemCGBow.java   
protected boolean isArrow(ItemStack stack)
{
    return stack.getItem() instanceof ItemArrow;
}
项目:Overlord    文件:EntityAIArmyBow.java   
protected boolean isArrowInOffhand() {
    return !this.armyMember.getHeldItemOffhand().isEmpty() && this.armyMember.getHeldItemOffhand().getItem() instanceof ItemArrow;
}
项目:CrystalMod    文件:EntityUtil.java   
/**Returns if an arrow was infinite or not**/
public static boolean shootArrow(World world, EntityPlayer entityplayer, ItemStack bow, ItemStack itemstack, int charge) {
    boolean flag = entityplayer.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantments.INFINITY, bow) > 0;
       int i = charge;

       if (ItemStackTools.isValid(itemstack) || flag)
       {
           if (ItemStackTools.isEmpty(itemstack))
           {
               itemstack = new ItemStack(Items.ARROW);
           }

           float f = ItemBow.getArrowVelocity(i);

           if (f >= 0.1D)
           {
               boolean flag1 = entityplayer.capabilities.isCreativeMode || (itemstack.getItem() instanceof ItemArrow ? ((ItemArrow)itemstack.getItem()).isInfinite(itemstack, bow, entityplayer) : false);

               if (!world.isRemote)
               {
                   ItemArrow itemarrow = ((ItemArrow)(itemstack.getItem() instanceof ItemArrow ? itemstack.getItem() : Items.ARROW));
                   EntityArrow entityarrow = itemarrow.createArrow(world, itemstack, entityplayer);
                   entityarrow.setAim(entityplayer, entityplayer.rotationPitch, entityplayer.rotationYaw, 0.0F, f * 3.0F, 1.0F);

                   if (f == 1.0F)
                   {
                       entityarrow.setIsCritical(true);
                   }

                   int j = EnchantmentHelper.getEnchantmentLevel(Enchantments.POWER, bow);

                   if (j > 0)
                   {
                       entityarrow.setDamage(entityarrow.getDamage() + j * 0.5D + 0.5D);
                   }

                   int k = EnchantmentHelper.getEnchantmentLevel(Enchantments.PUNCH, bow);

                   if (k > 0)
                   {
                       entityarrow.setKnockbackStrength(k);
                   }

                   if (EnchantmentHelper.getEnchantmentLevel(Enchantments.FLAME, bow) > 0)
                   {
                       entityarrow.setFire(100);
                   }

                   bow.damageItem(1, entityplayer);

                   if (flag1)
                   {
                       entityarrow.pickupStatus = EntityArrow.PickupStatus.CREATIVE_ONLY;
                   }

                   world.spawnEntity(entityarrow);
               }

               world.playSound((EntityPlayer)null, entityplayer.posX, entityplayer.posY, entityplayer.posZ, SoundEvents.ENTITY_ARROW_SHOOT, SoundCategory.NEUTRAL, 1.0F, 1.0F / (rand.nextFloat() * 0.4F + 1.2F) + f * 0.5F);

               entityplayer.addStat(StatList.getObjectUseStats(Items.BOW));
               return flag1;
           }
       }
       return false;
   }
项目:Aether-Legacy    文件:ItemPhoenixBow.java   
protected boolean isArrow(@Nullable ItemStack stack)
{
    return stack != null && stack.getItem() instanceof ItemArrow;
}
项目:Aether-Legacy    文件:ItemPhoenixBow.java   
@Override
public void onPlayerStoppedUsing(ItemStack stack, World worldIn, EntityLivingBase entityLiving, int timeLeft)
{
    if (entityLiving instanceof EntityPlayer)
    {
        EntityPlayer entityplayer = (EntityPlayer)entityLiving;
        boolean flag = entityplayer.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantments.INFINITY, stack) > 0;
        ItemStack itemstack = this.findAmmo(entityplayer);

        int i = this.getMaxItemUseDuration(stack) - timeLeft;
        i = net.minecraftforge.event.ForgeEventFactory.onArrowLoose(stack, worldIn, (EntityPlayer)entityLiving, i, itemstack != null || flag);
        if (i < 0) return;

        if (itemstack != null || flag)
        {
            if (itemstack == null)
            {
                itemstack = new ItemStack(Items.ARROW);
            }

            float f = getArrowVelocity(i);

            if ((double)f >= 0.1D)
            {
                boolean flag1 = entityplayer.capabilities.isCreativeMode || (itemstack.getItem() instanceof ItemArrow ? ((ItemArrow)itemstack.getItem()).isInfinite(itemstack, stack, entityplayer) : false);

                if (!worldIn.isRemote)
                {
                    EntityArrow entityarrow = this.createArrow(worldIn, itemstack.getItem() instanceof ItemSpectralArrow, itemstack, entityplayer);
                    entityarrow.setAim(entityplayer, entityplayer.rotationPitch, entityplayer.rotationYaw, 0.0F, f * 3.0F, 1.0F);

                    if (f == 1.0F)
                    {
                        entityarrow.setIsCritical(true);
                    }

                    int j = EnchantmentHelper.getEnchantmentLevel(Enchantments.POWER, stack);

                    if (j > 0)
                    {
                        entityarrow.setDamage(entityarrow.getDamage() + (double)j * 0.5D + 0.5D);
                    }

                    int k = EnchantmentHelper.getEnchantmentLevel(Enchantments.PUNCH, stack);

                    if (k > 0)
                    {
                        entityarrow.setKnockbackStrength(k);
                    }

                    stack.damageItem(1, entityplayer);

                    if (flag1)
                    {
                        entityarrow.pickupStatus = EntityArrow.PickupStatus.CREATIVE_ONLY;
                    }

                    worldIn.spawnEntityInWorld(entityarrow);
                }

                worldIn.playSound((EntityPlayer)null, entityplayer.posX, entityplayer.posY, entityplayer.posZ, SoundEvents.ENTITY_ARROW_SHOOT, SoundCategory.NEUTRAL, 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + f * 0.5F);

                if (!flag1)
                {
                    --itemstack.stackSize;

                    if (itemstack.stackSize == 0)
                    {
                        entityplayer.inventory.deleteStack(itemstack);
                    }
                }

                entityplayer.addStat(StatList.getObjectUseStats(this));
            }
        }
    }
}
项目:Inhuman-Resources    文件:ItemRedstoneArrow.java   
@Override
public boolean isInfinite(ItemStack arrow, ItemStack bow, EntityPlayer player)
{
    int enchant = EnchantmentHelper.getEnchantmentLevel(Enchantments.INFINITY, bow);
    return enchant > 0 && this instanceof ItemArrow;
}
项目:Wars-Mod    文件:ItemArcherBow.java   
@Override
public void onPlayerStoppedUsing(ItemStack stack, World worldIn, EntityLivingBase entityLiving, int timeLeft)
{
    if (entityLiving instanceof EntityPlayer)
    {
        EntityPlayer entityplayer = (EntityPlayer)entityLiving;
        boolean flag = entityplayer.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantments.INFINITY, stack) > 0;
        ItemStack itemstack = this.findAmmo(entityplayer);

        int i = this.getMaxItemUseDuration(stack) - timeLeft;
        i = ForgeEventFactory.onArrowLoose(stack, worldIn, entityplayer, i, itemstack != null || flag);
        if (i < 0) return;

        if (itemstack != null || flag)
        {
            if (itemstack == null)
            {
                itemstack = new ItemStack(Items.ARROW);
            }

            float f = getArrowVelocity(i);

            if ((double)f >= 0.1D)
            {
                boolean flag1 = entityplayer.capabilities.isCreativeMode || (itemstack.getItem() instanceof ItemArrow ? ((ItemArrow)itemstack.getItem()).isInfinite(itemstack, stack, entityplayer) : false);

                if (!worldIn.isRemote)
                {
                    ItemArrow itemarrow = (ItemArrow)(itemstack.getItem() instanceof ItemArrow ? itemstack.getItem() : Items.ARROW);
                    EntityArrow entityarrow = itemarrow.createArrow(worldIn, itemstack, entityplayer);
                    entityarrow.setAim(entityplayer, entityplayer.rotationPitch, entityplayer.rotationYaw, 0.0F, f * 3.0F, 1.0F);

                    if (f == 1.0F)
                    {
                        entityarrow.setIsCritical(true);
                    }

                    int j = EnchantmentHelper.getEnchantmentLevel(Enchantments.POWER, stack);

                    if (j > 0)
                    {
                        entityarrow.setDamage(entityarrow.getDamage() + (double)j * 0.5D + 0.5D);
                    }

                    int k = EnchantmentHelper.getEnchantmentLevel(Enchantments.PUNCH, stack);

                    if (k > 0)
                    {
                        entityarrow.setKnockbackStrength(k);
                    }

                    if (EnchantmentHelper.getEnchantmentLevel(Enchantments.FLAME, stack) > 0)
                    {
                        entityarrow.setFire(100);
                    }

                    if (flag1)
                    {
                        entityarrow.pickupStatus = EntityArrow.PickupStatus.CREATIVE_ONLY;
                    }

                    worldIn.spawnEntityInWorld(entityarrow);
                }

                worldIn.playSound(null, entityplayer.posX, entityplayer.posY, entityplayer.posZ, SoundEvents.ENTITY_ARROW_SHOOT, SoundCategory.NEUTRAL, 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + f * 0.5F);

                entityplayer.addStat(StatList.getObjectUseStats(this));
            }
        }
    }
}
项目:Skree    文件:ICustomBow.java   
default boolean isArrow(@Nullable ItemStack stack) {
  return stack != null && stack.getItem() instanceof ItemArrow;
}
项目:Skree    文件:ICustomBow.java   
/**
 * Called when the player stops using an Item (stops holding the right mouse button).
 *
 * @param timeLeft The amount of ticks left before the using would have been complete
 */
default void onPlayerStoppedUsing(ItemStack stack, World worldIn, EntityLivingBase entityLiving, int timeLeft) {
  if (entityLiving instanceof EntityPlayer) {
    EntityPlayer entityplayer = (EntityPlayer) entityLiving;
    boolean flag = entityplayer.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantments.INFINITY, stack) > 0;
    ItemStack itemstack = this.findAmmo(entityplayer);

    int i = this.getMaxItemUseDuration(stack) - timeLeft;
    i = net.minecraftforge.event.ForgeEventFactory.onArrowLoose(stack, worldIn, (EntityPlayer) entityLiving, i, itemstack != null || flag);
    if (i < 0) {
      return;
    }

    if (itemstack != null || flag) {
      if (itemstack == null) {
        itemstack = new ItemStack(Items.ARROW);
      }

      float f = getArrowVelocity(i);

      if ((double) f >= 0.1D) {
        boolean flag1 = entityplayer.capabilities.isCreativeMode || (itemstack.getItem() instanceof ItemArrow && ((ItemArrow) itemstack.getItem()).isInfinite(itemstack, stack, entityplayer));

        if (!worldIn.isRemote) {
          ItemArrow itemarrow = (ItemArrow) (itemstack.getItem() instanceof ItemArrow ? itemstack.getItem() : Items.ARROW);
          EntityArrow entityarrow = itemarrow.createArrow(worldIn, itemstack, entityplayer);
          entityarrow.setAim(entityplayer, entityplayer.rotationPitch, entityplayer.rotationYaw, 0.0F, f * 3.0F, 1.0F);

          if (f == 1.0F) {
            entityarrow.setIsCritical(true);
          }

          int j = EnchantmentHelper.getEnchantmentLevel(Enchantments.POWER, stack);

          if (j > 0) {
            entityarrow.setDamage(entityarrow.getDamage() + (double) j * 0.5D + 0.5D);
          }

          int k = EnchantmentHelper.getEnchantmentLevel(Enchantments.PUNCH, stack);

          if (k > 0) {
            entityarrow.setKnockbackStrength(k);
          }

          if (EnchantmentHelper.getEnchantmentLevel(Enchantments.FLAME, stack) > 0) {
            entityarrow.setFire(100);
          }

          stack.damageItem(1, entityplayer);

          if (flag1) {
            entityarrow.pickupStatus = EntityArrow.PickupStatus.CREATIVE_ONLY;
          }

          worldIn.spawnEntity(entityarrow);
        }

        worldIn.playSound(null, entityplayer.posX, entityplayer.posY, entityplayer.posZ, SoundEvents.ENTITY_ARROW_SHOOT, SoundCategory.NEUTRAL, 1.0F, 1.0F / (__getItemRand().nextFloat() * 0.4F + 1.2F) + f * 0.5F);

        if (!flag1) {
          itemstack.setCount(itemstack.getCount() - 1);

          if (itemstack.getCount() == 0) {
            entityplayer.inventory.deleteStack(itemstack);
          }
        }

        entityplayer.addStat(StatList.getObjectUseStats(__getBowItem()));
      }
    }
  }
}
项目:EnderZoo    文件:ItemGuardiansBow.java   
public void onPlayerStoppedUsing(ItemStack stack, World worldIn, EntityLivingBase entityLiving, int timeLeft) {

    if (! (entityLiving instanceof EntityPlayer)) {
      return;
    }
    EntityPlayer entityplayer = (EntityPlayer) entityLiving;
    boolean hasInfinateArrows = entityplayer.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantments.INFINITY, stack) > 0;
    ItemStack itemstack = getArrowsToShoot(entityplayer);
    int draw = getMaxItemUseDuration(stack) - timeLeft;
    draw = ForgeEventFactory.onArrowLoose(stack, worldIn, (EntityPlayer) entityLiving, draw, itemstack != null || hasInfinateArrows);
    if (draw < 0){
      return;
    }

    if(itemstack == null && hasInfinateArrows) {
      itemstack = new ItemStack(Items.ARROW);
    }

    if (itemstack == null) {
      return;
    }

    float drawRatio = getArrowVelocity(draw);
    if (drawRatio >= 0.1) {
      boolean arrowIsInfinite = hasInfinateArrows && itemstack.getItem() instanceof ItemArrow;
      if (!worldIn.isRemote) {
        ItemArrow itemarrow = (ItemArrow) ((ItemArrow) (itemstack.getItem() instanceof ItemArrow ? itemstack.getItem() : Items.ARROW));
        EntityArrow entityarrow = itemarrow.createArrow(worldIn, itemstack, entityplayer);
        //TODO: 1.9 Arrows dont fly straight with higher force 
//        entityarrow.func_184547_a(entityplayer, entityplayer.rotationPitch, entityplayer.rotationYaw, 0.0F, drawRatio * 3.0F * forceMultiplier, 1.0F);
        entityarrow.setAim(entityplayer, entityplayer.rotationPitch, entityplayer.rotationYaw, 0.0F, drawRatio * (3.0F + forceMultiplier), 0.25F);
        //entityarrow.setVelocity(x, y, z);


        if (drawRatio == 1.0F) {
          entityarrow.setIsCritical(true);
        }
        int powerLevel = EnchantmentHelper.getEnchantmentLevel(Enchantments.POWER, stack);
        if (powerLevel > 0) {
          entityarrow.setDamage(entityarrow.getDamage() + (double) powerLevel * 0.5D + 0.5D);
        }
        int knockBack = EnchantmentHelper.getEnchantmentLevel(Enchantments.PUNCH, stack);
        if (knockBack > 0) {
          entityarrow.setKnockbackStrength(knockBack);
        }
        if (EnchantmentHelper.getEnchantmentLevel(Enchantments.FLAME, stack) > 0) {
          entityarrow.setFire(100);
        }

        stack.damageItem(1, entityplayer);

        if (arrowIsInfinite) {
          entityarrow.pickupStatus = EntityArrow.PickupStatus.CREATIVE_ONLY;
        }

        entityarrow.setDamage(entityarrow.getDamage() + damageBonus + 20);

        worldIn.spawnEntity(entityarrow);
      }

      worldIn.playSound((EntityPlayer) null, entityplayer.posX, entityplayer.posY, entityplayer.posZ, SoundEvents.ENTITY_ARROW_SHOOT, SoundCategory.NEUTRAL,
          1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + drawRatio * 0.5F);

      if (!arrowIsInfinite) {
        itemstack.shrink(1);
        if (itemstack.isEmpty()) {
          entityplayer.inventory.deleteStack(itemstack);
        }
      }
      entityplayer.addStat(StatList.getObjectUseStats(this));
    }

  }
项目:Battlegear2    文件:QuiverArrowRegistry.java   
@Override
public boolean canFireArrow(ItemStack arrow, World world, EntityPlayer player, float charge) {
    return arrow.getItem() instanceof ItemArrow;
}
项目:Battlegear2    文件:QuiverArrowRegistry.java   
@Override
public EntityArrow getFiredArrow(ItemStack arrow, World world, EntityPlayer player, float charge) {
    return ((ItemArrow)arrow.getItem()).createArrow(world, arrow, player);
}
项目:EnderIO    文件:ItemDarkSteelBow.java   
@Override
public void onPlayerStoppedUsing(@Nonnull ItemStack stack, @Nonnull World worldIn, @Nonnull EntityLivingBase entityLiving, int timeLeft) {

  if (!(entityLiving instanceof EntityPlayer)) {
    return;
  }
  EntityPlayer entityplayer = (EntityPlayer) entityLiving;
  boolean hasInfinateArrows = entityplayer.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantments.INFINITY, stack) > 0;
  ItemStack itemstack = getArrowsToShoot(entityplayer);
  int draw = getMaxItemUseDuration(stack) - timeLeft;
  draw = ForgeEventFactory.onArrowLoose(stack, worldIn, (EntityPlayer) entityLiving, draw, Prep.isValid(itemstack) || hasInfinateArrows);
  if (draw < 0) {
    return;
  }

  if (itemstack.isEmpty() && hasInfinateArrows) {
    itemstack = new ItemStack(Items.ARROW);
  }

  if (itemstack.isEmpty()) {
    return;
  }

  float drawRatio = getCustumArrowVelocity(stack, draw);
  if (drawRatio >= 0.1) {
    boolean arrowIsInfinite = hasInfinateArrows && itemstack.getItem() instanceof ItemArrow;
    if (!worldIn.isRemote) {

      EnergyUpgradeHolder upgrade = EnergyUpgradeManager.loadFromItem(stack);

      ItemArrow itemarrow = ((ItemArrow) (itemstack.getItem() instanceof ItemArrow ? itemstack.getItem() : Items.ARROW));
      EntityArrow entityarrow = itemarrow.createArrow(worldIn, itemstack, entityplayer);
      entityarrow.setAim(entityplayer, entityplayer.rotationPitch, entityplayer.rotationYaw, 0.0F, drawRatio * 3.0F * getForceMultiplier(upgrade), 0.25F);

      if (drawRatio == 1.0F) {
        entityarrow.setIsCritical(true);
      }
      int powerLevel = EnchantmentHelper.getEnchantmentLevel(Enchantments.POWER, stack);
      if (powerLevel > 0) {
        entityarrow.setDamage(entityarrow.getDamage() + powerLevel * 0.5D + 0.5D);
      }
      int knockBack = EnchantmentHelper.getEnchantmentLevel(Enchantments.PUNCH, stack);
      if (knockBack > 0) {
        entityarrow.setKnockbackStrength(knockBack);
      }
      if (EnchantmentHelper.getEnchantmentLevel(Enchantments.FLAME, stack) > 0) {
        entityarrow.setFire(100);
      }

      stack.damageItem(1, entityplayer);

      if (arrowIsInfinite) {
        entityarrow.pickupStatus = EntityArrow.PickupStatus.CREATIVE_ONLY;
      }

      entityarrow.setDamage(entityarrow.getDamage() + damageBonus);

      worldIn.spawnEntity(entityarrow);

      int used = getRequiredPower(draw, upgrade);
      if (used > 0) {
        upgrade.setEnergy(upgrade.getEnergy() - used);
        upgrade.writeToItem(stack);
      }

    }

    worldIn.playSound((EntityPlayer) null, entityplayer.posX, entityplayer.posY, entityplayer.posZ, SoundEvents.ENTITY_ARROW_SHOOT, SoundCategory.NEUTRAL,
        1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + drawRatio * 0.5F);

    if (!arrowIsInfinite) {
      itemstack.shrink(1);
    }
    supressed(entityplayer);
  }

}