From 9de0fdaca70d7c4ac8664f3566e83f106d467c68 Mon Sep 17 00:00:00 2001 From: Elias Date: Sat, 19 Sep 2026 12:45:24 +0200 Subject: [PATCH 1/6] Update SpawnerCreature.java --- .../net/minecraft/server/SpawnerCreature.java | 40 +++++++++---------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/WindSpigot-Server/src/main/java/net/minecraft/server/SpawnerCreature.java b/WindSpigot-Server/src/main/java/net/minecraft/server/SpawnerCreature.java index 5bd8b95e..b1a77298 100644 --- a/WindSpigot-Server/src/main/java/net/minecraft/server/SpawnerCreature.java +++ b/WindSpigot-Server/src/main/java/net/minecraft/server/SpawnerCreature.java @@ -20,27 +20,23 @@ public SpawnerCreature() { } // Spigot start - get entity count only from chunks being processed in b - private int getEntityCount(WorldServer server, Class oClass) { - // PandaSpigot start - use entire world, not just active chunks. Spigot broke vanilla expectations. - int sum = 0; - for (Chunk c : server.chunkProviderServer.chunks.values()) { - sum += c.entityCount.getInt(oClass); // SportPaper: trove -> fastutil - } - return sum; - // PandaSpigot end -// int i = 0; -// Iterator it = this.b.iterator(); -// while ( it.hasNext() ) -// { -// Long coord = it.next(); -// int x = LongHash.msw( coord ); -// int z = LongHash.lsw( coord ); -// if ( !server.chunkProviderServer.unloadQueue.contains( coord ) && server.isChunkLoaded( x, z, true ) ) -// { -// i += server.getChunkAt( x, z ).entityCount.get( oClass ); -// } -// } -// return i; + private int getEntityCount(WorldServer server, Class oClass) { + int i = 0; + Iterator it = this.b.iterator(); + while (it.hasNext()) { + Long coord = it.next(); + int x = LongHash.msw(coord); + int z = LongHash.lsw(coord); + if (!server.chunkProviderServer.unloadQueue.contains(coord) && server.isChunkLoaded(x, z, true)) { + // FalchusSpigot start + Chunk chunk = server.getChunkAt(x, z); + if (chunk != null) { + // FalchusSpigot end + i += chunk.entityCount.getInt(oClass); + } + } + } + return i; } // Spigot end @@ -58,7 +54,7 @@ public int a(WorldServer worldserver, boolean flag, boolean flag1, boolean flag2 while (iterator.hasNext()) { EntityHuman entityhuman = iterator.next(); - if (!entityhuman.isSpectator() || !entityhuman.affectsSpawning) { // PaperSpigot + if (!entityhuman.isSpectator() && entityhuman.affectsSpawning) { // PaperSpigot int l = MathHelper.floor(entityhuman.locX / 16.0D); j = MathHelper.floor(entityhuman.locZ / 16.0D); From 5054b066ffce6e9c0b7739b9b787559f0d1f4313 Mon Sep 17 00:00:00 2001 From: Elias Date: Sat, 19 Sep 2026 12:57:42 +0200 Subject: [PATCH 2/6] Update Chunk.java --- WindSpigot-Server/src/main/java/net/minecraft/server/Chunk.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WindSpigot-Server/src/main/java/net/minecraft/server/Chunk.java b/WindSpigot-Server/src/main/java/net/minecraft/server/Chunk.java index a7fbd717..3a5b6a90 100644 --- a/WindSpigot-Server/src/main/java/net/minecraft/server/Chunk.java +++ b/WindSpigot-Server/src/main/java/net/minecraft/server/Chunk.java @@ -861,7 +861,7 @@ public void a(Entity entity, int i) { i = this.entitySlices.length - 1; } - if (!this.entitySlices[i].remove(entity)) return; // PandaSpigot + this.entitySlices[i].remove(entity); // PaperSpigot start - update counts if (entity instanceof EntityItem) { itemCounts[i]--; From 295df2fee4df5aa62768c88fd7a8fccd7a84f546 Mon Sep 17 00:00:00 2001 From: Elias Date: Sat, 19 Sep 2026 12:58:09 +0200 Subject: [PATCH 3/6] Update SpawnerCreature.java --- .../src/main/java/net/minecraft/server/SpawnerCreature.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WindSpigot-Server/src/main/java/net/minecraft/server/SpawnerCreature.java b/WindSpigot-Server/src/main/java/net/minecraft/server/SpawnerCreature.java index b1a77298..d495ea34 100644 --- a/WindSpigot-Server/src/main/java/net/minecraft/server/SpawnerCreature.java +++ b/WindSpigot-Server/src/main/java/net/minecraft/server/SpawnerCreature.java @@ -125,10 +125,10 @@ public int a(WorldServer worldserver, boolean flag, boolean flag1, boolean flag2 * CraftBukkit - use per-world limits */ - if ((mobcnt = getEntityCount(worldserver, enumcreaturetype.a())) <= limit * i / 289) { // PandaSpigot - use 17x17 like vanilla (a at top of file) + if ((mobcnt = getEntityCount(worldserver, enumcreaturetype.a())) <= limit * i / 256) { Iterator iterator1 = this.b.iterator(); - int moblimit = (limit * i / 289) - mobcnt + 1; // Spigot - up to 1 more than limit // PandaSpigot - use 17x17 like vanilla (a at top of file) + int moblimit = (limit * i / 256) - mobcnt + 1; // Spigot - up to 1 more than limit label115: while (iterator1.hasNext() && (moblimit > 0)) { // Spigot - while more allowed // CraftBukkit start = use LongHash // and LongObjectHashMap From 220f61df85fd77a541e19294e03004899ab948ab Mon Sep 17 00:00:00 2001 From: Elias Date: Sat, 19 Sep 2026 13:11:32 +0200 Subject: [PATCH 4/6] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index d958f874..03ef511d 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,6 @@ See the patches list below. [WindSpigot-0017] Configurable fishing rod speed multiplier [PandaSpigot-0115] Break up and make tab spam limits configurable -[PandaSpigot-0072] Fix Bugs with Spigot Mob Spawn Logic [PandaSpigot-0105] Fix SPIGOT-2622: Only one player receiving the server shutdown message [PandaSpigot-0060] Backport SPIGOT-5428: Better handling of some ItemMeta [PandaSpigot-0130] Backport Fix SPIGOT-3348: Skin Cache Bug From 6cfb6eeaa6e2fde15260b984f51aa6e30be59359 Mon Sep 17 00:00:00 2001 From: Elias Date: Sat, 19 Sep 2026 13:13:48 +0200 Subject: [PATCH 5/6] Update Chunk.java --- WindSpigot-Server/src/main/java/net/minecraft/server/Chunk.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WindSpigot-Server/src/main/java/net/minecraft/server/Chunk.java b/WindSpigot-Server/src/main/java/net/minecraft/server/Chunk.java index 3a5b6a90..a7fbd717 100644 --- a/WindSpigot-Server/src/main/java/net/minecraft/server/Chunk.java +++ b/WindSpigot-Server/src/main/java/net/minecraft/server/Chunk.java @@ -861,7 +861,7 @@ public void a(Entity entity, int i) { i = this.entitySlices.length - 1; } - this.entitySlices[i].remove(entity); + if (!this.entitySlices[i].remove(entity)) return; // PandaSpigot // PaperSpigot start - update counts if (entity instanceof EntityItem) { itemCounts[i]--; From 15dd967e83b68c3d70af4246683b625fc7d752dd Mon Sep 17 00:00:00 2001 From: Elias Date: Sat, 19 Sep 2026 13:17:24 +0200 Subject: [PATCH 6/6] Update SpawnerCreature.java --- .../src/main/java/net/minecraft/server/SpawnerCreature.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WindSpigot-Server/src/main/java/net/minecraft/server/SpawnerCreature.java b/WindSpigot-Server/src/main/java/net/minecraft/server/SpawnerCreature.java index d495ea34..f5caefbd 100644 --- a/WindSpigot-Server/src/main/java/net/minecraft/server/SpawnerCreature.java +++ b/WindSpigot-Server/src/main/java/net/minecraft/server/SpawnerCreature.java @@ -125,10 +125,10 @@ public int a(WorldServer worldserver, boolean flag, boolean flag1, boolean flag2 * CraftBukkit - use per-world limits */ - if ((mobcnt = getEntityCount(worldserver, enumcreaturetype.a())) <= limit * i / 256) { + if ((mobcnt = getEntityCount(worldserver, enumcreaturetype.a())) <= limit * i / a) { Iterator iterator1 = this.b.iterator(); - int moblimit = (limit * i / 256) - mobcnt + 1; // Spigot - up to 1 more than limit + int moblimit = (limit * i / a) - mobcnt + 1; // Spigot - up to 1 more than limit label115: while (iterator1.hasNext() && (moblimit > 0)) { // Spigot - while more allowed // CraftBukkit start = use LongHash // and LongObjectHashMap