mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-17 16:37:43 +01:00
Optimize PlayerChunkMap
This commit is contained in:
137
patches/server/0104-Optimize-PlayerChunkMap.patch
Normal file
137
patches/server/0104-Optimize-PlayerChunkMap.patch
Normal file
@@ -0,0 +1,137 @@
|
||||
From 235e99cdb51be4e62e987dd223824f900f3495d7 Mon Sep 17 00:00:00 2001
|
||||
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
|
||||
Date: Sun, 1 Mar 2020 20:07:54 -0600
|
||||
Subject: [PATCH] Optimize PlayerChunkMap
|
||||
|
||||
---
|
||||
.../net/minecraft/server/ChunkMapDistance.java | 12 ++++++++++--
|
||||
.../minecraft/server/ChunkProviderServer.java | 17 +++++------------
|
||||
.../net/minecraft/server/PlayerChunkMap.java | 17 ++++++-----------
|
||||
3 files changed, 21 insertions(+), 25 deletions(-)
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/ChunkMapDistance.java b/src/main/java/net/minecraft/server/ChunkMapDistance.java
|
||||
index 73d1570765..78735ba56e 100644
|
||||
--- a/src/main/java/net/minecraft/server/ChunkMapDistance.java
|
||||
+++ b/src/main/java/net/minecraft/server/ChunkMapDistance.java
|
||||
@@ -31,7 +31,7 @@ public abstract class ChunkMapDistance {
|
||||
private final Long2ObjectMap<ObjectSet<EntityPlayer>> c = new Long2ObjectOpenHashMap();
|
||||
public final Long2ObjectOpenHashMap<ArraySetSorted<Ticket<?>>> tickets = new Long2ObjectOpenHashMap();
|
||||
private final ChunkMapDistance.a e = new ChunkMapDistance.a();
|
||||
- private final ChunkMapDistance.b f = new ChunkMapDistance.b(8);
|
||||
+ private final ChunkMapDistance.b f = new ChunkMapDistance.b(8); private ChunkMapDistance.b getPlayerDistanceChunkMap() { return f; } // Purpur - OBFHELPER
|
||||
private final ChunkMapDistance.c g = new ChunkMapDistance.c(33);
|
||||
private final java.util.Queue<PlayerChunk> pendingChunkUpdates = new java.util.LinkedList<>(); // PAIL pendingChunkUpdates // Paper - use a queue
|
||||
private final ChunkTaskQueueSorter i;
|
||||
@@ -258,6 +258,13 @@ public abstract class ChunkMapDistance {
|
||||
return this.f.a.size();
|
||||
}
|
||||
|
||||
+ // Purpur start
|
||||
+ public boolean hasPlayersNearby(long chunk, boolean update) {
|
||||
+ if (update) getPlayerDistanceChunkMap().update();
|
||||
+ return getPlayerDistanceChunkMap().getChunks().containsKey(chunk);
|
||||
+ }
|
||||
+ // Purpur end
|
||||
+
|
||||
public boolean d(long i) {
|
||||
this.f.a();
|
||||
return this.f.a.containsKey(i);
|
||||
@@ -425,7 +432,7 @@ public abstract class ChunkMapDistance {
|
||||
|
||||
class b extends ChunkMap {
|
||||
|
||||
- protected final Long2ByteMap a = new Long2ByteOpenHashMap();
|
||||
+ protected final Long2ByteMap a = new Long2ByteOpenHashMap(); protected Long2ByteMap getChunks() { return a; } // Purpur - OBFHELPER
|
||||
protected final int b;
|
||||
|
||||
protected b(int i) {
|
||||
@@ -465,6 +472,7 @@ public abstract class ChunkMapDistance {
|
||||
return objectset != null && !objectset.isEmpty();
|
||||
}
|
||||
|
||||
+ public void update() { a(); } // Purpur - OBFHELPER
|
||||
public void a() {
|
||||
this.b(Integer.MAX_VALUE);
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java
|
||||
index 0ea0d1cff8..1bc961a61d 100644
|
||||
--- a/src/main/java/net/minecraft/server/ChunkProviderServer.java
|
||||
+++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java
|
||||
@@ -648,19 +648,17 @@ public class ChunkProviderServer extends IChunkProvider {
|
||||
this.world.timings.countNaturalMobs.stopTiming(); // Paper - timings
|
||||
this.world.getMethodProfiler().exit();
|
||||
//Paper start - call player naturally spawn event
|
||||
- int chunkRange = world.spigotConfig.mobSpawnRange;
|
||||
- chunkRange = (chunkRange > world.spigotConfig.viewDistance) ? (byte) world.spigotConfig.viewDistance : chunkRange;
|
||||
- chunkRange = Math.min(chunkRange, 8);
|
||||
+ byte chunkRange = (byte) Math.min(Math.min(world.spigotConfig.mobSpawnRange, world.spigotConfig.viewDistance), 8); // Purpur
|
||||
for (EntityPlayer entityPlayer : this.world.players) {
|
||||
- entityPlayer.playerNaturallySpawnedEvent = new com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent(entityPlayer.getBukkitEntity(), (byte) chunkRange);
|
||||
+ entityPlayer.playerNaturallySpawnedEvent = new com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent(entityPlayer.getBukkitEntity(), chunkRange); // Purpur - remove pointless cast
|
||||
entityPlayer.playerNaturallySpawnedEvent.callEvent();
|
||||
};
|
||||
// Paper end
|
||||
this.playerChunkMap.f().forEach((playerchunk) -> {
|
||||
- Optional<Chunk> optional = ((Either) playerchunk.b().getNow(PlayerChunk.UNLOADED_CHUNK)).left();
|
||||
+ Optional<Chunk> optional = playerchunk.b().getNow(PlayerChunk.UNLOADED_CHUNK).left(); // Purpur - remove pointless cast
|
||||
|
||||
if (optional.isPresent()) {
|
||||
- Chunk chunk = (Chunk) optional.get();
|
||||
+ Chunk chunk = optional.get(); // Purpur - remove pointless cast
|
||||
|
||||
this.world.getMethodProfiler().enter("broadcast");
|
||||
this.world.timings.broadcastChunkUpdates.startTiming(); // Paper - timings
|
||||
@@ -686,12 +684,7 @@ public class ChunkProviderServer extends IChunkProvider {
|
||||
// Paper end
|
||||
this.world.getMethodProfiler().enter("spawner");
|
||||
this.world.timings.mobSpawn.startTiming(); // Spigot
|
||||
- EnumCreatureType[] aenumcreaturetype1 = aenumcreaturetype;
|
||||
- int i1 = aenumcreaturetype.length;
|
||||
-
|
||||
- for (int j1 = 0; j1 < i1; ++j1) {
|
||||
- EnumCreatureType enumcreaturetype = aenumcreaturetype1[j1];
|
||||
-
|
||||
+ for (EnumCreatureType enumcreaturetype : aenumcreaturetype) { // Purpur
|
||||
// CraftBukkit start - Use per-world spawn limits
|
||||
int limit = enumcreaturetype.b();
|
||||
switch (enumcreaturetype) {
|
||||
diff --git a/src/main/java/net/minecraft/server/PlayerChunkMap.java b/src/main/java/net/minecraft/server/PlayerChunkMap.java
|
||||
index 57bea926a6..44c2ca1184 100644
|
||||
--- a/src/main/java/net/minecraft/server/PlayerChunkMap.java
|
||||
+++ b/src/main/java/net/minecraft/server/PlayerChunkMap.java
|
||||
@@ -1266,26 +1266,21 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
|
||||
}
|
||||
|
||||
boolean isOutsideOfRange(ChunkCoordIntPair chunkcoordintpair, boolean reducedRange) {
|
||||
- int chunkRange = world.spigotConfig.mobSpawnRange;
|
||||
- chunkRange = (chunkRange > world.spigotConfig.viewDistance) ? (byte) world.spigotConfig.viewDistance : chunkRange;
|
||||
- chunkRange = (chunkRange > 8) ? 8 : chunkRange;
|
||||
-
|
||||
- final int finalChunkRange = chunkRange; // Paper for lambda below
|
||||
- //double blockRange = (reducedRange) ? Math.pow(chunkRange << 4, 2) : 16384.0D; // Paper - use from event
|
||||
+ // Purpur - removed a bunch of crap not used anymore
|
||||
// Spigot end
|
||||
long i = chunkcoordintpair.pair();
|
||||
|
||||
- return !this.chunkDistanceManager.d(i) ? true : this.playerMap.a(i).noneMatch((entityplayer) -> {
|
||||
+ return !this.chunkDistanceManager.hasPlayersNearby(i, !reducedRange) || this.playerMap.a(i).noneMatch((entityplayer) -> { // Purpur
|
||||
// Paper start -
|
||||
- com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent event;
|
||||
+ // com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent event // Purpur - moved down
|
||||
double blockRange = 16384.0D;
|
||||
if (reducedRange) {
|
||||
- event = entityplayer.playerNaturallySpawnedEvent;
|
||||
+ com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent event = entityplayer.playerNaturallySpawnedEvent; // Purpur
|
||||
if (event == null || event.isCancelled()) return false;
|
||||
- blockRange = (double) ((event.getSpawnRadius() << 4) * (event.getSpawnRadius() << 4));
|
||||
+ blockRange = (event.getSpawnRadius() << 4) * (event.getSpawnRadius() << 4); // Purpur - removed pointless cast
|
||||
}
|
||||
|
||||
- return (!entityplayer.isSpectator() && a(chunkcoordintpair, (Entity) entityplayer) < blockRange); // Spigot
|
||||
+ return !entityplayer.isSpectator() && a(chunkcoordintpair, entityplayer) < blockRange; // Spigot // Purpur - remove pointless cast
|
||||
// Paper end
|
||||
});
|
||||
}
|
||||
--
|
||||
2.24.0
|
||||
|
||||
Reference in New Issue
Block a user