diff --git a/patches/server/0059-Moonrise-Optimize-nearby-players-for-spawning-iterat.patch b/patches/server/0059-Moonrise-Optimize-nearby-players-for-spawning-iterat.patch new file mode 100644 index 00000000..a4fec0a7 --- /dev/null +++ b/patches/server/0059-Moonrise-Optimize-nearby-players-for-spawning-iterat.patch @@ -0,0 +1,96 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Spottedleaf +Date: Wed, 17 Jul 2024 07:25:48 -0700 +Subject: [PATCH] Moonrise: Optimize nearby players for spawning iteration + +Original license: GPLv3 +Original project: https://github.com/Tuinity/Moonrise + +https://github.com/Tuinity/Moonrise/commit/bbf85f323fff7516064c06f565c6348cf284dba0 + +Use nearby players to avoid iterating over all online players + +diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java +index dde015810f6e914ad99dcb8ab66c7aa33e1b8c26..6985da233e41a62bea04277260f81b3ba200a415 100644 +--- a/src/main/java/net/minecraft/server/level/ChunkMap.java ++++ b/src/main/java/net/minecraft/server/level/ChunkMap.java +@@ -674,6 +674,41 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider + } + + boolean anyPlayerCloseEnoughForSpawning(ChunkPos chunkcoordintpair, boolean reducedRange) { ++ // Moonrise start - Optimize nearby players for spawning iteration ++ if (true) { ++ final ca.spottedleaf.moonrise.common.list.ReferenceList players = ((ca.spottedleaf.moonrise.patches.chunk_system.level.ChunkSystemServerLevel) this.level).moonrise$getNearbyPlayers().getPlayers( ++ chunkcoordintpair, ca.spottedleaf.moonrise.common.misc.NearbyPlayers.NearbyMapType.SPAWN_RANGE ++ ); ++ ++ if (players == null) { ++ return false; ++ } ++ ++ final ServerPlayer[] raw = players.getRawDataUnchecked(); ++ final int len = players.size(); ++ ++ Objects.checkFromIndexSize(0, len, raw.length); ++ for (int i = 0; i < len; ++i) { ++ final ServerPlayer player = raw[i]; ++ ++ // Paper start - PlayerNaturallySpawnCreaturesEvent ++ com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent event; ++ double blockRange = 16384.0D; ++ if (reducedRange) { ++ event = player.playerNaturallySpawnedEvent; ++ if (event == null || event.isCancelled()) return false; ++ blockRange = (event.getSpawnRadius() << 4) * (event.getSpawnRadius() << 4); ++ } ++ // Paper end - PlayerNaturallySpawnCreaturesEvent ++ ++ if (!player.isSpectator() && ChunkMap.euclideanDistanceSquared(chunkcoordintpair, player) < blockRange) { // Leaf - inline ++ return true; ++ } ++ } ++ ++ return false; ++ } ++ // Moonrise end - Optimize nearby players for spawning iteration + int chunkRange = this.level.spigotConfig.mobSpawnRange; + chunkRange = (chunkRange > this.level.spigotConfig.viewDistance) ? (byte) this.level.spigotConfig.viewDistance : chunkRange; + chunkRange = (chunkRange > 8) ? 8 : chunkRange; +@@ -711,6 +746,37 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider + } + + public List getPlayersCloseForSpawning(ChunkPos pos) { ++ // Moonrise start - Optimize nearby players for spawning iteration ++ if (true) { ++ final ca.spottedleaf.moonrise.common.list.ReferenceList players = ((ca.spottedleaf.moonrise.patches.chunk_system.level.ChunkSystemServerLevel) this.level).moonrise$getNearbyPlayers().getPlayers( ++ pos, ca.spottedleaf.moonrise.common.misc.NearbyPlayers.NearbyMapType.SPAWN_RANGE ++ ); ++ ++ if (players == null) { ++ return new ArrayList<>(); ++ } ++ ++ List ret = null; ++ ++ final ServerPlayer[] raw = players.getRawDataUnchecked(); ++ final int len = players.size(); ++ ++ Objects.checkFromIndexSize(0, len, raw.length); ++ for (int i = 0; i < len; ++i) { ++ final ServerPlayer player = raw[i]; ++ if (!player.isSpectator() && ChunkMap.euclideanDistanceSquared(pos, player) < 16384.0D) { // Spigot // Leaf - inline ++ if (ret == null) { ++ ret = new ArrayList<>(len - i); ++ ret.add(player); ++ } else { ++ ret.add(player); ++ } ++ } ++ } ++ ++ return ret == null ? new ArrayList<>() : ret; ++ } ++ // Moonrise end - Optimize nearby players for spawning iteration + long i = pos.toLong(); + + if (!this.distanceManager.hasPlayersNearby(i)) {