From 612c06073940d88a5cc84b9783112453b9ed55f1 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath 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 e2abda1bc..8ffb2e6b7 100644 --- a/src/main/java/net/minecraft/server/ChunkProviderServer.java +++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java @@ -767,11 +767,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"); @@ -817,40 +818,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