Set placer to nil instead of a non-functional one in item_OnPlace (#6449)
[oweals/minetest.git] / src / emerge.cpp
index 25b2e924b03f182be0939d81c5d039ab54e098c8..f634e9114827daf3ca0c1444084ba636719386d1 100644 (file)
@@ -40,7 +40,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "mg_schematic.h"
 #include "nodedef.h"
 #include "profiler.h"
-#include "scripting_game.h"
+#include "scripting_server.h"
 #include "server.h"
 #include "serverobject.h"
 #include "settings.h"
@@ -52,18 +52,18 @@ public:
        int id;
 
        EmergeThread(Server *server, int ethreadid);
-       ~EmergeThread();
+       ~EmergeThread() = default;
 
        void *run();
        void signal();
 
        // Requires queue mutex held
-       bool pushBlock(v3s16 pos);
+       bool pushBlock(const v3s16 &pos);
 
        void cancelPendingItems();
 
        static void runCompletionCallbacks(
-               v3s16 pos, EmergeAction action,
+               const v3s16 &pos, EmergeAction action,
                const EmergeCallbackList &callbacks);
 
 private:
@@ -78,30 +78,53 @@ private:
        bool popBlockEmerge(v3s16 *pos, BlockEmergeData *bedata);
 
        EmergeAction getBlockOrStartGen(
-               v3s16 pos, bool allow_gen, MapBlock **block, BlockMakeData *data);
+               const v3s16 &pos, bool allow_gen, MapBlock **block, BlockMakeData *data);
        MapBlock *finishGen(v3s16 pos, BlockMakeData *bmdata,
                std::map<v3s16, MapBlock *> *modified_blocks);
 
        friend class EmergeManager;
 };
 
+class MapEditEventAreaIgnorer
+{
+public:
+       MapEditEventAreaIgnorer(VoxelArea *ignorevariable, const VoxelArea &a):
+               m_ignorevariable(ignorevariable)
+       {
+               if(m_ignorevariable->getVolume() == 0)
+                       *m_ignorevariable = a;
+               else
+                       m_ignorevariable = NULL;
+       }
+
+       ~MapEditEventAreaIgnorer()
+       {
+               if(m_ignorevariable)
+               {
+                       assert(m_ignorevariable->getVolume() != 0);
+                       *m_ignorevariable = VoxelArea();
+               }
+       }
+
+private:
+       VoxelArea *m_ignorevariable;
+};
+
 ////
 //// EmergeManager
 ////
 
-EmergeManager::EmergeManager(IGameDef *gamedef)
+EmergeManager::EmergeManager(Server *server)
 {
-       this->ndef      = gamedef->getNodeDefManager();
-       this->biomemgr  = new BiomeManager(gamedef);
-       this->oremgr    = new OreManager(gamedef);
-       this->decomgr   = new DecorationManager(gamedef);
-       this->schemmgr  = new SchematicManager(gamedef);
-       this->gen_notify_on = 0;
+       this->ndef      = server->getNodeDefManager();
+       this->biomemgr  = new BiomeManager(server);
+       this->oremgr    = new OreManager(server);
+       this->decomgr   = new DecorationManager(server);
+       this->schemmgr  = new SchematicManager(server);
 
        // Note that accesses to this variable are not synchronized.
        // This is because the *only* thread ever starting or stopping
        // EmergeThreads should be the ServerThread.
-       this->m_threads_active = false;
 
        enable_mapgen_debug_info = g_settings->getBool("enable_mapgen_debug_info");
 
@@ -128,7 +151,7 @@ EmergeManager::EmergeManager(IGameDef *gamedef)
                m_qlimit_generate = 1;
 
        for (s16 i = 0; i < nthreads; i++)
-               m_threads.push_back(new EmergeThread((Server *)gamedef, i));
+               m_threads.push_back(new EmergeThread(server, i));
 
        infostream << "EmergeManager: using " << nthreads << " threads" << std::endl;
 }
