diff options
author | Spottedleaf <[email protected]> | 2023-09-22 15:33:14 -0700 |
---|---|---|
committer | Spottedleaf <[email protected]> | 2023-09-22 15:33:14 -0700 |
commit | ea01aa335a46dd38e8f240f56ed7f5a6a3f7f625 (patch) | |
tree | 7d41c2c843579dcf75db5faf28b602cc9a313cb9 /patches/server/0944-Refresh-ProjectileSource-for-projectiles.patch | |
parent | e88856dd75de742fa10099af4fe06a07500b34fd (diff) | |
download | Paper-ea01aa335a46dd38e8f240f56ed7f5a6a3f7f625.tar.gz Paper-ea01aa335a46dd38e8f240f56ed7f5a6a3f7f625.zip |
Add some patches, fix compile
Diffstat (limited to 'patches/server/0944-Refresh-ProjectileSource-for-projectiles.patch')
-rw-r--r-- | patches/server/0944-Refresh-ProjectileSource-for-projectiles.patch | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/patches/server/0944-Refresh-ProjectileSource-for-projectiles.patch b/patches/server/0944-Refresh-ProjectileSource-for-projectiles.patch new file mode 100644 index 0000000000..9ad3bf103e --- /dev/null +++ b/patches/server/0944-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 01bbce773adc1a4c1720a43250de825d83a89da4..768e243c44ed3c95339efa46827a81f0a679250d 100644 +--- a/src/main/java/net/minecraft/world/entity/Entity.java ++++ b/src/main/java/net/minecraft/world/entity/Entity.java +@@ -381,6 +381,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 6d7ac0c8c171834fa8da94f158258a4774d80ec4..a90317100d32974e481e14476843f66997a2cf3a 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,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 - Fix null owners not being handled ++ else { ++ this.ownerUUID = null; ++ this.cachedOwner = null; ++ this.projectileSource = null; ++ } ++ // Paper end ++ 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 +89,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; + } + |