mirror of
https://github.com/PaperMC/Paper.git
synced 2024-11-30 04:02:50 +01:00
90fe0d58a5
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 897a0a23 SPIGOT-5753: Back PotionType by a minecraft registry 255b2aa1 SPIGOT-7080: Add World#locateNearestBiome ff984826 Remove javadoc.io doc links CraftBukkit Changes: 71b0135cc SPIGOT-5753: Back PotionType by a minecraft registry a6bcb8489 SPIGOT-7080: Add World#locateNearestBiome ad0e57434 SPIGOT-7502: CraftMetaItem - cannot deserialize BlockStateTag b3efca57a SPIGOT-6400: Use Mockito instead of InvocationHandler 38c599f9d PR-1272: Only allow one entity in CraftItem instead of two f065271ac SPIGOT-7498: ChunkSnapshot.getBlockEmittedLight() gets 64 blocks upper in Overworld Spigot Changes: e0e223fe Remove javadoc.io doc links
85 lines
4.3 KiB
Diff
85 lines
4.3 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Jake Potrebic <jake.m.potrebic@gmail.com>
|
|
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 <50800980+Warriorrrr@users.noreply.github.com>
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
|
|
index 7fae13799800478f6244eaaeed59956494b3323b..2ec75c46f53331442d79ef30b7f8acb317f0143b 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 2c376687349825833e6d9a5ca92ce6afb98c36a3..0f7ae4a5c672039828454bf18c770dd99e250212 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
|
|
return this.getHandle().projectileSource;
|
|
}
|
|
|