@@ -158,7 +181,7 @@ EmergeManager::~EmergeManager()
 
 bool EmergeManager::initMapgens(MapgenParams *params)
 {
-       if (m_mapgens.size())
+       if (!m_mapgens.empty())
                return false;
 
        this->mgparams = params;
@@ -174,6 +197,9 @@ bool EmergeManager::initMapgens(MapgenParams *params)
 
 Mapgen *EmergeManager::getCurrentMapgen()
 {
+       if (!m_threads_active)
+               return NULL;
+
        for (u32 i = 0; i != m_threads.size(); i++) {
                if (m_threads[i]->isCurrentThread())
                        return m_threads[i]->m_mapgen;
@@ -290,7 +316,7 @@ v3s16 EmergeManager::getContainingChunk(v3s16 blockpos, s16 chunksize)
 
 int EmergeManager::getSpawnLevelAtPoint(v2s16 p)
 {
-       if (m_mapgens.size() == 0 || !m_mapgens[0]) {
+       if (m_mapgens.empty() || !m_mapgens[0]) {
                errorstream << "EmergeManager: getSpawnLevelAtPoint() called"
                        " before mapgen init" << std::endl;
                return 0;
@@ -302,7 +328,7 @@ int EmergeManager::getSpawnLevelAtPoint(v2s16 p)
 
 int EmergeManager::getGroundLevelAtPoint(v2s16 p)
 {
-       if (m_mapgens.size() == 0 || !m_mapgens[0]) {
+       if (m_mapgens.empty() || !m_mapgens[0]) {
                errorstream << "EmergeManager: getGroundLevelAtPoint() called"
                        " before mapgen init" << std::endl;
                return 0;
@@ -354,7 +380,7 @@ bool EmergeManager::pushBlockEmergeData(
        *entry_already_exists   = !findres.second;
 
        if (callback)
-               bedata.callbacks.push_back(std::make_pair(callback, callback_param));
+               bedata.callbacks.emplace_back(callback, callback_param);
 
        if (*entry_already_exists) {
                bedata.flags |= flags;
@@ -372,7 +398,7 @@ bool EmergeManager::pushBlockEmergeData(
 bool EmergeManager::popBlockEmergeData(v3s16 pos, BlockEmergeData *bedata)
 {
        std::map<v3s16, BlockEmergeData>::iterator it;
-       UNORDERED_MAP<u16, u16>::iterator it2;
+       std::unordered_map<u16, u16>::iterator it2;
 
        it = m_blocks_enqueued.find(pos);
        if (it == m_blocks_enqueued.end())
@@ -431,19 +457,13 @@ EmergeThread::EmergeThread(Server *server, int ethreadid) :
 }
 
 
-EmergeThread::~EmergeThread()
-{
-       //cancelPendingItems();
-}
-
-
 void EmergeThread::signal()
 {
        m_queue_event.signal();
 }
 
 
-bool EmergeThread::pushBlock(v3s16 pos)
+bool EmergeThread::pushBlock(const v3s16 &pos)
 {
        m_block_queue.push(pos);
        return true;
@@ -468,9 +488,7 @@ void EmergeThread::cancelPendingItems()
 }
 
 
-void EmergeThread::runCompletionCallbacks(
-       v3s16 pos,
-       EmergeAction action,
+void EmergeThread::runCompletionCallbacks(const v3s16 &pos, EmergeAction action,
        const EmergeCallbackList &callbacks)
 {
        for (size_t i = 0; i != callbacks.size(); i++) {
@@ -502,7 +520,7 @@ bool EmergeThread::popBlockEmerge(v3s16 *pos, BlockEmergeData *bedata)
 
 
 EmergeAction EmergeThread::getBlockOrStartGen(
-       v3s16 pos, bool allow_gen, MapBlock **block, BlockMakeData *bmdata)
+       const v3s16 &pos, bool allow_gen, MapBlock **block, BlockMakeData *bmdata)
 {
        MutexAutoLock envlock(m_server->m_env_mutex);
 
@@ -564,7 +582,7 @@ MapBlock *EmergeThread::finishGen(v3s16 pos, BlockMakeData *bmdata,
                m_server->getScriptIface()->environment_OnGenerated(
                        minp, maxp, m_mapgen->blockseed);
        } catch (LuaError &e) {
-               m_server->setAsyncFatalError("Lua: " + std::string(e.what()));
+               m_server->setAsyncFatalError("Lua: finishGen" + std::string(e.what()));
        }
 
        EMERGE_DBG_OUT("ended up with: " << analyze_block(block));
@@ -580,7 +598,6 @@ MapBlock *EmergeThread::finishGen(v3s16 pos, BlockMakeData *bmdata,
 
 void *EmergeThread::run()
 {
-       DSTACK(FUNCTION_NAME);
        BEGIN_DEBUG_EXCEPTION_HANDLER
 
        v3s16 pos;
@@ -603,7 +620,7 @@ void *EmergeThread::run()
                        continue;
                }
 
-               if (blockpos_over_limit(pos))
+               if (blockpos_over_max_limit(pos))
                        continue;
 
                bool allow_gen = bedata.flags & BLOCK_EMERGE_ALLOW_GEN;
@@ -618,7 +635,7 @@ void *EmergeThread::run()
 
                                m_mapgen->makeChunk(&bmdata);
 
-                               if (enable_mapgen_debug_info == false)
+                               if (!enable_mapgen_debug_info)
                                        t.stop(true); // Hide output
                        }
 
@@ -630,7 +647,7 @@ void *EmergeThread::run()
                if (block)
                        modified_blocks[pos] = block;
 
-               if (modified_blocks.size() > 0)
+               if (!modified_blocks.empty())
                        m_server->SetBlocksNotSent(modified_blocks);
        }
        } catch (VersionMismatchException &e) {