Fix CraftWorld#isChunkGenerated

The upstream implementation is returning true for non-full chunks.
This commit is contained in:
Jason Penilla 2024-06-18 12:43:06 -07:00
parent 35f6f25e78
commit 1218a52ac9

View file

@ -398,11 +398,28 @@ public class CraftWorld extends CraftRegionAccessor implements World {
@Override @Override
public boolean isChunkGenerated(int x, int z) { public boolean isChunkGenerated(int x, int z) {
try { // Paper start - Fix this method
return this.isChunkLoaded(x, z) || this.world.getChunkSource().chunkMap.read(new ChunkPos(x, z)).get().isPresent(); if (!Bukkit.isPrimaryThread()) {
} catch (InterruptedException | ExecutionException ex) { return java.util.concurrent.CompletableFuture.supplyAsync(() -> {
throw new RuntimeException(ex); 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<ChunkAccess> 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 @Override