diff --git a/Spigot-Server-Patches/0305-Properly-remove-entities-on-dimension-teleport.patch b/Spigot-Server-Patches/0305-Properly-remove-entities-on-dimension-teleport.patch new file mode 100644 index 0000000000..47a0999762 --- /dev/null +++ b/Spigot-Server-Patches/0305-Properly-remove-entities-on-dimension-teleport.patch @@ -0,0 +1,51 @@ +From 95da0e7cef89c1762b8d624855186175c60cfcee Mon Sep 17 00:00:00 2001 +From: Aikar +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 58fe1aa3e..4431f6e99 100644 +--- a/src/main/java/net/minecraft/server/Entity.java ++++ b/src/main/java/net/minecraft/server/Entity.java +@@ -2405,7 +2405,7 @@ public abstract class Entity implements ICommandListener { + } + // 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 +@@ -1205,6 +1205,7 @@ 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()); +-- +2.17.1 +