mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-30 16:19:03 +01:00
8778a2ef97
This enables us a fast reference to the entities current chunk instead of having to look it up by hashmap lookups. We also store counts by type to further enable other performance optimizations in later patches.
49 lines
No EOL
2.3 KiB
Diff
49 lines
No EOL
2.3 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Aikar <aikar@aikar.co>
|
|
Date: Sun, 10 Jun 2018 20:04:42 -0400
|
|
Subject: [PATCH] Properly remove entities on dimension teleport
|
|
|
|
To teleport an entity between dimensions, the server makes a copy
|
|
and puts the copy in the new location, and marks the old one dead.
|
|
|
|
If this method got called for the same world in the same tick,
|
|
the entity would not have been removed from the UUID map, and the
|
|
world readd would fail.
|
|
|
|
This can be triggered even with a plugin if the entity is teleported
|
|
twice in the same tick, from world A to B, then back from B to A.
|
|
|
|
The re-add to A will fail to add the entity to the world. It will
|
|
actually be there, but it will not be visible on the client until
|
|
the server is restarted to re-try the add to world process again.
|
|
|
|
This bug was unlikely to be seen by many due to the double teleport
|
|
requirement, but plugins (such as my own) use this method to
|
|
trigger a "reload" of the entity on the client.
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
|
|
index 00791faf2..70641d479 100644
|
|
--- a/src/main/java/net/minecraft/server/Entity.java
|
|
+++ b/src/main/java/net/minecraft/server/Entity.java
|
|
@@ -0,0 +0,0 @@ public abstract class Entity implements ICommandListener, KeyedObject { // Paper
|
|
}
|
|
// CraftBukkit end */
|
|
|
|
- this.world.kill(this);
|
|
+ this.world.removeEntity(this); // Paper - Fully remove entity, can't have dupes in the UUID map
|
|
this.dead = false;
|
|
this.world.methodProfiler.a("reposition");
|
|
/* CraftBukkit start - Handled in calculateTarget
|
|
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
|
|
index 49019d54d..9fe5c4406 100644
|
|
--- a/src/main/java/net/minecraft/server/WorldServer.java
|
|
+++ b/src/main/java/net/minecraft/server/WorldServer.java
|
|
@@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler {
|
|
}
|
|
|
|
protected void c(Entity entity) {
|
|
+ if (!entity.valid) return; // Paper - Already removed, dont fire twice - this looks like it can happen even without our changes
|
|
super.c(entity);
|
|
this.entitiesById.d(entity.getId());
|
|
this.entitiesByUUID.remove(entity.getUniqueID());
|
|
--
|