From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jake Potrebic 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. diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java index df316ca580a0a3b4ba6b658f7d7bdf542f4ad85b..280ee1838106201f5e3ba7753caced6d030f7e55 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -378,6 +378,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { public boolean valid; public boolean generation; public int maxAirTicks = this.getDefaultMaxAirSupply(); // CraftBukkit - SPIGOT-6907: re-implement LivingEntity#setMaximumAir() + @Nullable // Paper 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 8b2a3a8482018b7db7de81bc295862f783e17ce5..a211ca048dddc75afce1f83ee1700bad66e457fc 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java +++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java @@ -49,14 +49,24 @@ 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 - + this.refreshProjectileSource(false); // Paper + } + // Paper start + 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 @Nullable @Override public Entity getOwner() { if (this.cachedOwner != null && !this.cachedOwner.isRemoved()) { + this.refreshProjectileSource(false); // Paper return this.cachedOwner; } else if (this.ownerUUID != null && this.level instanceof ServerLevel) { this.cachedOwner = ((ServerLevel) this.level).getEntity(this.ownerUUID); @@ -72,6 +82,7 @@ public abstract class Projectile extends Entity implements TraceableEntity { } } // Paper end + this.refreshProjectileSource(false); // Paper return this.cachedOwner; } else { return null; diff --git a/src/main/java/org/bukkit/craftbukkit/entity/AbstractProjectile.java b/src/main/java/org/bukkit/craftbukkit/entity/AbstractProjectile.java index b3814bd6c6d6aae090fe417696535ed1376d84d5..5e82b2d57833fea1adb342f5c8d25f55491945cb 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/AbstractProjectile.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/AbstractProjectile.java @@ -64,6 +64,7 @@ public abstract class AbstractProjectile extends CraftEntity implements Projecti @Override public final org.bukkit.projectiles.ProjectileSource getShooter() { + this.getHandle().refreshProjectileSource(true); // Paper return this.getHandle().projectileSource; }