diff --git a/leaf-server/paper-patches/features/0057-optimize-mob-spawning.patch b/leaf-server/paper-patches/features/0057-optimize-mob-spawning.patch index f03458be..e18822f1 100644 --- a/leaf-server/paper-patches/features/0057-optimize-mob-spawning.patch +++ b/leaf-server/paper-patches/features/0057-optimize-mob-spawning.patch @@ -4,6 +4,92 @@ 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