]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/emerge.cpp
Merge pull request #35 from arydevy/patch-1
[dragonfireclient.git] / src / emerge.cpp
index a9fc0a4de84511d145090d1695fb35e421975821..32e7d9f24d0492de3fc96a3df17599a8857329ad 100644 (file)
@@ -113,13 +113,15 @@ EmergeParams::~EmergeParams()
 {
        infostream << "EmergeParams: destroying " << this << std::endl;
        // Delete everything that was cloned on creation of EmergeParams
+       delete biomegen;
        delete biomemgr;
        delete oremgr;
        delete decomgr;
        delete schemmgr;
 }
 
-EmergeParams::EmergeParams(EmergeManager *parent, const BiomeManager *biomemgr,
+EmergeParams::EmergeParams(EmergeManager *parent, const BiomeGen *biomegen,
+       const BiomeManager *biomemgr,
        const OreManager *oremgr, const DecorationManager *decomgr,
        const SchematicManager *schemmgr) :
        ndef(parent->ndef),
@@ -129,6 +131,7 @@ EmergeParams::EmergeParams(EmergeManager *parent, const BiomeManager *biomemgr,
        biomemgr(biomemgr->clone()), oremgr(oremgr->clone()),
        decomgr(decomgr->clone()), schemmgr(schemmgr->clone())
 {
+       this->biomegen = biomegen->clone(this->biomemgr);
 }
 
 ////
@@ -143,6 +146,10 @@ EmergeManager::EmergeManager(Server *server)
        this->decomgr   = new DecorationManager(server);
        this->schemmgr  = new SchematicManager(server);
 
+       // initialized later
+       this->mgparams = nullptr;
+       this->biomegen = nullptr;
+
        // Note that accesses to this variable are not synchronized.
        // This is because the *only* thread ever starting or stopping
        // EmergeThreads should be the ServerThread.
@@ -159,6 +166,7 @@ EmergeManager::EmergeManager(Server *server)
                nthreads = 1;
 
        m_qlimit_total = g_settings->getU16("emergequeue_limit_total");
+       // FIXME: these fallback values are probably not good
        if (!g_settings->getU16NoEx("emergequeue_limit_diskonly", m_qlimit_diskonly))
                m_qlimit_diskonly = nthreads * 5 + 1;
        if (!g_settings->getU16NoEx("emergequeue_limit_generate", m_qlimit_generate))
@@ -239,9 +247,12 @@ void EmergeManager::initMapgens(MapgenParams *params)
 
        mgparams = params;
 
+       v3s16 csize = v3s16(1, 1, 1) * (params->chunksize * MAP_BLOCKSIZE);
+       biomegen = biomemgr->createBiomeGen(BIOMEGEN_ORIGINAL, params->bparams, csize);
+
        for (u32 i = 0; i != m_threads.size(); i++) {
-               EmergeParams *p = new EmergeParams(
-                       this, biomemgr, oremgr, decomgr, schemmgr);
+               EmergeParams *p = new EmergeParams(this, biomegen,
+                       biomemgr, oremgr, decomgr, schemmgr);
                infostream << "EmergeManager: Created params " << p
                        << " for thread " << i << std::endl;
                m_mapgens.push_back(Mapgen::createMapgen(params->mgtype, params, p));
@@ -395,14 +406,7 @@ int EmergeManager::getGroundLevelAtPoint(v2s16 p)
 // TODO(hmmmm): Move this to ServerMap
 bool EmergeManager::isBlockUnderground(v3s16 blockpos)
 {
-#if 0
-       v2s16 p = v2s16((blockpos.X * MAP_BLOCKSIZE) + MAP_BLOCKSIZE / 2,
-                                       (blockpos.Y * MAP_BLOCKSIZE) + MAP_BLOCKSIZE / 2);
-       int ground_level = getGroundLevelAtPoint(p);
-       return blockpos.Y * (MAP_BLOCKSIZE + 1) <= min(water_level, ground_level);
-#endif
-
-       // Use a simple heuristic; the above method is wildly inaccurate anyway.
+       // Use a simple heuristic
        return blockpos.Y * (MAP_BLOCKSIZE + 1) <= mgparams->water_level;
 }
 
@@ -425,6 +429,10 @@ bool EmergeManager::pushBlockEmergeData(
                                m_qlimit_generate : m_qlimit_diskonly;
                        if (count_peer >= qlimit_peer)
                                return false;
+               } else {
+                       // limit block enqueue requests for active blocks to 1/2 of total
+                       if (count_peer * 2 >= m_qlimit_total)
+                               return false;
                }
        }