66 lines
2.6 KiB
Diff
66 lines
2.6 KiB
Diff
|
From de82f12fa592c1bfcfb3a948dfedf4f2dc54130e Mon Sep 17 00:00:00 2001
|
||
|
From: Aikar <aikar@aikar.co>
|
||
|
Date: Thu, 26 Jul 2018 00:11:12 -0400
|
||
|
Subject: [PATCH] Prevent Saving Bad entities to chunks
|
||
|
|
||
|
See https://github.com/PaperMC/Paper/issues/1223
|
||
|
|
||
|
Minecraft is saving invalid entities to the chunk files.
|
||
|
|
||
|
Avoid saving bad data, and also make improvements to handle
|
||
|
loading these chunks. Any invalid entity will be instant killed,
|
||
|
so lets avoid adding it to the world...
|
||
|
|
||
|
This lets us be safer about the dupe UUID resolver too, as now
|
||
|
we can ignore instant killed entities and avoid risk of duplicating
|
||
|
an invalid entity.
|
||
|
|
||
|
This should reduce log occurrences of dupe uuid messages.
|
||
|
|
||
|
diff --git a/src/main/java/net/minecraft/server/ChunkRegionLoader.java b/src/main/java/net/minecraft/server/ChunkRegionLoader.java
|
||
|
index 0fed039f3..2e9686b43 100644
|
||
|
--- a/src/main/java/net/minecraft/server/ChunkRegionLoader.java
|
||
|
+++ b/src/main/java/net/minecraft/server/ChunkRegionLoader.java
|
||
|
@@ -304,6 +304,7 @@ public class ChunkRegionLoader {
|
||
|
NBTTagCompound nbttagcompound4;
|
||
|
Iterator iterator1;
|
||
|
|
||
|
+ java.util.List<Entity> toUpdate = new java.util.ArrayList<>(); // Paper
|
||
|
if (ichunkaccess.getChunkStatus().getType() == ChunkStatus.Type.LEVELCHUNK) {
|
||
|
Chunk chunk = (Chunk) ichunkaccess;
|
||
|
|
||
|
@@ -314,6 +315,16 @@ public class ChunkRegionLoader {
|
||
|
|
||
|
while (iterator2.hasNext()) {
|
||
|
Entity entity = (Entity) iterator2.next();
|
||
|
+ // Paper start
|
||
|
+ if ((int)Math.floor(entity.locX) >> 4 != chunk.getPos().x || (int)Math.floor(entity.locZ) >> 4 != chunk.getPos().z) {
|
||
|
+ LogManager.getLogger().warn(entity + " is not in this chunk, skipping save. This a bug fix to a vanilla bug. Do not report this to PaperMC please.");
|
||
|
+ toUpdate.add(entity);
|
||
|
+ continue;
|
||
|
+ }
|
||
|
+ if (entity.dead) {
|
||
|
+ continue;
|
||
|
+ }
|
||
|
+ // Paper end
|
||
|
|
||
|
nbttagcompound4 = new NBTTagCompound();
|
||
|
if (entity.d(nbttagcompound4)) {
|
||
|
@@ -322,6 +333,13 @@ public class ChunkRegionLoader {
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
+
|
||
|
+ // Paper start - move entities to the correct chunk
|
||
|
+ for (Entity entity : toUpdate) {
|
||
|
+ ((WorldServer)world).entityJoinedWorld(entity);
|
||
|
+ }
|
||
|
+ // Paper end
|
||
|
+
|
||
|
} else {
|
||
|
ProtoChunk protochunk = (ProtoChunk) ichunkaccess;
|
||
|
|
||
|
--
|
||
|
2.21.0
|
||
|
|