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/0057-optimize-mob-spawning.patch
Dreeam 35ac5d48ed Cleanup PWT (#533)
* Unify comment format
* More configurable
* Remove one extra execute mid-tick task call in level tick when PWT is disabled

This may cause extremely rare, weird, strange, magic, mysterious issues with plugins, or potentially more.

One example is that it may cause boss mob duplication issue when `ONE MOB ONLY` was enabled in plugin SupremeBosses
2025-10-25 07:41:43 -04:00

111 lines
7.0 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 c3ee0170aa8d74a1f0089d73d9df7e6f049eb067..7a5bda878ff77d20a9ea11e8ac879cebcec2f63d 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<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;
@@ -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 abbbfc2afba2a0580537c49d40bd8b044dcdbfa7..afbd170c766206e0ad58a59c828128317d7b853b 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<BlockPopulator> populators = new ArrayList<BlockPopulator>();
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;
@@ -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)));
}
@@ -1865,7 +1867,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
@@ -1878,7 +1880,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();