From d045a56b6353f16bbecc6e71d34198d75de84745 Mon Sep 17 00:00:00 2001 From: md_5 Date: Fri, 21 Jun 2013 17:29:54 +1000 Subject: [PATCH] Fix Mob Spawning Relative to View Distance Changes the mob spawning algorithm to properly account for view distance and the range around players. Needs better documentation. diff --git a/src/main/java/net/minecraft/server/level/ChunkProviderServer.java b/src/main/java/net/minecraft/server/level/ChunkProviderServer.java index 8fd5501a7..03ce15577 100644 --- a/src/main/java/net/minecraft/server/level/ChunkProviderServer.java +++ b/src/main/java/net/minecraft/server/level/ChunkProviderServer.java @@ -441,7 +441,7 @@ public class ChunkProviderServer extends IChunkProvider { if (this.level.isNaturalSpawningAllowed(chunkcoordintpair) && this.chunkMap.anyPlayerCloseEnoughForSpawning(chunkcoordintpair)) { chunk1.incrementInhabitedTime(j); - if (flag2 && (this.spawnEnemies || this.spawnFriendlies) && this.level.getWorldBorder().isWithinBounds(chunkcoordintpair)) { + if (flag2 && (this.spawnEnemies || this.spawnFriendlies) && this.level.getWorldBorder().isWithinBounds(chunkcoordintpair) && this.chunkMap.anyPlayerCloseEnoughForSpawning(chunkcoordintpair, true)) { // Spigot SpawnerCreature.spawnForChunk(this.level, chunk1, spawnercreature_d, this.spawnFriendlies, this.spawnEnemies, flag1); } diff --git a/src/main/java/net/minecraft/server/level/PlayerChunkMap.java b/src/main/java/net/minecraft/server/level/PlayerChunkMap.java index 06b684300..0bf98b0a9 100644 --- a/src/main/java/net/minecraft/server/level/PlayerChunkMap.java +++ b/src/main/java/net/minecraft/server/level/PlayerChunkMap.java @@ -1069,6 +1069,17 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.e { } boolean anyPlayerCloseEnoughForSpawning(ChunkCoordIntPair chunkcoordintpair) { + // Spigot start + return anyPlayerCloseEnoughForSpawning(chunkcoordintpair, false); + } + + boolean anyPlayerCloseEnoughForSpawning(ChunkCoordIntPair chunkcoordintpair, boolean reducedRange) { + int chunkRange = level.spigotConfig.mobSpawnRange; + chunkRange = (chunkRange > level.spigotConfig.viewDistance) ? (byte) level.spigotConfig.viewDistance : chunkRange; + chunkRange = (chunkRange > 8) ? 8 : chunkRange; + + double blockRange = (reducedRange) ? Math.pow(chunkRange << 4, 2) : 16384.0D; + // Spigot end long i = chunkcoordintpair.toLong(); if (!this.distanceManager.hasPlayersNearby(i)) { @@ -1084,7 +1095,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.e { } entityplayer = (EntityPlayer) iterator.next(); - } while (!this.playerIsCloseEnoughForSpawning(entityplayer, chunkcoordintpair)); + } while (!this.playerIsCloseEnoughForSpawning(entityplayer, chunkcoordintpair, blockRange)); // Spigot return true; } @@ -1102,7 +1113,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.e { while (iterator.hasNext()) { EntityPlayer entityplayer = (EntityPlayer) iterator.next(); - if (this.playerIsCloseEnoughForSpawning(entityplayer, chunkcoordintpair)) { + if (this.playerIsCloseEnoughForSpawning(entityplayer, chunkcoordintpair, 16384.0D)) { // Spigot builder.add(entityplayer); } } @@ -1111,13 +1122,13 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.e { } } - private boolean playerIsCloseEnoughForSpawning(EntityPlayer entityplayer, ChunkCoordIntPair chunkcoordintpair) { + private boolean playerIsCloseEnoughForSpawning(EntityPlayer entityplayer, ChunkCoordIntPair chunkcoordintpair, double range) { // Spigot if (entityplayer.isSpectator()) { return false; } else { double d0 = euclideanDistanceSquared(chunkcoordintpair, entityplayer); - return d0 < 16384.0D; + return d0 < range; // Spigot } } diff --git a/src/main/java/org/spigotmc/SpigotWorldConfig.java b/src/main/java/org/spigotmc/SpigotWorldConfig.java index e5df553a9..55af2f874 100644 --- a/src/main/java/org/spigotmc/SpigotWorldConfig.java +++ b/src/main/java/org/spigotmc/SpigotWorldConfig.java @@ -174,4 +174,11 @@ public class SpigotWorldConfig log( "Simulation Distance: " + simulationDistance ); } + + public byte mobSpawnRange; + private void mobSpawnRange() + { + mobSpawnRange = (byte) getInt( "mob-spawn-range", 6 ); + log( "Mob Spawn Range: " + mobSpawnRange ); + } } -- 2.34.1