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
+14
View File
@@ -824,6 +824,20 @@ ServerPropertiesConfig LoadServerPropertiesConfig()
config.maxPlayers = ReadNormalizedIntProperty(&merged, "max-players", kDefaultMaxPlayers, 1, kMaxDedicatedPlayers, &shouldWrite);
config.seed = 0;
config.hasSeed = ReadNormalizedOptionalInt64Property(&merged, "level-seed", &config.seed, &shouldWrite);
config.overrideSeed = 0;
config.hasOverrideSeed = false;
{
auto it = merged.find("override-seed");
if (it != merged.end() && !TrimAscii(it->second).empty())
{
__int64 parsed = 0;
if (TryParseInt64(TrimAscii(it->second), &parsed))
{
config.overrideSeed = parsed;
config.hasOverrideSeed = true;
}
}
}
config.logLevel = ReadNormalizedLogLevelProperty(&merged, "log-level", eServerLogLevel_Info, &shouldWrite);
config.autosaveIntervalSeconds = ReadNormalizedIntProperty(&merged, "autosave-interval", kDefaultAutosaveIntervalSeconds, 5, 3600, &shouldWrite);
+3
View File
@@ -31,6 +31,9 @@ namespace ServerRuntime
bool hasSeed;
/** `level-seed` */
__int64 seed;
/** `override-seed` replaces the seed for biome generation on existing worlds */
bool hasOverrideSeed;
__int64 overrideSeed;
/** `log-level` */
EServerLogLevel logLevel;
/** `autosave-interval` (seconds) */
+17 -1
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;