--- a/net/minecraft/world/item/ProjectileWeaponItem.java
+++ b/net/minecraft/world/item/ProjectileWeaponItem.java
@@ -50,6 +_,7 @@
         float inaccuracy,
         boolean isCrit,
         @Nullable LivingEntity target
+        ,float drawStrength // Paper - Pass draw strength
     ) {
         float f = EnchantmentHelper.processProjectileSpread(level, weapon, shooter, 0.0F);
         float f1 = projectileItems.size() == 1 ? 0.0F : 2.0F * f / (projectileItems.size() - 1);
@@ -62,12 +_,26 @@
                 float f4 = f2 + f3 * ((i + 1) / 2) * f1;
                 f3 = -f3;
                 int i1 = i;
-                Projectile.spawnProjectile(
-                    this.createProjectile(level, shooter, weapon, itemStack, isCrit),
-                    level,
-                    itemStack,
-                    projectile -> this.shootProjectile(shooter, projectile, i1, velocity, inaccuracy, f4, target)
-                );
+                // CraftBukkit start
+                Projectile projectile = this.createProjectile(level, shooter, weapon, itemStack, isCrit);
+                this.shootProjectile(shooter, projectile, i1, velocity, inaccuracy, f4, target);
+
+                org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(shooter, weapon, itemStack, projectile, hand, drawStrength, true);
+                if (event.isCancelled()) {
+                    event.getProjectile().remove();
+                    return;
+                }
+
+                if (event.getProjectile() == projectile.getBukkitEntity()) {
+                    if (Projectile.spawnProjectile(
+                        projectile,
+                        level,
+                        itemStack
+                    ).isRemoved()) {
+                        return;
+                    }
+                }
+                // CraftBukkit end
                 weapon.hurtAndBreak(this.getDurabilityUse(itemStack), shooter, LivingEntity.getSlotForHand(hand));
                 if (weapon.isEmpty()) {
                     break;
@@ -95,6 +_,11 @@
     }
 
     protected static List<ItemStack> draw(ItemStack weapon, ItemStack ammo, LivingEntity shooter) {
+        // Paper start
+        return draw(weapon, ammo, shooter, true);
+    }
+    protected static List<ItemStack> draw(ItemStack weapon, ItemStack ammo, LivingEntity shooter, boolean consume) {
+        // Paper end
         if (ammo.isEmpty()) {
             return List.of();
         } else {
@@ -103,7 +_,7 @@
             ItemStack itemStack = ammo.copy();
 
             for (int i1 = 0; i1 < i; i1++) {
-                ItemStack itemStack1 = useAmmo(weapon, i1 == 0 ? ammo : itemStack, shooter, i1 > 0);
+                ItemStack itemStack1 = useAmmo(weapon, i1 == 0 ? ammo : itemStack, shooter, i1 > 0 || !consume); // Paper
                 if (!itemStack1.isEmpty()) {
                     list.add(itemStack1);
                 }
