9
0
mirror of https://github.com/Winds-Studio/Leaf.git synced 2025-12-19 15:09:25 +00:00
Files
Leaf/leaf-server/paper-patches/features/0058-Paper-Optimise-CraftWorld-getLoadedChunks.patch
2025-06-14 03:34:46 +08:00

45 lines
2.3 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
Date: Thu, 5 Jun 2025 08:16:25 -0700
Subject: [PATCH] Paper: Optimise CraftWorld#getLoadedChunks
Original license: GPLv3
Original project: https://github.com/PaperMC/Paper
https://github.com/PaperMC/Paper/commit/24cd24c8cc0df4bea0784e6919c9ba8f1852d46e
We can use the existing full chunk map so that we do not need
to iterate over all ChunkHolders. Additionally, do not use streams
to do the iteration either.
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
index bf87e5dcda7deb8f9c36a3f6b64285a97e48477f..c10390c1bdc7b8ee59dbb5ddc145315654405cbc 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
@@ -421,8 +421,23 @@ public class CraftWorld extends CraftRegionAccessor implements World {
@Override
public Chunk[] getLoadedChunks() {
- List<ChunkHolder> chunks = ca.spottedleaf.moonrise.common.PlatformHooks.get().getVisibleChunkHolders(this.world); // Paper
- return chunks.stream().map(ChunkHolder::getFullChunkNow).filter(Objects::nonNull).map(CraftChunk::new).toArray(Chunk[]::new);
+ // Paper start - Optimise CraftWorld#getLoadedChunks
+ net.minecraft.server.level.ServerChunkCache serverChunkCache = this.getHandle().chunkSource;
+ ca.spottedleaf.moonrise.common.list.ReferenceList<Chunk> chunks = new ca.spottedleaf.moonrise.common.list.ReferenceList<>(new Chunk[serverChunkCache.fullChunks.size()]);
+
+ for (java.util.PrimitiveIterator.OfLong iterator = serverChunkCache.fullChunks.keyIterator(); iterator.hasNext();) {
+ long chunk = iterator.nextLong();
+ chunks.add(new CraftChunk(this.world, ca.spottedleaf.moonrise.common.util.CoordinateUtils.getChunkX(chunk), ca.spottedleaf.moonrise.common.util.CoordinateUtils.getChunkZ(chunk)));
+ }
+
+ Chunk[] raw = chunks.getRawDataUnchecked();
+ int size = chunks.size();
+ if (raw.length == size) {
+ // always true when on main
+ return raw;
+ }
+ return java.util.Arrays.copyOf(raw, size);
+ // Paper end - Optimise CraftWorld#getLoadedChunks
}
@Override