From 1074237311360e6145e69e47797657ff079bc9bf Mon Sep 17 00:00:00 2001
From: TonytheMacaroni <tonythemacaroni123@gmail.com>
Date: Fri, 2 May 2025 16:05:50 -0400
Subject: [PATCH] Pass correct draw strength for EntityShootBowEvent (#12308)

---
 .../world/entity/monster/AbstractSkeleton.java.patch  |  2 +-
 .../world/entity/monster/Illusioner.java.patch        |  2 +-
 .../net/minecraft/world/item/BowItem.java.patch       | 11 +++++++++++
 .../net/minecraft/world/item/CrossbowItem.java.patch  |  9 +++++++++
 .../world/item/ProjectileWeaponItem.java.patch        | 10 +++++++++-
 5 files changed, 31 insertions(+), 3 deletions(-)
 create mode 100644 paper-server/patches/sources/net/minecraft/world/item/BowItem.java.patch

diff --git a/paper-server/patches/sources/net/minecraft/world/entity/monster/AbstractSkeleton.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/monster/AbstractSkeleton.java.patch
index 6850604196..f90f7c5153 100644
--- a/paper-server/patches/sources/net/minecraft/world/entity/monster/AbstractSkeleton.java.patch
+++ b/paper-server/patches/sources/net/minecraft/world/entity/monster/AbstractSkeleton.java.patch
@@ -48,7 +48,7 @@
          double squareRoot = Math.sqrt(d * d + d2 * d2);
          if (this.level() instanceof ServerLevel serverLevel) {
 +            // CraftBukkit start
-+            org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(this, this.getMainHandItem(), arrow.getPickupItem(), arrow, net.minecraft.world.InteractionHand.MAIN_HAND, 0.8F, true); // Paper - improve entity shoot bow event, add arrow stack to event
++            org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(this, this.getMainHandItem(), arrow.getPickupItem(), arrow, net.minecraft.world.InteractionHand.MAIN_HAND, distanceFactor, true); // Paper - improve entity shoot bow event, add arrow stack to event
 +            if (event.isCancelled()) {
 +                event.getProjectile().remove();
 +                return;
diff --git a/paper-server/patches/sources/net/minecraft/world/entity/monster/Illusioner.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/monster/Illusioner.java.patch
index 288baed666..fd0641de07 100644
--- a/paper-server/patches/sources/net/minecraft/world/entity/monster/Illusioner.java.patch
+++ b/paper-server/patches/sources/net/minecraft/world/entity/monster/Illusioner.java.patch
@@ -5,7 +5,7 @@
          double squareRoot = Math.sqrt(d * d + d2 * d2);
          if (this.level() instanceof ServerLevel serverLevel) {
 +            // Paper start - EntityShootBowEvent
-+            org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(this, this.getMainHandItem(), mobArrow.getPickupItem(), mobArrow, target.getUsedItemHand(), 0.8F, true);
++            org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(this, this.getMainHandItem(), mobArrow.getPickupItem(), mobArrow, target.getUsedItemHand(), distanceFactor, true);
 +            if (event.isCancelled()) {
 +                event.getProjectile().remove();
 +                return;
diff --git a/paper-server/patches/sources/net/minecraft/world/item/BowItem.java.patch b/paper-server/patches/sources/net/minecraft/world/item/BowItem.java.patch
new file mode 100644
index 0000000000..52bde9e226
--- /dev/null
+++ b/paper-server/patches/sources/net/minecraft/world/item/BowItem.java.patch
@@ -0,0 +1,11 @@
+--- a/net/minecraft/world/item/BowItem.java
++++ b/net/minecraft/world/item/BowItem.java
+@@ -38,7 +_,7 @@
+                 } else {
+                     List<ItemStack> list = draw(stack, projectile, player);
+                     if (level instanceof ServerLevel serverLevel && !list.isEmpty()) {
+-                        this.shoot(serverLevel, player, player.getUsedItemHand(), stack, list, powerForTime * 3.0F, 1.0F, powerForTime == 1.0F, null);
++                        this.shoot(serverLevel, player, player.getUsedItemHand(), stack, list, powerForTime * 3.0F, 1.0F, powerForTime == 1.0F, null, powerForTime); // Paper - Pass draw strength
+                     }
+ 
+                     level.playSound(
diff --git a/paper-server/patches/sources/net/minecraft/world/item/CrossbowItem.java.patch b/paper-server/patches/sources/net/minecraft/world/item/CrossbowItem.java.patch
index ef4344e7f7..b6ba21e11a 100644
--- a/paper-server/patches/sources/net/minecraft/world/item/CrossbowItem.java.patch
+++ b/paper-server/patches/sources/net/minecraft/world/item/CrossbowItem.java.patch
@@ -30,6 +30,15 @@
          } else {
              Projectile projectile = super.createProjectile(level, shooter, weapon, ammo, isCrit);
              if (projectile instanceof AbstractArrow abstractArrow) {
+@@ -163,7 +_,7 @@
+         if (level instanceof ServerLevel serverLevel) {
+             ChargedProjectiles chargedProjectiles = weapon.set(DataComponents.CHARGED_PROJECTILES, ChargedProjectiles.EMPTY);
+             if (chargedProjectiles != null && !chargedProjectiles.isEmpty()) {
+-                this.shoot(serverLevel, shooter, hand, weapon, chargedProjectiles.getItems(), velocity, inaccuracy, shooter instanceof Player, target);
++                this.shoot(serverLevel, shooter, hand, weapon, chargedProjectiles.getItems(), velocity, inaccuracy, shooter instanceof Player, target, 1); // Paper - Pass draw strength
+                 if (shooter instanceof ServerPlayer serverPlayer) {
+                     CriteriaTriggers.SHOT_CROSSBOW.trigger(serverPlayer, weapon);
+                     serverPlayer.awardStat(Stats.ITEM_USED.get(weapon.getItem()));
 @@ -211,7 +_,14 @@
                      );
              }
diff --git a/paper-server/patches/sources/net/minecraft/world/item/ProjectileWeaponItem.java.patch b/paper-server/patches/sources/net/minecraft/world/item/ProjectileWeaponItem.java.patch
index 012015c267..f0a6f1e7db 100644
--- a/paper-server/patches/sources/net/minecraft/world/item/ProjectileWeaponItem.java.patch
+++ b/paper-server/patches/sources/net/minecraft/world/item/ProjectileWeaponItem.java.patch
@@ -1,5 +1,13 @@
 --- 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 +_,29 @@
                  float f4 = f2 + f3 * ((i + 1) / 2) * f1;
                  f3 = -f3;
@@ -14,7 +22,7 @@
 +                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, velocity, true);
++                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;