geforkt von Mirrors/Paper
bffb08c2f9
The Paper method was chosen for deprecation because it was more restrictive in that it has an isGliding check.
86 Zeilen
4.3 KiB
Diff
86 Zeilen
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 11a4d679c5b46f52eeb51b844f240a835027216a..f37790f7f461da9ecdbd1e83d7ac7832bc5c5eda 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/Entity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
|
|
@@ -382,6 +382,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;
|
|
}
|
|
|