X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Femerge.cpp;h=9c5ee452ef6f0bd6389f5f181582bfdef3b2b6ee;hb=d4d561fbcdac0175584e4f62bc6c3bfdf83510f1;hp=2828d490bb3dbd490821ccb1b2e5bc41f13a1cad;hpb=5e2753c712e8f65fa50f4889fc1422393ba21413;p=dragonfireclient.git diff --git a/src/emerge.cpp b/src/emerge.cpp index 2828d490b..9c5ee452e 100644 --- a/src/emerge.cpp +++ b/src/emerge.cpp @@ -28,7 +28,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "environment.h" #include "util/container.h" #include "util/thread.h" -#include "main.h" #include "constants.h" #include "voxel.h" #include "config.h" @@ -48,6 +47,17 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mapgen_v7.h" #include "mapgen_singlenode.h" +struct MapgenDesc { + const char *name; + MapgenFactory *factory; +}; + +MapgenDesc reg_mapgens[] = { + {"v5", new MapgenFactoryV5}, + {"v6", new MapgenFactoryV6}, + {"v7", new MapgenFactoryV7}, + {"singlenode", new MapgenFactorySinglenode}, +}; class EmergeThread : public JThread { @@ -84,12 +94,6 @@ class EmergeThread : public JThread EmergeManager::EmergeManager(IGameDef *gamedef) { - //register built-in mapgens - registerMapgen("v5", new MapgenFactoryV5()); - registerMapgen("v6", new MapgenFactoryV6()); - registerMapgen("v7", new MapgenFactoryV7()); - registerMapgen("singlenode", new MapgenFactorySinglenode()); - this->ndef = gamedef->getNodeDefManager(); this->biomemgr = new BiomeManager(gamedef); this->oremgr = new OreManager(gamedef); @@ -135,7 +139,7 @@ EmergeManager::EmergeManager(IGameDef *gamedef) EmergeManager::~EmergeManager() { - for (unsigned int i = 0; i != emergethread.size(); i++) { + for (u32 i = 0; i != emergethread.size(); i++) { if (threads_active) { emergethread[i]->Stop(); emergethread[i]->qevent.signal(); @@ -147,11 +151,6 @@ EmergeManager::~EmergeManager() emergethread.clear(); mapgen.clear(); - std::map::iterator it; - for (it = mglist.begin(); it != mglist.end(); ++it) - delete it->second; - mglist.clear(); - delete biomemgr; delete oremgr; delete decomgr; @@ -166,14 +165,7 @@ EmergeManager::~EmergeManager() void EmergeManager::loadMapgenParams() { - loadParamsFromSettings(g_settings); - - if (g_settings->get("fixed_map_seed").empty()) { - params.seed = (((u64)(myrand() & 0xffff) << 0) - | ((u64)(myrand() & 0xffff) << 16) - | ((u64)(myrand() & 0xffff) << 32) - | ((u64)(myrand() & 0xffff) << 48)); - } + params.load(*g_settings); } @@ -193,7 +185,7 @@ void EmergeManager::initMapgens() } // Create the mapgens - for (size_t i = 0; i != emergethread.size(); i++) { + for (u32 i = 0; i != emergethread.size(); i++) { Mapgen *mg = createMapgen(params.mg_name, i, ¶ms); assert(mg); mapgen.push_back(mg); @@ -203,7 +195,7 @@ void EmergeManager::initMapgens() Mapgen *EmergeManager::getCurrentMapgen() { - for (unsigned int i = 0; i != emergethread.size(); i++) { + for (u32 i = 0; i != emergethread.size(); i++) { if (emergethread[i]->IsSameThread()) return emergethread[i]->mapgen; } @@ -217,7 +209,7 @@ void EmergeManager::startThreads() if (threads_active) return; - for (unsigned int i = 0; i != emergethread.size(); i++) + for (u32 i = 0; i != emergethread.size(); i++) emergethread[i]->Start(); threads_active = true; @@ -230,13 +222,13 @@ void EmergeManager::stopThreads() return; // Request thread stop in parallel - for (unsigned int i = 0; i != emergethread.size(); i++) { + for (u32 i = 0; i != emergethread.size(); i++) { emergethread[i]->Stop(); emergethread[i]->qevent.signal(); } // Then do the waiting for each - for (unsigned int i = 0; i != emergethread.size(); i++) + for (u32 i = 0; i != emergethread.size(); i++) emergethread[i]->Wait(); threads_active = false; @@ -282,7 +274,7 @@ bool EmergeManager::enqueueBlockEmerge(u16 peer_id, v3s16 p, bool allow_generate // insert into the EmergeThread queue with the least items int lowestitems = emergethread[0]->blockqueue.size(); - for (unsigned int i = 1; i != emergethread.size(); i++) { + for (u32 i = 1; i != emergethread.size(); i++) { int nitems = emergethread[i]->blockqueue.size(); if (nitems < lowestitems) { idx = i; @@ -325,90 +317,44 @@ bool EmergeManager::isBlockUnderground(v3s16 blockpos) } -u32 EmergeManager::getBlockSeed(v3s16 p) +void EmergeManager::getMapgenNames(std::list &mgnames) { - return (u32)(params.seed & 0xFFFFFFFF) + - p.Z * 38134234 + - p.Y * 42123 + - p.X * 23; + for (u32 i = 0; i != ARRLEN(reg_mapgens); i++) + mgnames.push_back(reg_mapgens[i].name); } -Mapgen *EmergeManager::createMapgen(std::string mgname, int mgid, +Mapgen *EmergeManager::createMapgen(const std::string &mgname, int mgid, MapgenParams *mgparams) { - std::map::const_iterator iter; - iter = mglist.find(mgname); - if (iter == mglist.end()) { + u32 i; + for (i = 0; i != ARRLEN(reg_mapgens) && mgname != reg_mapgens[i].name; i++); + if (i == ARRLEN(reg_mapgens)) { errorstream << "EmergeManager; mapgen " << mgname << " not registered" << std::endl; return NULL; } - MapgenFactory *mgfactory = iter->second; + MapgenFactory *mgfactory = reg_mapgens[i].factory; return mgfactory->createMapgen(mgid, mgparams, this); } -MapgenSpecificParams *EmergeManager::createMapgenParams(std::string mgname) +MapgenSpecificParams *EmergeManager::createMapgenParams(const std::string &mgname) { - std::map::const_iterator iter; - iter = mglist.find(mgname); - if (iter == mglist.end()) { - errorstream << "EmergeManager: mapgen " << mgname << + u32 i; + for (i = 0; i < ARRLEN(reg_mapgens) && mgname != reg_mapgens[i].name; i++); + if (i == ARRLEN(reg_mapgens)) { + errorstream << "EmergeManager: Mapgen " << mgname << " not registered" << std::endl; return NULL; } - MapgenFactory *mgfactory = iter->second; + MapgenFactory *mgfactory = reg_mapgens[i].factory; return mgfactory->createMapgenParams(); } -void EmergeManager::loadParamsFromSettings(Settings *settings) -{ - std::string seed_str; - const char *setname = (settings == g_settings) ? "fixed_map_seed" : "seed"; - - if (settings->getNoEx(setname, seed_str)) - params.seed = read_seed(seed_str.c_str()); - - settings->getNoEx("mg_name", params.mg_name); - settings->getS16NoEx("water_level", params.water_level); - settings->getS16NoEx("chunksize", params.chunksize); - settings->getFlagStrNoEx("mg_flags", params.flags, flagdesc_mapgen); - settings->getNoiseParams("mg_biome_np_heat", params.np_biome_heat); - settings->getNoiseParams("mg_biome_np_humidity", params.np_biome_humidity); - - delete params.sparams; - params.sparams = createMapgenParams(params.mg_name); - if (params.sparams) - params.sparams->readParams(settings); -} - - -void EmergeManager::saveParamsToSettings(Settings *settings) -{ - settings->set("mg_name", params.mg_name); - settings->setU64("seed", params.seed); - settings->setS16("water_level", params.water_level); - settings->setS16("chunksize", params.chunksize); - settings->setFlagStr("mg_flags", params.flags, flagdesc_mapgen, (u32)-1); - settings->setNoiseParams("mg_biome_np_heat", params.np_biome_heat); - settings->setNoiseParams("mg_biome_np_humidity", params.np_biome_humidity); - - if (params.sparams) - params.sparams->writeParams(settings); -} - - -void EmergeManager::registerMapgen(std::string mgname, MapgenFactory *mgfactory) -{ - mglist.insert(std::make_pair(mgname, mgfactory)); - infostream << "EmergeManager: registered mapgen " << mgname << std::endl; -} - - ////////////////////////////// Emerge Thread ////////////////////////////////// bool EmergeThread::popBlockEmerge(v3s16 *pos, u8 *flags) @@ -547,7 +493,7 @@ void *EmergeThread::Thread() VoxelArea(minp, maxp)); try { // takes about 90ms with -O1 on an e3-1230v2 m_server->getScriptIface()->environment_OnGenerated( - minp, maxp, emerge->getBlockSeed(minp)); + minp, maxp, mapgen->blockseed); } catch(LuaError &e) { m_server->setAsyncFatalError(e.what()); } @@ -572,23 +518,42 @@ void *EmergeThread::Thread() } catch (VersionMismatchException &e) { std::ostringstream err; - err << "World data version mismatch in MapBlock "<setAsyncFatalError(err.str()); } catch (SerializationError &e) { std::ostringstream err; - err << "Invalid data in MapBlock "<setAsyncFatalError(err.str()); } + { + JMutexAutoLock queuelock(emerge->queuemutex); + while (!blockqueue.empty()) + { + v3s16 p = blockqueue.front(); + blockqueue.pop(); + + std::map::iterator iter; + iter = emerge->blocks_enqueued.find(p); + if (iter == emerge->blocks_enqueued.end()) + continue; //uh oh, queue and map out of sync!! + + BlockEmergeData *bedata = iter->second; + delete bedata; + } + } + END_DEBUG_EXCEPTION_HANDLER(errorstream) log_deregister_thread(); return NULL;