9
0
mirror of https://github.com/Winds-Studio/Leaf.git synced 2025-12-19 15:09:25 +00:00
Files
Leaf/leaf-server/paper-patches/features/0056-optimize-mob-spawning.patch
2025-09-28 05:15:11 -04:00

111 lines
6.9 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: hayanesuru <hayanesuru@outlook.jp>
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 b78f6e56a993240fd2b329b64265c728631ca907..8c27cf7144ca27e6a4a5df0076cecb08a233afcf 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -285,7 +285,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<SpawnCategory> 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;
@@ -483,6 +484,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"));
@@ -514,9 +516,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
}
}
}
@@ -2384,7 +2386,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 9df1110696fdd235b5664f8ddbf4a0ca74bd78e9..b32d80d07fc8542ea7b3a2c0db68618fce08e7d9 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
@@ -174,7 +174,8 @@ public class CraftWorld extends CraftRegionAccessor implements World {
private final @Nullable BiomeProvider biomeProvider;
private final List<BlockPopulator> populators = new ArrayList<>();
private final BlockMetadataStore blockMetadata = new BlockMetadataStore(this);
- private final Object2IntOpenHashMap<SpawnCategory> 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;
@@ -304,8 +305,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)));
}
@@ -1543,7 +1545,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
}
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);
}
@@ -1555,7 +1557,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<MobSpawnSettings.SpawnerData> getMobsAtChunk(Holder<net.minecraft.world.level.biome.Biome> 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();