mirror of
https://github.com/Winds-Studio/Leaf.git
synced 2025-12-30 04:19:13 +00:00
Moonrise: Optimize nearby players for spawning iteration
This commit is contained in:
@@ -0,0 +1,96 @@
|
||||
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
|
||||
|
||||
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)) {
|
||||
Reference in New Issue
Block a user