geforkt von Mirrors/Paper
7fa8870043
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 7902647a PR-737: Update WorldCreator#generatorSettings docs 67556a50 PR-736: Update README CraftBukkit Changes: 10922194 Java 18 support d53c4fb6 PR-1039: Use correct ops in GeneratorSettings a567e4ae PR-1038: Removed the no longer needed getChunkUnchecked method from ChunkProviderServer. 4ac8fcce SPIGOT-6980: Since 1.18.2, World#isChunkLoaded returned false for chunks that have just been loaded (e.g. inside ChunkLoadEvent). e6cc7c70 PR-1035: Update README 3ec79a27 SPIGOT-5140: Call EntityChangeBlockEvent when a ChorusFlower is destroyed by a projectile
38 Zeilen
1.9 KiB
Diff
38 Zeilen
1.9 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
|
|
Date: Sun, 21 Mar 2021 17:32:47 -0700
|
|
Subject: [PATCH] Correctly handle recursion for chunkholder updates
|
|
|
|
If a chunk ticket level is brought up while unloading it would
|
|
cause a recursive call which would handle the increase but then
|
|
the caller would think the chunk would be unloaded.
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/level/ChunkHolder.java b/src/main/java/net/minecraft/server/level/ChunkHolder.java
|
|
index 0d9fbdb23d28a4082c71275ca00e42f3bcb31926..dbae93f9c6358ef61c6b1f29860e9905a4b74332 100644
|
|
--- a/src/main/java/net/minecraft/server/level/ChunkHolder.java
|
|
+++ b/src/main/java/net/minecraft/server/level/ChunkHolder.java
|
|
@@ -463,8 +463,10 @@ public class ChunkHolder {
|
|
playerchunkmap.onFullChunkStatusChange(this.pos, playerchunk_state);
|
|
}
|
|
|
|
+ protected long updateCount; // Paper - correctly handle recursion
|
|
protected void updateFutures(ChunkMap chunkStorage, Executor executor) {
|
|
io.papermc.paper.util.TickThread.ensureTickThread("Async ticket level update"); // Paper
|
|
+ long updateCount = ++this.updateCount; // Paper - correctly handle recursion
|
|
ChunkStatus chunkstatus = ChunkHolder.getStatus(this.oldTicketLevel);
|
|
ChunkStatus chunkstatus1 = ChunkHolder.getStatus(this.ticketLevel);
|
|
boolean flag = this.oldTicketLevel <= ChunkMap.MAX_CHUNK_DISTANCE;
|
|
@@ -506,6 +508,12 @@ public class ChunkHolder {
|
|
|
|
// Run callback right away if the future was already done
|
|
chunkStorage.callbackExecutor.run();
|
|
+ // Paper start - correctly handle recursion
|
|
+ if (this.updateCount != updateCount) {
|
|
+ // something else updated ticket level for us.
|
|
+ return;
|
|
+ }
|
|
+ // Paper end - correctly handle recursion
|
|
}
|
|
// CraftBukkit end
|
|
|