Skip to content

Commit

Permalink
Fix untrack event not being called for all 'untracks' (#10110)
Browse files Browse the repository at this point in the history
  • Loading branch information
Machine-Maker committed Jan 4, 2024
1 parent 1fa48d1 commit ae001ae
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 15 deletions.
14 changes: 10 additions & 4 deletions patches/api/0394-Player-Entity-Tracking-Events.patch
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ Subject: [PATCH] Player Entity Tracking Events

diff --git a/src/main/java/io/papermc/paper/event/player/PlayerTrackEntityEvent.java b/src/main/java/io/papermc/paper/event/player/PlayerTrackEntityEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..db0a011815daf2690deb4ad2aff08227664fc6b8
index 0000000000000000000000000000000000000000..40024c8d5fe81e23eae9b37a08fca34a91e40011
--- /dev/null
+++ b/src/main/java/io/papermc/paper/event/player/PlayerTrackEntityEvent.java
@@ -0,0 +1,56 @@
@@ -0,0 +1,59 @@
+package io.papermc.paper.event.player;
+
+import org.bukkit.entity.Entity;
Expand All @@ -23,6 +23,9 @@ index 0000000000000000000000000000000000000000..db0a011815daf2690deb4ad2aff08227
+ * Is called when a {@link Player} tracks an {@link Entity}.
+ * <p>
+ * If cancelled entity is not shown to the player and interaction in both directions is not possible.
+ * <p>
+ * Adding or removing entities from the world at the point in time this event is called is completely
+ * unsupported and should be avoided.
+ */
+public class PlayerTrackEntityEvent extends PlayerEvent implements Cancellable {
+
Expand Down Expand Up @@ -68,10 +71,10 @@ index 0000000000000000000000000000000000000000..db0a011815daf2690deb4ad2aff08227
+}
diff --git a/src/main/java/io/papermc/paper/event/player/PlayerUntrackEntityEvent.java b/src/main/java/io/papermc/paper/event/player/PlayerUntrackEntityEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..683710d53e3802ca1cb1a448886a57df6b15dd44
index 0000000000000000000000000000000000000000..82bb2d2b4bf05d7b4e8dd22280deb04433c2ad9e
--- /dev/null
+++ b/src/main/java/io/papermc/paper/event/player/PlayerUntrackEntityEvent.java
@@ -0,0 +1,41 @@
@@ -0,0 +1,44 @@
+package io.papermc.paper.event.player;
+
+import org.bukkit.entity.Entity;
Expand All @@ -82,6 +85,9 @@ index 0000000000000000000000000000000000000000..683710d53e3802ca1cb1a448886a57df
+
+/**
+ * Is called when a {@link Player} untracks an {@link Entity}.
+ * <p>
+ * Adding or removing entities from the world at the point in time this event is called is completely
+ * unsupported and should be avoided.
+ */
+public class PlayerUntrackEntityEvent extends PlayerEvent {
+
Expand Down
29 changes: 21 additions & 8 deletions patches/server/0878-Player-Entity-Tracking-Events.patch
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ Subject: [PATCH] Player Entity Tracking Events


diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
index 982750fd4f3f474514194df9b76388311c052b29..1e838661ced07b69e50e7ad3935ed0d676570860 100644
index 982750fd4f3f474514194df9b76388311c052b29..526b52bbf7c5d82645d26710f05e62b781e3cb0e 100644
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
@@ -1409,9 +1409,18 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
@@ -1409,7 +1409,11 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
// CraftBukkit end
if (flag) {
if (this.seenBy.add(player.connection)) {
Expand All @@ -19,11 +19,24 @@ index 982750fd4f3f474514194df9b76388311c052b29..1e838661ced07b69e50e7ad3935ed0d6
+ // Paper end
}
} else if (this.seenBy.remove(player.connection)) {
+ // Paper start - entity tracking events
+ if (io.papermc.paper.event.player.PlayerUntrackEntityEvent.getHandlerList().getRegisteredListeners().length > 0) {
+ new io.papermc.paper.event.player.PlayerUntrackEntityEvent(player.getBukkitEntity(), this.entity.getBukkitEntity()).callEvent();
+ }
+ // Paper end
this.serverEntity.removePairing(player);
}
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
index 89defc6e1e95fdd7d76ae3af0282066819831c9e..b5eb4a067cc3b4a2a6b0b6ba2c129c85c4aaa849 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
@@ -4107,7 +4107,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S

public void startSeenByPlayer(ServerPlayer player) {}

- public void stopSeenByPlayer(ServerPlayer player) {}
+ // Paper start - entity tracking events
+ public void stopSeenByPlayer(ServerPlayer player) {
+ // Since this event cannot be cancelled, we should call it here to catch all "un-tracks"
+ if (io.papermc.paper.event.player.PlayerUntrackEntityEvent.getHandlerList().getRegisteredListeners().length > 0) {
+ new io.papermc.paper.event.player.PlayerUntrackEntityEvent(player.getBukkitEntity(), this.getBukkitEntity()).callEvent();
+ }
+ }
+ // Paper end

public float rotate(Rotation rotation) {
float f = Mth.wrapDegrees(this.getYRot());
Original file line number Diff line number Diff line change
Expand Up @@ -1185,7 +1185,7 @@ index a9cc3d7213f51a2a2cdc915fd9ab3cf97767b698..69e75aec30e8c25f621c8e7d024abe67
this.players.remove(entityplayer);
this.playersByName.remove(entityplayer.getScoreboardName().toLowerCase(java.util.Locale.ROOT)); // Spigot
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
index 903fa8c1489541e141bef59239ecd645955ffca4..a561da947df33d85a6bb6f61e88a2b5fe57b5c32 100644
index 0b34913980a8def4af28bbc8d7308aa237bdadf0..c07eac5b7d3a5c21ea043ae56f036a5f396d92de 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
@@ -247,11 +247,23 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
Expand Down Expand Up @@ -1213,15 +1213,15 @@ index 903fa8c1489541e141bef59239ecd645955ffca4..a561da947df33d85a6bb6f61e88a2b5f
@Override
public CommandSender getBukkitSender(CommandSourceStack wrapper) {
return this.getBukkitEntity();
@@ -4734,6 +4746,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
@@ -4741,6 +4753,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
return;
}
// Paper end - rewrite chunk system
+ final boolean alreadyRemoved = this.removalReason != null;
if (this.removalReason == null) {
this.removalReason = reason;
}
@@ -4744,12 +4757,28 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
@@ -4751,12 +4764,28 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S

if (reason != RemovalReason.UNLOADED_TO_CHUNK) this.getPassengers().forEach(Entity::stopRiding); // Paper - chunk system - don't adjust passenger state when unloading, it's just not safe (and messes with our logic in entity chunk unload)
this.levelCallback.onRemove(reason);
Expand Down

0 comments on commit ae001ae

Please sign in to comment.