From 1218a52ac92bb4d4d7f0636925d19ae03db71b29 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Tue, 18 Jun 2024 12:43:06 -0700 Subject: [PATCH] Fix CraftWorld#isChunkGenerated The upstream implementation is returning true for non-full chunks. --- .../org/bukkit/craftbukkit/CraftWorld.java | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftWorld.java index 536058b4cf..73b0438908 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -398,11 +398,28 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean isChunkGenerated(int x, int z) { - try { - return this.isChunkLoaded(x, z) || this.world.getChunkSource().chunkMap.read(new ChunkPos(x, z)).get().isPresent(); - } catch (InterruptedException | ExecutionException ex) { - throw new RuntimeException(ex); + // Paper start - Fix this method + if (!Bukkit.isPrimaryThread()) { + return java.util.concurrent.CompletableFuture.supplyAsync(() -> { + return CraftWorld.this.isChunkGenerated(x, z); + }, world.getChunkSource().mainThreadProcessor).join(); } + ChunkAccess chunk = world.getChunkSource().getChunkAtImmediately(x, z); + if (chunk != null) { + return chunk instanceof ImposterProtoChunk || chunk instanceof net.minecraft.world.level.chunk.LevelChunk; + } + final java.util.concurrent.CompletableFuture future = new java.util.concurrent.CompletableFuture<>(); + ca.spottedleaf.moonrise.common.util.ChunkSystem.scheduleChunkLoad( + this.world, x, z, false, ChunkStatus.EMPTY, true, ca.spottedleaf.concurrentutil.util.Priority.NORMAL, future::complete + ); + world.getChunkSource().mainThreadProcessor.managedBlock(future::isDone); + return future.thenApply(c -> { + if (c != null) { + return c.getPersistedStatus() == ChunkStatus.FULL; + } + return false; + }).join(); + // Paper end - Fix this method } @Override