Paper/patches/server/1005-Fix-PickupStatus-getting-reset.patch
Jason Penilla 580a610550
Allow using old ender pearl behavior & apply ender pearl exploit patch (#11524)
When enabled, ender pearls will not load chunks and will save to the world instead of the player.

Also changes the exploit config to be default false, as it only makes sense when legacy behavior is enabled.
2024-10-30 18:09:05 +01:00

66 lines
3.4 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Tamion <70228790+notTamion@users.noreply.github.com>
Date: Sun, 21 Jul 2024 19:11:22 +0200
Subject: [PATCH] Fix PickupStatus getting reset
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 14e31ae88e90d8ea1a98800cc6c1c3527bb2ed6b..accc246f441c8bf5e1a755cfc0db8f97c0c01c6b 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
@@ -714,7 +714,14 @@ public abstract class AbstractArrow extends Projectile {
@Override
public void setOwner(@Nullable Entity entity) {
+ // Paper start - Fix PickupStatus getting reset
+ this.setOwner(entity, true);
+ }
+
+ public void setOwner(@Nullable Entity entity, boolean resetPickup) {
+ // Paper end - Fix PickupStatus getting reset
super.setOwner(entity);
+ if (!resetPickup) return; // Paper - Fix PickupStatus getting reset
Entity entity1 = entity;
byte b0 = 0;
diff --git a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
index 52d539d54113c4dcd2d8d748ae0abf6dec5bfc72..bf2e79c50092acd13e97ab6e32471a9c527a524e 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
@@ -353,7 +353,13 @@ public abstract class Projectile extends Entity implements TraceableEntity {
public boolean deflect(ProjectileDeflection deflection, @Nullable Entity deflector, @Nullable Entity owner, boolean fromAttack) {
deflection.deflect(this, deflector, this.random);
if (!this.level().isClientSide) {
- this.setOwner(owner);
+ // Paper start - Fix PickupStatus getting reset
+ if (this instanceof AbstractArrow arrow) {
+ arrow.setOwner(owner, false);
+ } else {
+ this.setOwner(owner);
+ }
+ // Paper end - Fix PickupStatus getting reset
this.onDeflection(deflector, fromAttack);
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractArrow.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractArrow.java
index 1f30109abd86b76af343eb5eb75ec3db83ef9417..d0c30fd12aa9866900fe72b97d10c257479cf010 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractArrow.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractArrow.java
@@ -173,4 +173,16 @@ public class CraftAbstractArrow extends AbstractProjectile implements AbstractAr
this.getHandle().setSoundEvent(org.bukkit.craftbukkit.CraftSound.bukkitToMinecraft(sound));
}
// Paper end
+
+ // Paper start - Fix PickupStatus getting reset - Copy of CraftProjectile#setShooter, calling setOwner(Entity,boolean)
+ @Override
+ public void setShooter(org.bukkit.projectiles.ProjectileSource shooter, boolean resetPickupStatus) {
+ if (shooter instanceof CraftEntity craftEntity) {
+ this.getHandle().setOwner(craftEntity.getHandle(), resetPickupStatus);
+ } else {
+ this.getHandle().setOwner(null, resetPickupStatus);
+ }
+ this.getHandle().projectileSource = shooter;
+ }
+ // Paper end - Fix PickupStatus getting reset
}