aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0823-Refresh-ProjectileSource-for-projectiles.patch
diff options
context:
space:
mode:
authorJakub Zacek <[email protected]>2024-07-15 23:35:51 +0200
committerGitHub <[email protected]>2024-07-15 17:35:51 -0400
commit2cd8c461af74f0a524878dcdffba86cd105c48c6 (patch)
treeac107a76fe3d6cdd2e6ef5804ef3cba152957e4c /patches/server/0823-Refresh-ProjectileSource-for-projectiles.patch
parentb57b24d549c65ddc5eb3edcc1ecc6aad2826dbd8 (diff)
downloadPaper-2cd8c461af74f0a524878dcdffba86cd105c48c6.tar.gz
Paper-2cd8c461af74f0a524878dcdffba86cd105c48c6.zip
Add OMINOUS_ITEM_SPAWNER SpawnReason (#10897)
Diffstat (limited to 'patches/server/0823-Refresh-ProjectileSource-for-projectiles.patch')
-rw-r--r--patches/server/0823-Refresh-ProjectileSource-for-projectiles.patch85
1 files changed, 85 insertions, 0 deletions
diff --git a/patches/server/0823-Refresh-ProjectileSource-for-projectiles.patch b/patches/server/0823-Refresh-ProjectileSource-for-projectiles.patch
new file mode 100644
index 0000000000..7388f355f9
--- /dev/null
+++ b/patches/server/0823-Refresh-ProjectileSource-for-projectiles.patch
@@ -0,0 +1,85 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Jake Potrebic <[email protected]>
+Date: Tue, 30 May 2023 12:59:10 -0700
+Subject: [PATCH] Refresh ProjectileSource for projectiles
+
+Makes sure the value returned by Projectile#getShooter in
+the API matches the owner UUID specified in the entity nbt.
+Previously, after the entity reloaded, Projectile#getShooter
+would return null, while the entity still had an owner.
+
+Also fixes setting the shooter/owner to null actually
+clearing the owner.
+
+Co-authored-by: Warrior <[email protected]>
+
+diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
+index 011a869c2eac551fe15fca34eee11ff928af52e2..fa32b32fb5e6b546cb73b43e59db408404797cb5 100644
+--- a/src/main/java/net/minecraft/world/entity/Entity.java
++++ b/src/main/java/net/minecraft/world/entity/Entity.java
+@@ -391,6 +391,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
+ public boolean inWorld = false;
+ public boolean generation;
+ public int maxAirTicks = this.getDefaultMaxAirSupply(); // CraftBukkit - SPIGOT-6907: re-implement LivingEntity#setMaximumAir()
++ @Nullable // Paper - Refresh ProjectileSource for projectiles
+ public org.bukkit.projectiles.ProjectileSource projectileSource; // For projectiles only
+ public boolean lastDamageCancelled; // SPIGOT-5339, SPIGOT-6252, SPIGOT-6777: Keep track if the event was canceled
+ public boolean persistentInvisibility = false;
+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 d147f3cc1af28c384005c1c20e37bb588588c88d..5f7d152f41eb85f17bcded4bc8099b998e5a338b 100644
+--- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
++++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
+@@ -57,14 +57,31 @@ public abstract class Projectile extends Entity implements TraceableEntity {
+ this.ownerUUID = entity.getUUID();
+ this.cachedOwner = entity;
+ }
+- this.projectileSource = (entity != null && entity.getBukkitEntity() instanceof ProjectileSource) ? (ProjectileSource) entity.getBukkitEntity() : null; // CraftBukkit
+-
++ // Paper start - Refresh ProjectileSource for projectiles
++ else {
++ this.ownerUUID = null;
++ this.cachedOwner = null;
++ this.projectileSource = null;
++ }
++ // Paper end - Refresh ProjectileSource for projectiles
++ this.refreshProjectileSource(false); // Paper
++ }
++ // Paper start - Refresh ProjectileSource for projectiles
++ public void refreshProjectileSource(boolean fillCache) {
++ if (fillCache) {
++ this.getOwner();
++ }
++ if (this.cachedOwner != null && !this.cachedOwner.isRemoved() && this.projectileSource == null && this.cachedOwner.getBukkitEntity() instanceof ProjectileSource projSource) {
++ this.projectileSource = projSource;
++ }
+ }
++ // Paper end - Refresh ProjectileSource for projectiles
+
+ @Nullable
+ @Override
+ public Entity getOwner() {
+ if (this.cachedOwner != null && !this.cachedOwner.isRemoved()) {
++ this.refreshProjectileSource(false); // Paper - Refresh ProjectileSource for projectiles
+ return this.cachedOwner;
+ } else {
+ if (this.ownerUUID != null) {
+@@ -74,6 +91,7 @@ public abstract class Projectile extends Entity implements TraceableEntity {
+ ServerLevel worldserver = (ServerLevel) world;
+
+ this.cachedOwner = worldserver.getEntity(this.ownerUUID);
++ this.refreshProjectileSource(false); // Paper - Refresh ProjectileSource for projectiles
+ return this.cachedOwner;
+ }
+ }
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/AbstractProjectile.java b/src/main/java/org/bukkit/craftbukkit/entity/AbstractProjectile.java
+index de4fb2654c7895cfd83ad694455ee56cb708c2f2..591af9d0d2fdc9953415979fc97a4a00afd85885 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/AbstractProjectile.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/AbstractProjectile.java
+@@ -60,6 +60,7 @@ public abstract class AbstractProjectile extends CraftEntity implements Projecti
+
+ @Override
+ public final org.bukkit.projectiles.ProjectileSource getShooter() {
++ this.getHandle().refreshProjectileSource(true); // Paper - Refresh ProjectileSource for projectiles
+ return this.getHandle().projectileSource;
+ }
+