aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0740-Do-not-allow-ticket-level-changes-while-unloading-pl.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0740-Do-not-allow-ticket-level-changes-while-unloading-pl.patch')
-rw-r--r--patches/server/0740-Do-not-allow-ticket-level-changes-while-unloading-pl.patch62
1 files changed, 62 insertions, 0 deletions
diff --git a/patches/server/0740-Do-not-allow-ticket-level-changes-while-unloading-pl.patch b/patches/server/0740-Do-not-allow-ticket-level-changes-while-unloading-pl.patch
new file mode 100644
index 0000000000..af693f3838
--- /dev/null
+++ b/patches/server/0740-Do-not-allow-ticket-level-changes-while-unloading-pl.patch
@@ -0,0 +1,62 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Spottedleaf <[email protected]>
+Date: Sat, 19 Sep 2020 15:29:16 -0700
+Subject: [PATCH] Do not allow ticket level changes while unloading
+ playerchunks
+
+Sync loading the chunk at this stage would cause it to load
+older data, as well as screwing our region state.
+
+diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
+index 71ca2c2edc6a89e9365b4686c233f60cea12a472..09bb6e14864af68e9833e171a33aa981f51c8569 100644
+--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
++++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
+@@ -296,6 +296,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+ }
+ // Paper end
+
++ boolean unloadingPlayerChunk = false; // Paper - do not allow ticket level changes while unloading chunks
+ public ChunkMap(ServerLevel world, LevelStorageSource.LevelStorageAccess session, DataFixer dataFixer, StructureManager structureManager, Executor executor, BlockableEventLoop<Runnable> mainThreadExecutor, LightChunkGetter chunkProvider, ChunkGenerator chunkGenerator, ChunkProgressListener worldGenerationProgressListener, ChunkStatusUpdateListener chunkStatusChangeListener, Supplier<DimensionDataStorage> persistentStateManagerFactory, int viewDistance, boolean dsync) {
+ super(session.getDimensionPath(world.dimension()).resolve("region"), dataFixer, dsync);
+ this.visibleChunkMap = this.updatingChunkMap.clone();
+@@ -652,6 +653,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+
+ @Nullable
+ ChunkHolder updateChunkScheduling(long pos, int level, @Nullable ChunkHolder holder, int k) {
++ if (this.unloadingPlayerChunk) { net.minecraft.server.MinecraftServer.LOGGER.fatal("Cannot tick distance manager while unloading playerchunks", new Throwable()); throw new IllegalStateException("Cannot tick distance manager while unloading playerchunks"); } // Paper
+ if (k > ChunkMap.MAX_CHUNK_DISTANCE && level > ChunkMap.MAX_CHUNK_DISTANCE) {
+ return holder;
+ } else {
+@@ -870,6 +872,12 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+ if (completablefuture1 != completablefuture) {
+ this.scheduleUnload(pos, holder);
+ } else {
++ // Paper start - do not allow ticket level changes while unloading chunks
++ org.spigotmc.AsyncCatcher.catchOp("playerchunk unload");
++ boolean unloadingBefore = this.unloadingPlayerChunk;
++ this.unloadingPlayerChunk = true;
++ try {
++ // Paper end - do not allow ticket level changes while unloading chunks
+ // Paper start
+ boolean removed;
+ if ((removed = this.pendingUnloads.remove(pos, holder)) && ichunkaccess != null) {
+@@ -906,6 +914,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+ this.regionManagers.get(index).removeChunk(holder.pos.x, holder.pos.z);
+ }
+ } // Paper end
++ } finally { this.unloadingPlayerChunk = unloadingBefore; } // Paper - do not allow ticket level changes while unloading chunks
+
+ }
+ };
+diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
+index ef6e4dddc699c05a5f3d4b2dc29db0d1fa79b0ef..74836552406743c16ef9e510ad22f7ba5520ea7f 100644
+--- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java
++++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
+@@ -820,6 +820,7 @@ public class ServerChunkCache extends ChunkSource {
+
+ public boolean runDistanceManagerUpdates() {
+ if (distanceManager.delayDistanceManagerTick) return false; // Paper - Chunk priority
++ if (this.chunkMap.unloadingPlayerChunk) { net.minecraft.server.MinecraftServer.LOGGER.fatal("Cannot tick distance manager while unloading playerchunks", new Throwable()); throw new IllegalStateException("Cannot tick distance manager while unloading playerchunks"); } // Paper
+ boolean flag = this.distanceManager.runAllUpdates(this.chunkMap);
+ boolean flag1 = this.chunkMap.promoteChunkMap();
+