X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Femerge.h;h=1bac4b70830d968156be7b636d214541dcde3f5a;hb=refs%2Fheads%2Fmaster;hp=81b7a0a534103c1ba6a8ceeb02ac6cc5743e12c7;hpb=921151d97a2fb2238ab514324fb95e2732248b96;p=dragonfireclient.git diff --git a/src/emerge.h b/src/emerge.h index 81b7a0a53..1bac4b708 100644 --- a/src/emerge.h +++ b/src/emerge.h @@ -21,21 +21,23 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include +#include "network/networkprotocol.h" #include "irr_v3d.h" #include "util/container.h" -#include "mapgen.h" // for MapgenParams +#include "util/metricsbackend.h" +#include "mapgen/mapgen.h" // for MapgenParams #include "map.h" #define BLOCK_EMERGE_ALLOW_GEN (1 << 0) #define BLOCK_EMERGE_FORCE_QUEUE (1 << 1) -#define EMERGE_DBG_OUT(x) do { \ +#define EMERGE_DBG_OUT(x) { \ if (enable_mapgen_debug_info) \ infostream << "EmergeThread: " x << std::endl; \ -} while (0) +} class EmergeThread; -class INodeDefManager; +class NodeDefManager; class Settings; class BiomeManager; @@ -43,6 +45,7 @@ class OreManager; class DecorationManager; class SchematicManager; class Server; +class ModApiMapgen; // Structure containing inputs/outputs for chunk generation struct BlockMakeData { @@ -50,11 +53,11 @@ struct BlockMakeData { u64 seed = 0; v3s16 blockpos_min; v3s16 blockpos_max; - v3s16 blockpos_requested; UniqueQueue transforming_liquid; - INodeDefManager *nodedef = nullptr; + const NodeDefManager *nodedef = nullptr; + + BlockMakeData() = default; - BlockMakeData() {} ~BlockMakeData() { delete vmanip; } }; @@ -67,6 +70,14 @@ enum EmergeAction { EMERGE_GENERATED, }; +const static std::string emergeActionStrs[] = { + "cancelled", + "errored", + "from_memory", + "from_disk", + "generated", +}; + // Callback typedef void (*EmergeCompletionCallback)( v3s16 blockpos, EmergeAction action, void *param); @@ -84,9 +95,40 @@ struct BlockEmergeData { EmergeCallbackList callbacks; }; +class EmergeParams { + friend class EmergeManager; +public: + EmergeParams() = delete; + ~EmergeParams(); + DISABLE_CLASS_COPY(EmergeParams); + + const NodeDefManager *ndef; // shared + bool enable_mapgen_debug_info; + + u32 gen_notify_on; + const std::set *gen_notify_on_deco_ids; // shared + + BiomeGen *biomegen; + BiomeManager *biomemgr; + OreManager *oremgr; + DecorationManager *decomgr; + SchematicManager *schemmgr; + +private: + EmergeParams(EmergeManager *parent, const BiomeGen *biomegen, + const BiomeManager *biomemgr, + const OreManager *oremgr, const DecorationManager *decomgr, + const SchematicManager *schemmgr); +}; + class EmergeManager { + /* The mod API needs unchecked access to allow: + * - using decomgr or oremgr to place decos/ores + * - using schemmgr to load and place schematics + */ + friend class ModApiMapgen; public: - INodeDefManager *ndef; + const NodeDefManager *ndef; bool enable_mapgen_debug_info; // Generation Notify @@ -104,43 +146,49 @@ class EmergeManager { // Environment is not created until after script initialization. MapSettingsManager *map_settings_mgr; - // Managers of various map generation-related components - BiomeManager *biomemgr; - OreManager *oremgr; - DecorationManager *decomgr; - SchematicManager *schemmgr; - // Methods - EmergeManager(Server *server); + EmergeManager(Server *server, MetricsBackend *mb); ~EmergeManager(); DISABLE_CLASS_COPY(EmergeManager); - bool initMapgens(MapgenParams *mgparams); + const BiomeGen *getBiomeGen() const { return biomegen; } + + // no usage restrictions + const BiomeManager *getBiomeManager() const { return biomemgr; } + const OreManager *getOreManager() const { return oremgr; } + const DecorationManager *getDecorationManager() const { return decomgr; } + const SchematicManager *getSchematicManager() const { return schemmgr; } + // only usable before mapgen init + BiomeManager *getWritableBiomeManager(); + OreManager *getWritableOreManager(); + DecorationManager *getWritableDecorationManager(); + SchematicManager *getWritableSchematicManager(); + + void initMapgens(MapgenParams *mgparams); void startThreads(); void stopThreads(); bool isRunning(); bool enqueueBlockEmerge( - u16 peer_id, + session_t peer_id, v3s16 blockpos, bool allow_generate, bool ignore_queue_limits=false); bool enqueueBlockEmergeEx( v3s16 blockpos, - u16 peer_id, + session_t peer_id, u16 flags, EmergeCompletionCallback callback, void *callback_param); - v3s16 getContainingChunk(v3s16 blockpos); + bool isBlockInQueue(v3s16 pos); Mapgen *getCurrentMapgen(); // Mapgen helpers methods int getSpawnLevelAtPoint(v2s16 p); - int getGroundLevelAtPoint(v2s16 p); bool isBlockUnderground(v3s16 blockpos); static v3s16 getContainingChunk(v3s16 blockpos, s16 chunksize); @@ -152,11 +200,22 @@ class EmergeManager { std::mutex m_queue_mutex; std::map m_blocks_enqueued; - std::unordered_map m_peer_queue_count; + std::unordered_map m_peer_queue_count; - u16 m_qlimit_total; - u16 m_qlimit_diskonly; - u16 m_qlimit_generate; + u32 m_qlimit_total; + u32 m_qlimit_diskonly; + u32 m_qlimit_generate; + + // Emerge metrics + MetricCounterPtr m_completed_emerge_counter[5]; + + // Managers of various map generation-related components + // Note that each Mapgen gets a copy(!) of these to work with + BiomeGen *biomegen; + BiomeManager *biomemgr; + OreManager *oremgr; + DecorationManager *decomgr; + SchematicManager *schemmgr; // Requires m_queue_mutex held EmergeThread *getOptimalThread(); @@ -171,5 +230,7 @@ class EmergeManager { bool popBlockEmergeData(v3s16 pos, BlockEmergeData *bedata); + void reportCompletedEmerge(EmergeAction action); + friend class EmergeThread; };