geforkt von Mirrors/Paper
60 Zeilen
2.6 KiB
Diff
60 Zeilen
2.6 KiB
Diff
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||
|
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
|
||
|
Date: Sat, 5 Mar 2022 17:12:52 -0800
|
||
|
Subject: [PATCH] Fix save problems on shutdown
|
||
|
|
||
|
- Save level.dat first, in case the shutdown is killed later
|
||
|
- Force run minecraftserver tasks and the chunk source tasks
|
||
|
while waiting for the chunk system to empty, as there's simply
|
||
|
too much trash that could prevent them from executing during
|
||
|
the chunk source tick (i.e "time left in tick" logic).
|
||
|
|
||
|
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||
|
index 17e87875a95495940899b862eabf98b3d6a365da..e25c9a9ccab67a018c2e58e13b24089bc2ce538f 100644
|
||
|
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
||
|
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||
|
@@ -998,6 +998,13 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||
|
}
|
||
|
}
|
||
|
|
||
|
+ // Paper start - let's be a little more intelligent around crashes
|
||
|
+ // make sure level.dat saves
|
||
|
+ for (ServerLevel level : this.getAllLevels()) {
|
||
|
+ level.saveLevelDat();
|
||
|
+ }
|
||
|
+ // Paper end - let's be a little more intelligent around crashes
|
||
|
+
|
||
|
while (this.levels.values().stream().anyMatch((worldserver1) -> {
|
||
|
return worldserver1.getChunkSource().chunkMap.hasWork();
|
||
|
})) {
|
||
|
@@ -1010,9 +1017,10 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||
|
worldserver.getChunkSource().tick(() -> {
|
||
|
return true;
|
||
|
}, false);
|
||
|
+ while (worldserver.getChunkSource().pollTask()); // Paper - drain tasks
|
||
|
}
|
||
|
|
||
|
- this.waitUntilNextTick();
|
||
|
+ while (this.pollTask()); // Paper - drain tasks
|
||
|
}
|
||
|
|
||
|
this.saveAllChunks(false, true, false);
|
||
|
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||
|
index b5b56d4549e97abbbe9e91d881b9bca8428f1eec..dce7452d58d6081f1a83baddafb1596ebd423d21 100644
|
||
|
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||
|
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||
|
@@ -1258,7 +1258,13 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
||
|
}
|
||
|
|
||
|
}
|
||
|
+ // Paper start
|
||
|
+ this.saveLevelDat();
|
||
|
+ }
|
||
|
|
||
|
+ public void saveLevelDat() {
|
||
|
+ this.saveLevelData();
|
||
|
+ // Paper end
|
||
|
// CraftBukkit start - moved from MinecraftServer.saveChunks
|
||
|
ServerLevel worldserver1 = this;
|
||
|
|