mirror of
https://github.com/Winds-Studio/Leaf.git
synced 2025-12-19 15:09:25 +00:00
* 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
111 lines
7.0 KiB
Diff
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();
|