From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: hayanesuru Date: Sat, 5 Jul 2025 17:01:43 +0900 Subject: [PATCH] optimize mob spawning diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java index dfafd3125438b6a74f15a749599acfd00918c50a..034d136bcaa894d8999fc51a53d66b40bb884ccd 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -296,7 +296,8 @@ public final class CraftServer implements Server { private final EntityMetadataStore entityMetadata = new EntityMetadataStore(); private final PlayerMetadataStore playerMetadata = new PlayerMetadataStore(); private final WorldMetadataStore worldMetadata = new WorldMetadataStore(); - private final Object2IntOpenHashMap spawnCategoryLimit = new Object2IntOpenHashMap<>(); + private static final SpawnCategory[] SPAWN_CATEGORIES = SpawnCategory.values(); // Leaf - optimize mob spawning + private final int[] spawnCategoryLimit = new int[SPAWN_CATEGORIES.length]; // Leaf - optimize mob spawning private File container; private WarningState warningState = WarningState.DEFAULT; public ApiVersion minimumAPI; @@ -497,6 +498,7 @@ public final class CraftServer implements Server { this.saveCommandsConfig(); this.overrideAllCommandBlockCommands = this.commandsConfiguration.getStringList("command-block-overrides").contains("*"); this.ignoreVanillaPermissions = this.commandsConfiguration.getBoolean("ignore-vanilla-permissions"); + java.util.Arrays.fill(spawnCategoryLimit, -1); // Leaf - optimize mob spawning this.overrideSpawnLimits(); console.autosavePeriod = this.configuration.getInt("ticks-per.autosave"); this.warningState = WarningState.value(this.configuration.getString("settings.deprecated-verbose")); @@ -529,9 +531,9 @@ public final class CraftServer implements Server { } private void overrideSpawnLimits() { - for (SpawnCategory spawnCategory : SpawnCategory.values()) { + for (SpawnCategory spawnCategory : SPAWN_CATEGORIES) { // Leaf - optimize mob spawning if (CraftSpawnCategory.isValidForLimits(spawnCategory)) { - this.spawnCategoryLimit.put(spawnCategory, this.configuration.getInt(CraftSpawnCategory.getConfigNameSpawnLimit(spawnCategory))); + this.spawnCategoryLimit[spawnCategory.ordinal()] = this.configuration.getInt(CraftSpawnCategory.getConfigNameSpawnLimit(spawnCategory)); // Leaf - optimize mob spawning } } } @@ -2544,7 +2546,7 @@ public final class CraftServer implements Server { } public int getSpawnLimitUnsafe(final SpawnCategory spawnCategory) { - return this.spawnCategoryLimit.getOrDefault(spawnCategory, -1); + return this.spawnCategoryLimit[spawnCategory.ordinal()]; // Leaf - optimize mob spawning } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java index ee5f342995a335593932a497c2bafd36d34cecb2..2523cd17ad4a3add3a9a420777dc49fe0658fe01 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -173,7 +173,8 @@ public class CraftWorld extends CraftRegionAccessor implements World { private final @Nullable BiomeProvider biomeProvider; private final List populators = new ArrayList(); private final BlockMetadataStore blockMetadata = new BlockMetadataStore(this); - private final Object2IntOpenHashMap spawnCategoryLimit = new Object2IntOpenHashMap<>(); + private static final SpawnCategory[] SPAWN_CATEGORIES = SpawnCategory.values(); // Leaf - optimize mob spawning + private final int[] spawnCategoryLimit = new int[SPAWN_CATEGORIES.length]; // Leaf - optimize mob spawning private final CraftPersistentDataContainer persistentDataContainer = new CraftPersistentDataContainer(CraftWorld.DATA_TYPE_REGISTRY); // Paper start - void damage configuration private boolean voidDamageEnabled; @@ -303,8 +304,9 @@ public class CraftWorld extends CraftRegionAccessor implements World { this.biomeProvider = biomeProvider; this.environment = environment; + Arrays.fill(spawnCategoryLimit, -1); // Leaf - optimize mob spawning // Paper start - per world spawn limits - for (SpawnCategory spawnCategory : SpawnCategory.values()) { + for (SpawnCategory spawnCategory : SPAWN_CATEGORIES) { // Leaf - optimize mob spawning if (CraftSpawnCategory.isValidForLimits(spawnCategory)) { setSpawnLimit(spawnCategory, this.world.paperConfig().entities.spawning.spawnLimits.getInt(CraftSpawnCategory.toNMS(spawnCategory))); } @@ -1868,7 +1870,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { return this.getSpawnLimitUnsafe(spawnCategory); } public final int getSpawnLimitUnsafe(final SpawnCategory spawnCategory) { - int limit = this.spawnCategoryLimit.getOrDefault(spawnCategory, -1); + int limit = this.spawnCategoryLimit[spawnCategory.ordinal()]; // Leaf - optimize mob spawning if (limit < 0) { limit = this.server.getSpawnLimitUnsafe(spawnCategory); // Paper end - Add mobcaps commands @@ -1881,7 +1883,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { Preconditions.checkArgument(spawnCategory != null, "SpawnCategory cannot be null"); Preconditions.checkArgument(CraftSpawnCategory.isValidForLimits(spawnCategory), "SpawnCategory.%s are not supported", spawnCategory); - this.spawnCategoryLimit.put(spawnCategory, limit); + this.spawnCategoryLimit[spawnCategory.ordinal()] = limit; // Leaf - optimize mob spawning } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java b/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java index 348bf5ed91ded3537a86bc0708e0158ad4f9296d..7a7d0b8c0b5e6d9b58ca973972bac488975e6e2a 100644 --- a/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java +++ b/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java @@ -290,6 +290,13 @@ public class CustomChunkGenerator extends InternalChunkGenerator { return this.delegate.getMobsAt(biome, accessor, group, pos); } + // Leaf start + @Override + public WeightedList getMobsAtChunk(Holder biome, StructureManager accessor, MobCategory group, BlockPos pos, ChunkAccess chunk) { + return this.delegate.getMobsAtChunk(biome, accessor, group, pos, chunk); + } + // Leaf end + @Override public void applyBiomeDecoration(WorldGenLevel level, ChunkAccess chunk, StructureManager structureManager) { WorldgenRandom random = CustomChunkGenerator.getSeededRandom();