Add seed validation for server world creation and override-seed property

The dedicated server previously picked a completely random seed with no
biome diversity checks (the client validates but the server skipped it).
On top of that, the client's findSeed() was hardcoded to only check a
54-chunk (Classic) area, so Large worlds had no diversity guarantee
beyond the center.

New server worlds now use findSeed() scaled to the full target world
size. Added override-seed in server.properties to fix existing worlds
without deleting them.
This commit is contained in:
itsRevela
2026-03-24 13:07:04 -05:00
parent 5dad6c24f7
commit 08f14e32ae
10 changed files with 66 additions and 9 deletions

View File

@@ -28,6 +28,8 @@
#include "../../Minecraft.World/TilePos.h"
#include "../../Minecraft.World/compression.h"
#include "../../Minecraft.World/OldChunkStorage.h"
#include "../../Minecraft.World/BiomeSource.h"
#include "../../Minecraft.World/LevelType.h"
#include "../../Minecraft.World/net.minecraft.world.level.tile.h"
#include "../../Minecraft.World/Random.h"
@@ -545,6 +547,12 @@ int main(int argc, char **argv)
app.SetGameNewHellScale(serverProperties.worldHellScale);
#endif
if (serverProperties.hasOverrideSeed)
{
LogInfof("startup", "Seed override active: %lld", serverProperties.overrideSeed);
app.SetSeedOverride(serverProperties.overrideSeed);
}
StorageManager.SetSaveDisabled(serverProperties.disableSaving);
// Read world name and fixed save-id from server.properties
// Delegate load-vs-create decision to WorldManager
@@ -584,9 +592,17 @@ int main(int argc, char **argv)
{
param->seed = config.seed;
}
else if (worldBootstrap.saveData == nullptr)
{
// Only run seed validation when creating a brand-new world.
// Existing worlds already have their seed in level.dat.
LogInfof("startup", "Finding seed with biome diversity for %d-chunk world...", config.worldSizeChunks);
param->seed = BiomeSource::findSeed(LevelType::lvl_normal, config.worldSizeChunks);
LogInfof("startup", "Selected seed: %lld", param->seed);
}
else
{
param->seed = (new Random())->nextLong();
param->seed = (new Random())->nextLong(); // placeholder; level.dat seed takes priority
}
#ifdef _LARGE_WORLDS
param->xzSize = (unsigned int)config.worldSizeChunks;