9
0
mirror of https://github.com/Winds-Studio/Leaf.git synced 2025-12-28 03:19:21 +00:00
Files
Leaf/leaf-server/paper-patches/features/0041-Paper-Optimise-CraftWorld-getLoadedChunks.patch
2025-06-06 02:37:29 +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 caa92e48d031cb54950e6613a82f407d7ed2455a..236be1bb296d0f080d2a8c739d2678655e81e174 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
@@ -420,8 +420,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