*/
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.
*/
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;
/*
Close database if it was opened
*/
- delete(dbase);
+ delete dbase;
#if 0
/*
delete chunk;
}
#endif
+}
+
+u64 ServerMap::getSeed()
+{
+ return m_emerge->params.seed;
+}
- delete m_mgparams;
+s16 ServerMap::getWaterLevel()
+{
+ return m_emerge->params.water_level;
}
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);
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;
}
}
-/**
- * Get the ground level by searching for a non CONTENT_AIR node in a column from top to bottom
- */
-s16 ServerMap::findGroundLevel(v2s16 p2d, bool cacheBlocks)
+s16 ServerMap::findGroundLevel(v2s16 p2d)
{
-
- s16 level;
-
- // The reference height is the original mapgen height
- s16 referenceHeight = m_emerge->getGroundLevelAtPoint(p2d);
- s16 maxSearchHeight = 63 + referenceHeight;
- s16 minSearchHeight = -63 + referenceHeight;
- v3s16 probePosition(p2d.X, maxSearchHeight, p2d.Y);
- v3s16 blockPosition = getNodeBlockPos(probePosition);
- v3s16 prevBlockPosition = blockPosition;
-
- // Cache the block to be inspected.
- if(cacheBlocks) {
- emergeBlock(blockPosition, true);
- }
-
- // Probes the nodes in the given column
- for(; probePosition.Y > minSearchHeight; probePosition.Y--)
+#if 0
+ /*
+ Uh, just do something random...
+ */
+ // Find existing map from top to down
+ s16 max=63;
+ s16 min=-64;
+ v3s16 p(p2d.X, max, p2d.Y);
+ for(; p.Y>min; p.Y--)
{
- if(cacheBlocks) {
- // Calculate the block position of the given node
- blockPosition = getNodeBlockPos(probePosition);
-
- // If the node is in an different block, cache it
- if(blockPosition != prevBlockPosition) {
- emergeBlock(blockPosition, true);
- prevBlockPosition = blockPosition;
- }
- }
-
- MapNode node = getNodeNoEx(probePosition);
- if (node.getContent() != CONTENT_IGNORE &&
- node.getContent() != CONTENT_AIR) {
+ MapNode n = getNodeNoEx(p);
+ if(n.getContent() != CONTENT_IGNORE)
break;
- }
}
-
- // Could not determine the ground. Use map generator noise functions.
- if(probePosition.Y == minSearchHeight) {
- level = referenceHeight;
- } else {
- level = probePosition.Y;
+ if(p.Y == min)
+ goto plan_b;
+ // If this node is not air, go to plan b
+ if(getNodeNoEx(p).getContent() != CONTENT_AIR)
+ goto plan_b;
+ // Search existing walkable and return it
+ for(; p.Y>min; p.Y--)
+ {
+ MapNode n = getNodeNoEx(p);
+ if(content_walkable(n.d) && n.getContent() != CONTENT_IGNORE)
+ return p.Y;
}
+ // Move to plan b
+plan_b:
+#endif
+
+ /*
+ Determine from map generator noise functions
+ */
+
+ s16 level = m_emerge->getGroundLevelAtPoint(p2d);
return level;
+
+ //double level = base_rock_level_2d(m_seed, p2d) + AVERAGE_MUD_AMOUNT;
+ //return (s16)level;
}
bool ServerMap::loadFromFolders() {
Settings params;
- m_emerge->setParamsToSettings(¶ms);
+ m_emerge->saveParamsToSettings(¶ms);
params.writeLines(ss);
ss<<"[end_of_params]\n";
params.parseConfigLine(line);
}
- MapgenParams *mgparams;
- try {
- mgparams = m_emerge->getParamsFromSettings(¶ms);
- } 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(¶ms);
- verbosestream<<"ServerMap::loadMapMeta(): "<<"seed="<<m_seed<<std::endl;
+ verbosestream<<"ServerMap::loadMapMeta(): seed="
+ << m_emerge->params.seed<<std::endl;
}
void ServerMap::saveSectorMeta(ServerMapSector *sector)
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) {
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) {