Files
Purpur/patches/server/0103-Optimize-Chunk-Ticks.patch
William Blake Galbreath a2b3b33061 Updated Upstream (Paper)
Upstream has released updates that appears to apply and compile correctly

Paper Changes:
b0b54e4e Optimize Villager Pathfinding - Massive Villager Improvement
33a2134b Workaround for really evil plugins breaking sounds
b88ee11f Don't unregister the primary dimensions on world unload
21f9efa2 Improve implementation of chunk leak clean to not run as often
7ee71146 Add missing null check for structure start chunk access
b12177fb One more to seal the deal to improve unloading inactive chunks
78ee3b4e Restore a condition I accidently removed in last build
88a68829 Fix unloading inaccessible chunks too fast regressing gen speed
210a32f2 Unload leaked Cached Chunks
c9795e92 Fix Spigot bug with chunk unloading
2020-05-27 09:24:51 -05:00

112 lines
6.6 KiB
Diff

From a75f52ba9053f7276ad8e6a950381c9c2e35f7d8 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
Date: Thu, 2 Apr 2020 00:28:06 -0500
Subject: [PATCH] Optimize Chunk Ticks
---
.../minecraft/server/ChunkProviderServer.java | 50 ++++---------------
.../minecraft/server/EnumCreatureType.java | 14 ++++++
2 files changed, 25 insertions(+), 39 deletions(-)
diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java
index 1209fbf1c9..0ebd2f8799 100644
--- a/src/main/java/net/minecraft/server/ChunkProviderServer.java
+++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java
@@ -782,11 +782,12 @@ public class ChunkProviderServer extends IChunkProvider {
int k = this.world.getGameRules().getInt(GameRules.RANDOM_TICK_SPEED);
BlockPosition blockposition = this.world.getSpawn();
// CraftBukkit start - Other mob type spawn tick rate
- boolean spawnAnimalThisTick = world.ticksPerAnimalSpawns != 0L && worlddata.getTime() % world.ticksPerAnimalSpawns == 0L;
- boolean spawnMonsterThisTick = world.ticksPerMonsterSpawns != 0L && worlddata.getTime() % world.ticksPerMonsterSpawns == 0L;
- boolean spawnWaterThisTick = world.ticksPerWaterSpawns != 0L && worlddata.getTime() % world.ticksPerWaterSpawns == 0L;
- boolean spawnAmbientThisTick = world.ticksPerAmbientSpawns != 0L && worlddata.getTime() % world.ticksPerAmbientSpawns == 0L;
- boolean flag2 = spawnAnimalThisTick;
+ // Purpur start
+ EnumCreatureType.CREATURE.setLimitThisTick(world.ticksPerAnimalSpawns != 0L && i % world.ticksPerAnimalSpawns == 0L ? world.getWorld().getAnimalSpawnLimit() : -1);
+ EnumCreatureType.MONSTER.setLimitThisTick(world.ticksPerMonsterSpawns != 0L && i % world.ticksPerMonsterSpawns == 0L ? world.getWorld().getMonsterSpawnLimit() : -1);
+ EnumCreatureType.WATER_CREATURE.setLimitThisTick(world.ticksPerWaterSpawns != 0L && i % world.ticksPerWaterSpawns == 0L ? world.getWorld().getWaterAnimalSpawnLimit() : -1);
+ EnumCreatureType.AMBIENT.setLimitThisTick(world.ticksPerAmbientSpawns != 0L && i % world.ticksPerAmbientSpawns == 0L ? world.getWorld().getAmbientSpawnLimit() : -1);
+ // Purpur end
// CraftBukkit end
this.world.getMethodProfiler().enter("naturalSpawnCount");
@@ -833,40 +834,11 @@ public class ChunkProviderServer extends IChunkProvider {
if (flag1 && (this.allowMonsters || this.allowAnimals) && this.world.getWorldBorder().isInBounds(chunk.getPos()) && !this.playerChunkMap.isOutsideOfRange(playerchunk, chunkcoordintpair, true)) { // Spigot // Paper - optimise isOutsideOfRange
this.world.getMethodProfiler().enter("spawner");
this.world.timings.mobSpawn.startTiming(); // Spigot
- EnumCreatureType[] aenumcreaturetype1 = aenumcreaturetype;
- int i1 = aenumcreaturetype.length;
-
- for (int j1 = 0; j1 < i1; ++j1) {
- EnumCreatureType enumcreaturetype = aenumcreaturetype1[j1];
-
- // CraftBukkit start - Use per-world spawn limits
- boolean spawnThisTick = true;
- int limit = enumcreaturetype.b();
- switch (enumcreaturetype) {
- case MONSTER:
- spawnThisTick = spawnMonsterThisTick;
- limit = world.getWorld().getMonsterSpawnLimit();
- break;
- case CREATURE:
- spawnThisTick = spawnAnimalThisTick;
- limit = world.getWorld().getAnimalSpawnLimit();
- break;
- case WATER_CREATURE:
- spawnThisTick = spawnWaterThisTick;
- limit = world.getWorld().getWaterAnimalSpawnLimit();
- break;
- case AMBIENT:
- spawnThisTick = spawnAmbientThisTick;
- limit = world.getWorld().getAmbientSpawnLimit();
- break;
- }
-
- if (!spawnThisTick || limit == 0) {
- continue;
- }
- // CraftBukkit end
-
- if (enumcreaturetype != EnumCreatureType.MISC && (!enumcreaturetype.c() || this.allowAnimals) && (enumcreaturetype.c() || this.allowMonsters) && (!enumcreaturetype.d() || flag2)) {
+ // Purpur start
+ for (EnumCreatureType enumcreaturetype : aenumcreaturetype) {
+ int limit = enumcreaturetype.getLimitThisTick();
+ if (limit > 0 && enumcreaturetype != EnumCreatureType.MISC && (!enumcreaturetype.isFriendly() || this.allowAnimals) && (enumcreaturetype.isFriendly() || this.allowMonsters)) {
+ // Purpur end
int k1 = limit * l / ChunkProviderServer.b; // CraftBukkit - use per-world limits
// Paper start - only allow spawns upto the limit per chunk and update count afterwards
diff --git a/src/main/java/net/minecraft/server/EnumCreatureType.java b/src/main/java/net/minecraft/server/EnumCreatureType.java
index 3ed7fa324f..7f236585db 100644
--- a/src/main/java/net/minecraft/server/EnumCreatureType.java
+++ b/src/main/java/net/minecraft/server/EnumCreatureType.java
@@ -31,11 +31,25 @@ public enum EnumCreatureType {
return this.g;
}
+ public boolean isFriendly() { return c(); } // Purpur - OBFHELPER
public boolean c() {
return this.h;
}
+ public boolean isPersistent() { return d(); } // Purpur - OBFHELPER
public boolean d() {
return this.i;
}
+
+ // Purpur start
+ private int limitThisTick = -1;
+
+ void setLimitThisTick(int cap) {
+ this.limitThisTick = cap;
+ }
+
+ int getLimitThisTick() {
+ return this.limitThisTick;
+ }
+ // Purpur end
}
--
2.24.0