From 77cdcc281b88669ab21c88fc8bb3de05025c1eb1 Mon Sep 17 00:00:00 2001 From: Aikar Date: Thu, 14 Apr 2016 21:03:57 -0400 Subject: [PATCH] Fix Bugs with Spigot Mob Spawn Logic - Fixes #138 Spigot drastically altered vanilla mob spawn logic and caused a few issues. 1) Used only spawnable chunks vs entire world for entity counting, resulting in ignoring other entities in the world, and causing the world to go over its intended limit. Specially with servers using smaller mob spawn ranges than view distance, as well as affects spawning API 2) Spigot was using 16x16 division instead of vanilla 17x17 division. Issues got worse in 1.9 due to more chunks being loaded due to 1.9 changes, that fall out of the monster spawn radius. This patch returns mob counting to use all loaded chunks, and 17x17 division. --- ...Fix-Bugs-with-Spigot-Mob-Spawn-Logic.patch | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 Spigot-Server-Patches/0140-Fix-Bugs-with-Spigot-Mob-Spawn-Logic.patch diff --git a/Spigot-Server-Patches/0140-Fix-Bugs-with-Spigot-Mob-Spawn-Logic.patch b/Spigot-Server-Patches/0140-Fix-Bugs-with-Spigot-Mob-Spawn-Logic.patch new file mode 100644 index 0000000000..82ae922c24 --- /dev/null +++ b/Spigot-Server-Patches/0140-Fix-Bugs-with-Spigot-Mob-Spawn-Logic.patch @@ -0,0 +1,47 @@ +From 8ff5e997fd6df8487be017803e257e0b664e4886 Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Thu, 14 Apr 2016 21:01:39 -0400 +Subject: [PATCH] Fix Bugs with Spigot Mob Spawn Logic + +Spigot drastically altered vanilla mob spawn logic and caused a few issues. +1) Used only spawnable chunks vs entire world for entity counting, resulting in ignoring +other entities in the world, and causing the world to go over its intended limit. + +Specially with servers using smaller mob spawn ranges than view distance, as well as affects spawning API + +2) Spigot was using 16x16 division instead of vanilla 17x17 division. + +This patch returns mob counting to use all loaded chunks, and 17x17 division. + +diff --git a/src/main/java/net/minecraft/server/SpawnerCreature.java b/src/main/java/net/minecraft/server/SpawnerCreature.java +index 15a0ce9..b47feb2 100644 +--- a/src/main/java/net/minecraft/server/SpawnerCreature.java ++++ b/src/main/java/net/minecraft/server/SpawnerCreature.java +@@ -21,6 +21,15 @@ public final class SpawnerCreature { + // Spigot start - get entity count only from chunks being processed in b + private int getEntityCount(WorldServer server, Class oClass) + { ++ // Paper start - use entire world, not just active chunks. Spigot broke vanilla expectations. ++ if (true) { ++ return server ++ .getChunkProviderServer() ++ .chunks.values() ++ .stream() ++ .collect(java.util.stream.Collectors.summingInt(c -> c.entityCount.get(oClass))); ++ } ++ // Paper end + int i = 0; + Iterator it = this.b.iterator(); + while ( it.hasNext() ) +@@ -126,7 +135,7 @@ public final class SpawnerCreature { + int l1 = limit * i / a; // CraftBukkit - use per-world limits + */ // Paper end + +- if ((mobcnt = getEntityCount(worldserver, enumcreaturetype.a())) <= limit * i / 256) { ++ if ((mobcnt = getEntityCount(worldserver, enumcreaturetype.a())) <= limit * i / 289) { // Paper - use 17x17 like vanilla (a at top of file) + BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition(); + Iterator iterator1 = this.b.iterator(); + +-- +2.8.1 +