geforkt von Mirrors/Paper
aabf676721
Logging into an unloaded world isn't going to end well. This may fix the cases of people seeing errors about regionfiles being closed, as loading chunks in an unloaded world will cause this as the regionfile cache is closed but not cleared.
75 Zeilen
3.3 KiB
Diff
75 Zeilen
3.3 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).
|
|
- Set forceTicks to true, so that player packets are always
|
|
processed so that the main process queue can be drained
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
index df08b7afcf19ce694a87c25e8589c0c72521c5db..4d920031300a9801debc2eb39a4d3cb9d8fbb330 100644
|
|
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
@@ -957,6 +957,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();
|
|
})) {
|
|
@@ -969,9 +976,11 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
|
worldserver.getChunkSource().tick(() -> {
|
|
return true;
|
|
}, false);
|
|
+ while (worldserver.getChunkSource().pollTask()); // Paper - drain tasks
|
|
}
|
|
|
|
- this.waitUntilNextTick();
|
|
+ this.forceTicks = true; // Paper
|
|
+ while (this.pollTask()); // Paper - drain tasks
|
|
}
|
|
|
|
this.saveAllChunks(false, true, false);
|
|
@@ -1266,6 +1275,11 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
|
}
|
|
|
|
private boolean haveTime() {
|
|
+ // Paper start
|
|
+ if (this.forceTicks) {
|
|
+ return true;
|
|
+ }
|
|
+ // Paper end
|
|
// CraftBukkit start
|
|
if (isOversleep) return canOversleep();// Paper - because of our changes, this logic is broken
|
|
return this.forceTicks || this.runningTask() || Util.getMillis() < (this.mayHaveDelayedTasks ? this.delayedTasksMaxNextTickTime : this.nextTickTime);
|
|
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
|
index 9dc4a1d9082a0cb3ab6848698c3fc41a5f57e380..95c2f8d70eff220dd53a6779e105a9bb67e47b6a 100644
|
|
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
|
|
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
|
@@ -1282,7 +1282,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;
|
|
|