From 349a2932baf2172b796df1b0956629a11286c9b8 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath 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> c = new Long2ObjectOpenHashMap(); public final Long2ObjectOpenHashMap>> 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 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 76c7f4a50f..dff40c04cd 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 optional = ((Either) playerchunk.b().getNow(PlayerChunk.UNLOADED_CHUNK)).left(); + Optional 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 @@ -676,12 +674,7 @@ public class ChunkProviderServer extends IChunkProvider { if (flag1 && (this.allowMonsters || this.allowAnimals) && this.world.getWorldBorder().isInBounds(chunk.getPos()) && !this.playerChunkMap.isOutsideOfRange(chunkcoordintpair, true)) { // Spigot 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