-#include "script.h"
-#include "scriptapi.h"
-#include "profiler.h"
-#include "log.h"
-#include "nodedef.h"
-#include "biome.h"
-#include "emerge.h"
-#include "mapgen_v6.h"
-#include "mapgen_v7.h"
-#include "mapgen_indev.h"
-#include "mapgen_singlenode.h"
-
-
-/////////////////////////////// Emerge Manager ////////////////////////////////
-
-EmergeManager::EmergeManager(IGameDef *gamedef) {
- //register built-in mapgens
- registerMapgen("v6", new MapgenFactoryV6());
- registerMapgen("v7", new MapgenFactoryV7());
- registerMapgen("indev", new MapgenFactoryIndev());
- registerMapgen("singlenode", new MapgenFactorySinglenode());
-
- this->ndef = gamedef->getNodeDefManager();
- this->biomedef = new BiomeDefManager();
- this->params = NULL;
-
- mapgen_debug_info = g_settings->getBool("enable_mapgen_debug_info");
-
- queuemutex.Init();
-
- int nthreads;
- if (g_settings->get("num_emerge_threads").empty()) {
- int nprocs = porting::getNumberOfProcessors();
- // leave a proc for the main thread and one for some other misc threads
- nthreads = (nprocs > 2) ? nprocs - 2 : 1;
- } else {
- nthreads = g_settings->getU16("num_emerge_threads");
+#include "voxel.h"
+
+class EmergeThread : public Thread {
+public:
+ bool enable_mapgen_debug_info;
+ int id;
+
+ EmergeThread(Server *server, int ethreadid);
+ ~EmergeThread() = default;
+
+ void *run();
+ void signal();
+
+ // Requires queue mutex held
+ bool pushBlock(const v3s16 &pos);
+
+ void cancelPendingItems();
+
+ static void runCompletionCallbacks(
+ const v3s16 &pos, EmergeAction action,
+ const EmergeCallbackList &callbacks);
+
+private:
+ Server *m_server;
+ ServerMap *m_map;
+ EmergeManager *m_emerge;
+ Mapgen *m_mapgen;
+
+ Event m_queue_event;
+ std::queue<v3s16> m_block_queue;
+
+ bool popBlockEmerge(v3s16 *pos, BlockEmergeData *bedata);
+
+ EmergeAction getBlockOrStartGen(
+ 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;