Should fix #1280 Citizens hijacks entity map, and im guessing under the right conditions the result might actually be null during entity creation Pre the cache patch, the id is looked up on save, so it was fine. Now, if its null and the save ID is requested, we will try to look it up again and cache it if found.
62 lines
2.9 KiB
Diff
62 lines
2.9 KiB
Diff
From a95213605057d27a9ab8ec79291e1354cee01106 Mon Sep 17 00:00:00 2001
|
|
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.
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
|
|
index e9a44098d9..6c86d3b6bc 100644
|
|
--- a/src/main/java/net/minecraft/server/Chunk.java
|
|
+++ b/src/main/java/net/minecraft/server/Chunk.java
|
|
@@ -714,8 +714,8 @@ public class Chunk {
|
|
i = this.entitySlices.length - 1;
|
|
}
|
|
|
|
- this.entitySlices[i].remove(entity);
|
|
// Paper start
|
|
+ if (!this.entitySlices[i].remove(entity)) { return; }
|
|
entity.setCurrentChunk(null);
|
|
entityCounts.decrement(entity.getMinecraftKeyString());
|
|
if (entity instanceof EntityItem) {
|
|
diff --git a/src/main/java/net/minecraft/server/SpawnerCreature.java b/src/main/java/net/minecraft/server/SpawnerCreature.java
|
|
index 45a83ae995..ed22607d91 100644
|
|
--- a/src/main/java/net/minecraft/server/SpawnerCreature.java
|
|
+++ b/src/main/java/net/minecraft/server/SpawnerCreature.java
|
|
@@ -23,6 +23,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) {
|
|
+ int sum = 0;
|
|
+ for (Chunk c : server.getChunkProviderServer().chunks.values()) {
|
|
+ sum += c.entityCount.get(oClass);
|
|
+ }
|
|
+ return sum;
|
|
+ }
|
|
+ // Paper end
|
|
int i = 0;
|
|
Iterator<Long> 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.18.0
|
|
|