2023-06-01 04:43:51 +02:00
|
|
|
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.
|
|
|
|
|
2023-09-16 23:37:38 +02:00
|
|
|
Also fixes setting the shooter/owner to null actually
|
|
|
|
clearing the owner.
|
|
|
|
|
|
|
|
Co-authored-by: Warrior <50800980+Warriorrrr@users.noreply.github.com>
|
|
|
|
|
2023-06-01 04:43:51 +02:00
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
|
2024-04-25 00:36:49 +02:00
|
|
|
index 09defe4a20c7b0794cba358c177e787f1c0273c1..b2e2bd4d7e3b373a92d3a4a13446f27fbf652c0a 100644
|
2023-06-01 04:43:51 +02:00
|
|
|
--- a/src/main/java/net/minecraft/world/entity/Entity.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
|
2024-04-25 00:36:49 +02:00
|
|
|
@@ -386,6 +386,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
2023-12-06 17:21:56 +01:00
|
|
|
public boolean inWorld = false;
|
2023-06-01 04:43:51 +02:00
|
|
|
public boolean generation;
|
|
|
|
public int maxAirTicks = this.getDefaultMaxAirSupply(); // CraftBukkit - SPIGOT-6907: re-implement LivingEntity#setMaximumAir()
|
2024-01-15 12:38:39 +01:00
|
|
|
+ @Nullable // Paper - Refresh ProjectileSource for projectiles
|
2023-06-01 04:43:51 +02:00
|
|
|
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
|
2024-04-25 00:36:49 +02:00
|
|
|
index 734e00caf72a694654319f69f793dcbf616f1784..64f7ae4d9e37daf2d48231f44f686008953ad39b 100644
|
2023-06-01 04:43:51 +02:00
|
|
|
--- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
|
2024-04-25 00:36:49 +02:00
|
|
|
@@ -51,14 +51,31 @@ public abstract class Projectile extends Entity implements TraceableEntity {
|
2023-06-01 04:43:51 +02:00
|
|
|
this.ownerUUID = entity.getUUID();
|
|
|
|
this.cachedOwner = entity;
|
|
|
|
}
|
|
|
|
- this.projectileSource = (entity != null && entity.getBukkitEntity() instanceof ProjectileSource) ? (ProjectileSource) entity.getBukkitEntity() : null; // CraftBukkit
|
|
|
|
-
|
2024-01-15 12:38:39 +01:00
|
|
|
+ // Paper start - Refresh ProjectileSource for projectiles
|
2023-09-16 23:37:38 +02:00
|
|
|
+ else {
|
|
|
|
+ this.ownerUUID = null;
|
|
|
|
+ this.cachedOwner = null;
|
|
|
|
+ this.projectileSource = null;
|
|
|
|
+ }
|
2024-01-15 12:38:39 +01:00
|
|
|
+ // Paper end - Refresh ProjectileSource for projectiles
|
2023-06-01 04:43:51 +02:00
|
|
|
+ this.refreshProjectileSource(false); // Paper
|
|
|
|
+ }
|
2024-01-15 12:38:39 +01:00
|
|
|
+ // Paper start - Refresh ProjectileSource for projectiles
|
2023-06-01 04:43:51 +02:00
|
|
|
+ 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;
|
|
|
|
+ }
|
|
|
|
}
|
2024-01-15 12:38:39 +01:00
|
|
|
+ // Paper end - Refresh ProjectileSource for projectiles
|
2023-06-01 04:43:51 +02:00
|
|
|
|
|
|
|
@Nullable
|
|
|
|
@Override
|
|
|
|
public Entity getOwner() {
|
|
|
|
if (this.cachedOwner != null && !this.cachedOwner.isRemoved()) {
|
2024-01-15 12:38:39 +01:00
|
|
|
+ this.refreshProjectileSource(false); // Paper - Refresh ProjectileSource for projectiles
|
2023-06-01 04:43:51 +02:00
|
|
|
return this.cachedOwner;
|
2023-12-06 17:21:56 +01:00
|
|
|
} else {
|
|
|
|
if (this.ownerUUID != null) {
|
2024-04-25 00:36:49 +02:00
|
|
|
@@ -68,6 +85,7 @@ public abstract class Projectile extends Entity implements TraceableEntity {
|
2023-12-06 21:09:14 +01:00
|
|
|
ServerLevel worldserver = (ServerLevel) world;
|
|
|
|
|
|
|
|
this.cachedOwner = worldserver.getEntity(this.ownerUUID);
|
2024-01-15 12:38:39 +01:00
|
|
|
+ this.refreshProjectileSource(false); // Paper - Refresh ProjectileSource for projectiles
|
2023-12-06 17:21:56 +01:00
|
|
|
return this.cachedOwner;
|
2023-06-01 04:43:51 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/AbstractProjectile.java b/src/main/java/org/bukkit/craftbukkit/entity/AbstractProjectile.java
|
2024-01-18 18:52:00 +01:00
|
|
|
index c1c52f4fc5f900fac4098e5e37c52dfc4e82b8bb..236f94348ff8da661e23e3e17b7fc1b143680da9 100644
|
2023-06-01 04:43:51 +02:00
|
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/AbstractProjectile.java
|
|
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/AbstractProjectile.java
|
2023-09-29 02:28:26 +02:00
|
|
|
@@ -60,6 +60,7 @@ public abstract class AbstractProjectile extends CraftEntity implements Projecti
|
2023-06-01 04:43:51 +02:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public final org.bukkit.projectiles.ProjectileSource getShooter() {
|
2024-01-15 12:38:39 +01:00
|
|
|
+ this.getHandle().refreshProjectileSource(true); // Paper - Refresh ProjectileSource for projectiles
|
2023-06-01 04:43:51 +02:00
|
|
|
return this.getHandle().projectileSource;
|
|
|
|
}
|
|
|
|
|