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)) {