1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

Huge overhaul of the entire MapgenParams system

MapgenParams is no longer a polymorphic class, eliminating the need for messy and bug-prone reallocations.
Separation between the common and mapgen-specific parameters is now strongly defined.
Mapgen parameters objects are now properly encapsulated within the proper subsystems.
This commit is contained in:
kwolekr 2014-02-03 22:42:10 -05:00
parent a439343844
commit 5a34f40d80
24 changed files with 402 additions and 619 deletions

View file

@ -2407,34 +2407,11 @@ s16 Map::getHumidity(v3s16 p)
*/
ServerMap::ServerMap(std::string savedir, IGameDef *gamedef, EmergeManager *emerge):
Map(dout_server, gamedef),
m_seed(0),
m_emerge(emerge),
m_map_metadata_changed(true)
{
verbosestream<<__FUNCTION_NAME<<std::endl;
m_emerge = emerge;
m_mgparams = m_emerge->getParamsFromSettings(g_settings);
if (!m_mgparams)
m_mgparams = new MapgenV6Params();
m_seed = m_mgparams->seed;
if (g_settings->get("fixed_map_seed").empty())
{
m_seed = (((u64)(myrand() & 0xffff) << 0)
| ((u64)(myrand() & 0xffff) << 16)
| ((u64)(myrand() & 0xffff) << 32)
| ((u64)(myrand() & 0xffff) << 48));
m_mgparams->seed = m_seed;
}
/*
Experimental and debug stuff
*/
{
}
/*
Try to load map; if not found, create a new one.
*/
@ -2496,7 +2473,7 @@ ServerMap::ServerMap(std::string savedir, IGameDef *gamedef, EmergeManager *emer
infostream<<"ServerMap: Successfully loaded map "
<<"metadata from "<<savedir
<<", assuming valid save directory."
<<" seed="<<m_seed<<"."
<<" seed="<< m_emerge->params.seed <<"."
<<std::endl;
m_map_saving_enabled = true;
@ -2552,7 +2529,7 @@ ServerMap::~ServerMap()
/*
Close database if it was opened
*/
delete(dbase);
delete dbase;
#if 0
/*
@ -2565,8 +2542,16 @@ ServerMap::~ServerMap()
delete chunk;
}
#endif
}
delete m_mgparams;
u64 ServerMap::getSeed()
{
return m_emerge->params.seed;
}
s16 ServerMap::getWaterLevel()
{
return m_emerge->params.water_level;
}
bool ServerMap::initBlockMake(BlockMakeData *data, v3s16 blockpos)
@ -2574,7 +2559,7 @@ bool ServerMap::initBlockMake(BlockMakeData *data, v3s16 blockpos)
bool enable_mapgen_debug_info = m_emerge->mapgen_debug_info;
EMERGE_DBG_OUT("initBlockMake(): " PP(blockpos) " - " PP(blockpos));
s16 chunksize = m_mgparams->chunksize;
s16 chunksize = m_emerge->params.chunksize;
s16 coffset = -chunksize / 2;
v3s16 chunk_offset(coffset, coffset, coffset);
v3s16 blockpos_div = getContainerPos(blockpos - chunk_offset, chunksize);
@ -2590,7 +2575,7 @@ bool ServerMap::initBlockMake(BlockMakeData *data, v3s16 blockpos)
blockpos_over_limit(blockpos_max + extra_borders))
return false;
data->seed = m_seed;
data->seed = m_emerge->params.seed;
data->blockpos_min = blockpos_min;
data->blockpos_max = blockpos_max;
data->blockpos_requested = blockpos;
@ -3451,7 +3436,7 @@ void ServerMap::saveMapMeta()
Settings params;
m_emerge->setParamsToSettings(&params);
m_emerge->saveParamsToSettings(&params);
params.writeLines(ss);
ss<<"[end_of_params]\n";
@ -3497,28 +3482,10 @@ void ServerMap::loadMapMeta()
params.parseConfigLine(line);
}
MapgenParams *mgparams;
try {
mgparams = m_emerge->getParamsFromSettings(&params);
} catch (SettingNotFoundException &e) {
infostream << "Couldn't get a setting from map_meta.txt: "
<< e.what() << std::endl;
mgparams = NULL;
}
if (mgparams) {
if (m_mgparams)
delete m_mgparams;
m_mgparams = mgparams;
m_seed = mgparams->seed;
} else {
if (params.exists("seed")) {
m_seed = read_seed(params.get("seed").c_str());
m_mgparams->seed = m_seed;
}
}
m_emerge->loadParamsFromSettings(&params);
verbosestream<<"ServerMap::loadMapMeta(): "<<"seed="<<m_seed<<std::endl;
verbosestream<<"ServerMap::loadMapMeta(): seed="
<< m_emerge->params.seed<<std::endl;
}
void ServerMap::saveSectorMeta(ServerMapSector *sector)
@ -3940,7 +3907,7 @@ s16 ServerMap::updateBlockHeat(ServerEnvironment *env, v3s16 p, MapBlock *block)
block = getBlockNoCreateNoEx(getNodeBlockPos(p));
}
f32 heat = m_emerge->biomedef->calcBlockHeat(p, m_seed,
f32 heat = m_emerge->biomedef->calcBlockHeat(p, getSeed(),
env->getTimeOfDayF(), gametime * env->getTimeOfDaySpeed());
if(block) {
@ -3961,7 +3928,7 @@ s16 ServerMap::updateBlockHumidity(ServerEnvironment *env, v3s16 p, MapBlock *bl
block = getBlockNoCreateNoEx(getNodeBlockPos(p));
}
f32 humidity = m_emerge->biomedef->calcBlockHumidity(p, m_seed,
f32 humidity = m_emerge->biomedef->calcBlockHumidity(p, getSeed(),
env->getTimeOfDayF(), gametime * env->getTimeOfDaySpeed());
if(block) {