geforkt von Mirrors/Paper
2873869bb1
Signs no longer have a specific isEdiable state, the entire API in this regard needs updating/deprecation. The boolean field is completely gone, replaced by a uuid (which will need a new setEditingPlayer(UUID) method on the Sign interface), and the current upstream implementation of setEdiable simply flips the is_waxed state. This patch is hence not needed as it neither allows editing (which will be redone in a later patch) nor is required to copy the is_waxed boolean flag as it lives in the signs compound tag and is covered by applyTo.
41 Zeilen
1.9 KiB
Diff
41 Zeilen
1.9 KiB
Diff
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.
|
|
|
|
== AT ==
|
|
protected net.minecraft.world.entity.projectile.Projectile hitCancelled
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
|
|
index 372b9ec0c8eddf4a01b4b8203a88401db22affbf..7226be19248a1ffb8ff2c89b55882529d33a6c0c 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
|
|
@@ -290,6 +290,19 @@ public abstract class AbstractArrow extends Projectile {
|
|
}
|
|
}
|
|
|
|
+ // Paper start
|
|
+ @Override
|
|
+ public void preOnHit(HitResult hitResult) {
|
|
+ super.preOnHit(hitResult);
|
|
+ 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());
|
|
+ }
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
private boolean shouldFall() {
|
|
return this.inGround && this.level().noCollision((new AABB(this.position(), this.position())).inflate(0.06D));
|
|
}
|