mirror of
https://github.com/Winds-Studio/Leaf.git
synced 2025-12-19 15:09:25 +00:00
99 lines
4.6 KiB
Diff
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)) {
|