]> git.lizzy.rs Git - minetest.git/blobdiff - src/emerge.cpp
Remove ClientMap::m_camera_mutex
[minetest.git] / src / emerge.cpp
index 3532ca29dea40f79feecf14049c127a43c68086c..93e8f2b30a92abcbbd81f226b75ae00e8d5bb546 100644 (file)
@@ -34,10 +34,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "log.h"
 #include "map.h"
 #include "mapblock.h"
+#include "mapgen_flat.h"
 #include "mapgen_fractal.h"
 #include "mapgen_v5.h"
 #include "mapgen_v6.h"
 #include "mapgen_v7.h"
+#include "mapgen_valleys.h"
 #include "mapgen_singlenode.h"
 #include "mg_biome.h"
 #include "mg_ore.h"
@@ -105,7 +107,9 @@ MapgenDesc g_reg_mapgens[] = {
        {"v5",         new MapgenFactoryV5,         true},
        {"v6",         new MapgenFactoryV6,         true},
        {"v7",         new MapgenFactoryV7,         true},
-       {"fractal",    new MapgenFactoryFractal,    false},
+       {"flat",       new MapgenFactoryFlat,       true},
+       {"fractal",    new MapgenFactoryFractal,    true},
+       {"valleys",    new MapgenFactoryValleys,    true},
        {"singlenode", new MapgenFactorySinglenode, false},
 };
 
@@ -219,7 +223,7 @@ void EmergeManager::initMapgens()
 Mapgen *EmergeManager::getCurrentMapgen()
 {
        for (u32 i = 0; i != m_threads.size(); i++) {
-               if (m_threads[i]->isSameThread())
+               if (m_threads[i]->isCurrentThread())
                        return m_threads[i]->m_mapgen;
        }
 
@@ -288,14 +292,18 @@ bool EmergeManager::enqueueBlockEmergeEx(
        void *callback_param)
 {
        EmergeThread *thread = NULL;
+       bool entry_already_exists = false;
 
        {
                MutexAutoLock queuelock(m_queue_mutex);
 
                if (!pushBlockEmergeData(blockpos, peer_id, flags,
-                               callback, callback_param))
+                               callback, callback_param, &entry_already_exists))
                        return false;
 
+               if (entry_already_exists)
+                       return true;
+
                thread = getOptimalThread();
                thread->pushBlock(blockpos);
        }
@@ -326,6 +334,18 @@ v3s16 EmergeManager::getContainingChunk(v3s16 blockpos, s16 chunksize)
 }
 
 
+int EmergeManager::getSpawnLevelAtPoint(v2s16 p)
+{
+       if (m_mapgens.size() == 0 || !m_mapgens[0]) {
+               errorstream << "EmergeManager: getSpawnLevelAtPoint() called"
+                       " before mapgen init" << std::endl;
+               return 0;
+       }
+
+       return m_mapgens[0]->getSpawnLevelAtPoint(p);
+}
+
+
 int EmergeManager::getGroundLevelAtPoint(v2s16 p)
 {
        if (m_mapgens.size() == 0 || !m_mapgens[0]) {
@@ -378,7 +398,8 @@ bool EmergeManager::pushBlockEmergeData(
        u16 peer_requested,
        u16 flags,
        EmergeCompletionCallback callback,
-       void *callback_param)
+       void *callback_param,
+       bool *entry_already_exists)
 {
        u16 &count_peer = m_peer_queue_count[peer_requested];
 
@@ -398,12 +419,12 @@ bool EmergeManager::pushBlockEmergeData(
        findres = m_blocks_enqueued.insert(std::make_pair(pos, BlockEmergeData()));
 
        BlockEmergeData &bedata = findres.first->second;
-       bool update_existing    = !findres.second;
+       *entry_already_exists   = !findres.second;
 
        if (callback)
                bedata.callbacks.push_back(std::make_pair(callback, callback_param));
 
-       if (update_existing) {
+       if (*entry_already_exists) {
                bedata.flags |= flags;
        } else {
                bedata.flags = flags;
@@ -476,7 +497,7 @@ EmergeThread::EmergeThread(Server *server, int ethreadid) :
        m_emerge(NULL),
        m_mapgen(NULL)
 {
-       name = "Emerge-" + itos(ethreadid);
+       m_name = "Emerge-" + itos(ethreadid);
 }
 
 
@@ -627,7 +648,7 @@ MapBlock *EmergeThread::finishGen(v3s16 pos, BlockMakeData *bmdata,
 
 void *EmergeThread::run()
 {
-       DSTACK(__FUNCTION_NAME);
+       DSTACK(FUNCTION_NAME);
        BEGIN_DEBUG_EXCEPTION_HANDLER
 
        v3s16 pos;
@@ -700,6 +721,6 @@ void *EmergeThread::run()
                m_server->setAsyncFatalError(err.str());
        }
 
-       END_DEBUG_EXCEPTION_HANDLER(errorstream)
+       END_DEBUG_EXCEPTION_HANDLER
        return NULL;
 }