9
0
mirror of https://github.com/Winds-Studio/Leaf.git synced 2025-12-19 15:09:25 +00:00
Files
Leaf/leaf-archived-patches/removed/1.21.4/mcserver/0061-Moonrise-Optimize-nearby-players-for-spawning-iterat.patch
2025-06-29 23:39:55 +08:00

99 lines
4.6 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
Date: Wed, 17 Jul 2024 07:25:48 -0700
Subject: [PATCH] Moonrise: Optimize nearby players for spawning iteration
Removed since Paper 1.21.4
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<ServerPlayer> 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<ServerPlayer> getPlayersCloseForSpawning(ChunkPos pos) {
+ // Moonrise start - Optimize nearby players for spawning iteration
+ if (true) {
+ final ca.spottedleaf.moonrise.common.list.ReferenceList<ServerPlayer> 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<ServerPlayer> 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)) {