Pass correct draw strength for EntityShootBowEvent (#12308)

This commit is contained in:
TonytheMacaroni 2025-05-02 16:05:50 -04:00 committed by GitHub
parent d637ae85dd
commit 1074237311
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 31 additions and 3 deletions

View File

@ -48,7 +48,7 @@
double squareRoot = Math.sqrt(d * d + d2 * d2); double squareRoot = Math.sqrt(d * d + d2 * d2);
if (this.level() instanceof ServerLevel serverLevel) { if (this.level() instanceof ServerLevel serverLevel) {
+ // CraftBukkit start + // 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()) { + if (event.isCancelled()) {
+ event.getProjectile().remove(); + event.getProjectile().remove();
+ return; + return;

View File

@ -5,7 +5,7 @@
double squareRoot = Math.sqrt(d * d + d2 * d2); double squareRoot = Math.sqrt(d * d + d2 * d2);
if (this.level() instanceof ServerLevel serverLevel) { if (this.level() instanceof ServerLevel serverLevel) {
+ // Paper start - EntityShootBowEvent + // 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()) { + if (event.isCancelled()) {
+ event.getProjectile().remove(); + event.getProjectile().remove();
+ return; + return;

View File

@ -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(

View File

@ -30,6 +30,15 @@
} else { } else {
Projectile projectile = super.createProjectile(level, shooter, weapon, ammo, isCrit); Projectile projectile = super.createProjectile(level, shooter, weapon, ammo, isCrit);
if (projectile instanceof AbstractArrow abstractArrow) { 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 @@ @@ -211,7 +_,14 @@
); );
} }

View File

@ -1,5 +1,13 @@
--- a/net/minecraft/world/item/ProjectileWeaponItem.java --- a/net/minecraft/world/item/ProjectileWeaponItem.java
+++ b/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 @@ @@ -62,12 +_,29 @@
float f4 = f2 + f3 * ((i + 1) / 2) * f1; float f4 = f2 + f3 * ((i + 1) / 2) * f1;
f3 = -f3; f3 = -f3;
@ -14,7 +22,7 @@
+ Projectile projectile = this.createProjectile(level, shooter, weapon, itemStack, isCrit); + Projectile projectile = this.createProjectile(level, shooter, weapon, itemStack, isCrit);
+ this.shootProjectile(shooter, projectile, i1, velocity, inaccuracy, f4, target); + 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()) { + if (event.isCancelled()) {
+ event.getProjectile().remove(); + event.getProjectile().remove();
+ return; + return;