mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-17 16:37:43 +01:00
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
112 lines
6.6 KiB
Diff
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
|
|
|