2019-07-12 04:04:38 +00:00
|
|
|
From 55ddc6f54f09251d01ec96037f6255769034f70d Mon Sep 17 00:00:00 2001
|
2019-06-13 02:34:18 +00:00
|
|
|
From: kickash32 <kickash32@gmail.com>
|
|
|
|
Date: Sun, 2 Jun 2019 01:22:02 -0400
|
|
|
|
Subject: [PATCH] Actually-Limit-Natural-Spawns-To-Limit
|
|
|
|
|
|
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java
|
2019-07-12 04:04:38 +00:00
|
|
|
index 43da95e60..49b8c1187 100644
|
2019-06-13 02:34:18 +00:00
|
|
|
--- a/src/main/java/net/minecraft/server/ChunkProviderServer.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java
|
2019-07-12 04:04:38 +00:00
|
|
|
@@ -414,8 +414,12 @@ public class ChunkProviderServer extends IChunkProvider {
|
2019-06-13 02:34:18 +00:00
|
|
|
if (enumcreaturetype != EnumCreatureType.MISC && (!enumcreaturetype.c() || this.allowAnimals) && (enumcreaturetype.c() || this.allowMonsters) && (!enumcreaturetype.d() || flag2)) {
|
|
|
|
int k1 = limit * l / ChunkProviderServer.b; // CraftBukkit - use per-world limits
|
|
|
|
|
|
|
|
- if (object2intmap.getInt(enumcreaturetype) <= k1) {
|
|
|
|
- SpawnerCreature.a(enumcreaturetype, (World) this.world, chunk, blockposition);
|
|
|
|
+ // Paper start - only allow spawns upto the limit per chunk and update count afterwards
|
|
|
|
+ int currEntityCount = object2intmap.getInt(enumcreaturetype);
|
|
|
|
+ int difference = k1 - currEntityCount;
|
|
|
|
+ if (difference > 0) {
|
|
|
|
+ object2intmap.put(enumcreaturetype, currEntityCount + SpawnerCreature.spawnMobs(enumcreaturetype, world, chunk, blockposition, difference));
|
|
|
|
+ // Paper end
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/SpawnerCreature.java b/src/main/java/net/minecraft/server/SpawnerCreature.java
|
2019-07-12 04:04:38 +00:00
|
|
|
index 09f1b9d76..b442e09eb 100644
|
2019-06-13 02:34:18 +00:00
|
|
|
--- a/src/main/java/net/minecraft/server/SpawnerCreature.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/SpawnerCreature.java
|
|
|
|
@@ -16,13 +16,20 @@ public final class SpawnerCreature {
|
|
|
|
|
|
|
|
private static final Logger LOGGER = LogManager.getLogger();
|
|
|
|
|
|
|
|
+ // Paper start - add maxSpawns parameter and update counts
|
|
|
|
public static void a(EnumCreatureType enumcreaturetype, World world, Chunk chunk, BlockPosition blockposition) {
|
|
|
|
+ spawnMobs(enumcreaturetype, world, chunk, blockposition, Integer.MAX_VALUE);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public static int spawnMobs(EnumCreatureType enumcreaturetype, World world, Chunk chunk, BlockPosition blockposition, int maxSpawns) {
|
|
|
|
+ // Paper end
|
|
|
|
ChunkGenerator<?> chunkgenerator = world.getChunkProvider().getChunkGenerator();
|
|
|
|
int i = 0;
|
|
|
|
BlockPosition blockposition1 = getRandomPosition(world, chunk);
|
|
|
|
int j = blockposition1.getX();
|
|
|
|
int k = blockposition1.getY();
|
|
|
|
int l = blockposition1.getZ();
|
|
|
|
+ int amountSpawned = 0; // Paper - keep track of mobs spawned
|
|
|
|
|
|
|
|
if (k >= 1) {
|
|
|
|
IBlockData iblockdata = world.getTypeIfLoadedAndInBounds(blockposition1); // Paper - don't load chunks for mob spawn
|
|
|
|
@@ -85,7 +92,7 @@ public final class SpawnerCreature {
|
|
|
|
);
|
|
|
|
if (!event.callEvent()) {
|
|
|
|
if (event.shouldAbortSpawn()) {
|
|
|
|
- return;
|
|
|
|
+ return amountSpawned; // Paper
|
|
|
|
}
|
|
|
|
++i2;
|
|
|
|
continue;
|
|
|
|
@@ -104,7 +111,7 @@ public final class SpawnerCreature {
|
|
|
|
} catch (Exception exception) {
|
|
|
|
SpawnerCreature.LOGGER.warn("Failed to create mob", exception);
|
|
|
|
ServerInternalException.reportInternalException(exception); // Paper
|
|
|
|
- return;
|
|
|
|
+ return amountSpawned; // Paper
|
|
|
|
}
|
|
|
|
|
|
|
|
entityinsentient.setPositionRotation((double) f, (double) k, (double) f1, world.random.nextFloat() * 360.0F, 0.0F);
|
|
|
|
@@ -114,10 +121,17 @@ public final class SpawnerCreature {
|
|
|
|
if (world.addEntity(entityinsentient, SpawnReason.NATURAL)) {
|
|
|
|
++i;
|
|
|
|
++i2;
|
|
|
|
+ // Paper start - stop when limit is reached
|
|
|
|
+ amountSpawned++;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (amountSpawned >= maxSpawns){
|
|
|
|
+ return amountSpawned; // Paper
|
|
|
|
}
|
|
|
|
+ // Paper end
|
|
|
|
// CraftBukkit end
|
2019-06-25 01:47:58 +00:00
|
|
|
if (i >= entityinsentient.dD()) {
|
2019-06-13 02:34:18 +00:00
|
|
|
- return;
|
|
|
|
+ return amountSpawned; // Paper
|
|
|
|
}
|
|
|
|
|
|
|
|
if (entityinsentient.c(i2)) {
|
|
|
|
@@ -142,6 +156,7 @@ public final class SpawnerCreature {
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
+ return amountSpawned; // Paper
|
|
|
|
}
|
|
|
|
|
|
|
|
@Nullable
|
|
|
|
--
|
2019-06-25 01:47:58 +00:00
|
|
|
2.22.0
|
2019-06-13 02:34:18 +00:00
|
|
|
|