mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-18 00:47:42 +01:00
Upstream has released updates that appears to apply and compile correctly Paper Changes: cf82dad3 Fix Non Full Status Chunk NBT Memory Leak 5a12515a Update Log4J Configuration file to stop truncating stack traces 7c001d64 More Improvements to Chunks e1c45196 Fix high memory use of non ticking chunks ee9f0d51 Fix another case of breaking blocks causing sync chunk loads 6009ba8f Drop AABB limit patch until it can be tested more 0e9c24e5 Fix log spam about Hanging entities bounding boxes 83fadad7 Fix conversion for deserializing raw nbt itemstacks - Fixes #3424 4d38ee11 Many fixes and improvements to chunk prioritization 281181c7 Use saner Entity bounding box limits edd6b6a2 Protect the visible chunk map from plugins touching it, trim Timing Errors 18c68657 Optimize performance of object pool 7e1525ea Many improvements to chunk prioritization and bug fixes c82b292a Fix pooled buffer leak resulting in dynmap black spots - Fixes #3386 63274472 Fix ./paper edit continue for Windows eb5a3058 Fix path in CONTRIBUTING.md (#3406) f6ed326d Fix a small error in CONTRIBUTING.md (#3403) 614a664b Implement Chunk Priority / Urgency System for Chunks
112 lines
6.5 KiB
Diff
112 lines
6.5 KiB
Diff
From 996bfc559c8d08e6ba40434b6dd1ef37778779e9 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 54e89c9cc..9af2c5c74 100644
|
|
--- a/src/main/java/net/minecraft/server/ChunkProviderServer.java
|
|
+++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java
|
|
@@ -781,11 +781,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");
|
|
@@ -831,40 +832,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 3ed7fa324..7f236585d 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
|
|
|