@Override public void onPlayerStoppedUsing(ItemStack stack, World world, EntityPlayer player, int itemUse) { int draw = this.getMaxItemUseDuration(stack) - itemUse; ArrowLooseEvent event = new ArrowLooseEvent(player, stack, draw); MinecraftForge.EVENT_BUS.post(event); if (event.isCanceled()) { return; } draw = event.charge; boolean flag = player.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, stack) > 0; if (flag || player.inventory.hasItem(Items.arrow)) { boolean empowered = isEmpowered(stack); float f = draw / 20.0F; f = (f * f + f * 2.0F) / 3.0F; if (f > 1.0F) { f = 1.0F; } else if (f < 0.1F) { return; } EntityArrow arrow = new EntityArrow(world, player, f * arrowSpeedMultiplier * (empowered ? 1.0F : 1.25F)); double damage = arrow.getDamage() * arrowDamageMultiplier * (empowered ? 1.0F : 1.25F); arrow.setDamage(damage); if (f == 1.0F) { arrow.setIsCritical(true); } int k = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, stack); if (k > 0) { if (empowered) { k++; } arrow.setDamage(arrow.getDamage() + k * 0.5D + 0.5D); } int l = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, stack); if (l > 0) { if (empowered) { l++; } arrow.setKnockbackStrength(l); } if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, stack) > 0) { arrow.setFire(100); } world.playSoundAtEntity( player, "random.bow", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + f * 0.5F); if (flag) { arrow.canBePickedUp = 2; } else { player.inventory.consumeInventoryItem(Items.arrow); } if (ServerHelper.isServerWorld(world)) { world.spawnEntityInWorld(arrow); } if (!player.capabilities.isCreativeMode) { useEnergy(stack); } } }