+ static v3s16 getContainingChunk(v3s16 blockpos, s16 chunksize);
+
+private:
+ std::vector<Mapgen *> m_mapgens;
+ std::vector<EmergeThread *> m_threads;
+ bool m_threads_active = false;
+
+ std::mutex m_queue_mutex;
+ std::map<v3s16, BlockEmergeData> m_blocks_enqueued;
+ std::unordered_map<u16, u16> m_peer_queue_count;
+
+ u16 m_qlimit_total;
+ u16 m_qlimit_diskonly;
+ u16 m_qlimit_generate;
+
+ // Managers of various map generation-related components
+ // Note that each Mapgen gets a copy(!) of these to work with
+ BiomeManager *biomemgr;
+ OreManager *oremgr;
+ DecorationManager *decomgr;
+ SchematicManager *schemmgr;
+
+ // Requires m_queue_mutex held
+ EmergeThread *getOptimalThread();
+
+ bool pushBlockEmergeData(
+ v3s16 pos,
+ u16 peer_requested,
+ u16 flags,
+ EmergeCompletionCallback callback,
+ void *callback_param,
+ bool *entry_already_exists);
+
+ bool popBlockEmergeData(v3s16 pos, BlockEmergeData *bedata);
+
+ friend class EmergeThread;
+};