2017-03-25 06:22:02 +01:00
|
|
|
From 4a13aab793f8a1c300970852cb4fb20b8b97b963 Mon Sep 17 00:00:00 2001
|
2016-04-15 03:03:57 +02:00
|
|
|
From: Aikar <aikar@aikar.co>
|
|
|
|
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.
|
|
|
|
|
2016-04-16 03:31:12 +02:00
|
|
|
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
|
2017-03-25 06:22:02 +01:00
|
|
|
index 61d34fc37..a6cf1d83d 100644
|
2016-04-16 03:31:12 +02:00
|
|
|
--- a/src/main/java/net/minecraft/server/Chunk.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/Chunk.java
|
2016-06-23 04:43:02 +02:00
|
|
|
@@ -680,7 +680,7 @@ public class Chunk {
|
2016-04-16 03:31:12 +02:00
|
|
|
i = this.entitySlices.length - 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
- this.entitySlices[i].remove(entity);
|
|
|
|
+ if (!this.entitySlices[i].remove(entity)) { return; } // Paper
|
|
|
|
// Paper start - update counts
|
|
|
|
if (entity instanceof EntityItem) {
|
|
|
|
itemCounts[i]--;
|
2016-04-15 03:03:57 +02:00
|
|
|
diff --git a/src/main/java/net/minecraft/server/SpawnerCreature.java b/src/main/java/net/minecraft/server/SpawnerCreature.java
|
2017-03-25 06:22:02 +01:00
|
|
|
index c95fb7f30..0a7a31086 100644
|
2016-04-15 03:03:57 +02:00
|
|
|
--- a/src/main/java/net/minecraft/server/SpawnerCreature.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/SpawnerCreature.java
|
2016-07-16 00:36:53 +02:00
|
|
|
@@ -23,6 +23,15 @@ public final class SpawnerCreature {
|
2016-04-15 03:03:57 +02:00
|
|
|
// 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<Long> it = this.b.iterator();
|
|
|
|
while ( it.hasNext() )
|
2016-11-17 03:23:38 +01:00
|
|
|
@@ -126,7 +135,7 @@ public final class SpawnerCreature {
|
2016-04-15 03:03:57 +02:00
|
|
|
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();
|
|
|
|
|
|
|
|
--
|
2017-03-25 06:22:02 +01:00
|
|
|
2.12.0.windows.1
|
2016-04-15 03:03:57 +02:00
|
|
|
|