2022-03-05 21:45:57 +01:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Jake Potrebic <jake.m.potrebic@gmail.com>
|
|
|
|
Date: Sat, 19 Feb 2022 19:05:59 -0800
|
|
|
|
Subject: [PATCH] Fix cancelling ProjectileHitEvent for piercing arrows
|
|
|
|
|
|
|
|
Piercing arrows search for multiple entities inside a while
|
|
|
|
loop that is checking the projectile entity's removed state.
|
|
|
|
If the hit event is cancelled on the first entity, the event will
|
|
|
|
be called over and over again inside that while loop until the event
|
|
|
|
is not cancelled. The solution here, is to make use of an
|
|
|
|
already-existing field on AbstractArrow for tracking entities hit by
|
|
|
|
piercing arrows to avoid duplicate damage being applied.
|
|
|
|
|
2022-11-20 00:53:20 +01:00
|
|
|
== AT ==
|
|
|
|
protected net.minecraft.world.entity.projectile.Projectile hitCancelled
|
|
|
|
|
2022-03-05 21:45:57 +01:00
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
|
2024-04-24 22:05:42 +02:00
|
|
|
index 8e8258333e181491b2d5b61ebdb80de36e8179a9..2df84bc367f650c3d468e0f09ed565e68de43a82 100644
|
2022-03-05 21:45:57 +01:00
|
|
|
--- a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
|
2024-04-24 22:05:42 +02:00
|
|
|
@@ -305,10 +305,18 @@ public abstract class AbstractArrow extends Projectile {
|
2022-03-05 21:45:57 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-01-18 18:52:00 +01:00
|
|
|
+ // Paper start - Fix cancelling ProjectileHitEvent for piercing arrows
|
2024-04-24 22:05:42 +02:00
|
|
|
@Override
|
|
|
|
- protected double getDefaultGravity() {
|
|
|
|
- return 0.05D;
|
|
|
|
+ public ProjectileDeflection preHitTargetOrDeflectSelf(HitResult hitResult) {
|
2022-03-05 21:45:57 +01:00
|
|
|
+ if (hitResult instanceof EntityHitResult entityHitResult && this.hitCancelled && this.getPierceLevel() > 0) {
|
|
|
|
+ if (this.piercingIgnoreEntityIds == null) {
|
|
|
|
+ this.piercingIgnoreEntityIds = new IntOpenHashSet(5);
|
|
|
|
+ }
|
|
|
|
+ this.piercingIgnoreEntityIds.add(entityHitResult.getEntity().getId());
|
|
|
|
+ }
|
2024-04-24 22:05:42 +02:00
|
|
|
+ super.preHitTargetOrDeflectSelf(hitResult);
|
|
|
|
}
|
2024-01-18 18:52:00 +01:00
|
|
|
+ // Paper end - Fix cancelling ProjectileHitEvent for piercing arrows
|
2024-04-24 22:05:42 +02:00
|
|
|
|
2022-03-05 21:45:57 +01:00
|
|
|
private boolean shouldFall() {
|
2023-06-08 10:08:08 +02:00
|
|
|
return this.inGround && this.level().noCollision((new AABB(this.position(), this.position())).inflate(0.06D));
|