X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Femerge.h;h=6f204666df70776a69aea6aef2e4a41630ebe8ed;hb=847198edb6fb906165bf0b2b9518d0e6a0677722;hp=7de1c8391d9c309b21f2b503107bc91d41c94c00;hpb=5062b99cb0d252d9e377ff4560f7ecc9e66fd558;p=dragonfireclient.git diff --git a/src/emerge.h b/src/emerge.h index 7de1c8391..6f204666d 100644 --- a/src/emerge.h +++ b/src/emerge.h @@ -17,115 +17,203 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef EMERGE_HEADER -#define EMERGE_HEADER +#pragma once #include +#include +#include "network/networkprotocol.h" #include "irr_v3d.h" #include "util/container.h" -#include "mapgen.h" // for MapgenParams +#include "mapgen/mapgen.h" // for MapgenParams #include "map.h" -#define MGPARAMS_SET_MGNAME 1 -#define MGPARAMS_SET_SEED 2 -#define MGPARAMS_SET_WATER_LEVEL 4 -#define MGPARAMS_SET_FLAGS 8 +#define BLOCK_EMERGE_ALLOW_GEN (1 << 0) +#define BLOCK_EMERGE_FORCE_QUEUE (1 << 1) -#define BLOCK_EMERGE_ALLOWGEN (1<<0) - -#define EMERGE_DBG_OUT(x) \ - do { \ - if (enable_mapgen_debug_info) \ - infostream << "EmergeThread: " x << std::endl; \ - } while (0) +#define EMERGE_DBG_OUT(x) { \ + if (enable_mapgen_debug_info) \ + infostream << "EmergeThread: " x << std::endl; \ +} class EmergeThread; -class INodeDefManager; +class NodeDefManager; class Settings; class BiomeManager; class OreManager; class DecorationManager; class SchematicManager; +class Server; +class ModApiMapgen; +// Structure containing inputs/outputs for chunk generation struct BlockMakeData { - ManualMapVoxelManipulator *vmanip; - u64 seed; + MMVManip *vmanip = nullptr; + u64 seed = 0; v3s16 blockpos_min; v3s16 blockpos_max; v3s16 blockpos_requested; UniqueQueue transforming_liquid; - INodeDefManager *nodedef; + const NodeDefManager *nodedef = nullptr; - BlockMakeData(): - vmanip(NULL), - seed(0), - nodedef(NULL) - {} + BlockMakeData() = default; ~BlockMakeData() { delete vmanip; } }; -struct BlockEmergeData { - u16 peer_requested; - u8 flags; +// Result from processing an item on the emerge queue +enum EmergeAction { + EMERGE_CANCELLED, + EMERGE_ERRORED, + EMERGE_FROM_MEMORY, + EMERGE_FROM_DISK, + EMERGE_GENERATED, }; -class EmergeManager { -public: - INodeDefManager *ndef; +// Callback +typedef void (*EmergeCompletionCallback)( + v3s16 blockpos, EmergeAction action, void *param); - std::map mglist; +typedef std::vector< + std::pair< + EmergeCompletionCallback, + void * + > +> EmergeCallbackList; - std::vector mapgen; - std::vector emergethread; +struct BlockEmergeData { + u16 peer_requested; + u16 flags; + EmergeCallbackList callbacks; +}; - bool threads_active; +class EmergeParams { + friend class EmergeManager; +public: + EmergeParams() = delete; + ~EmergeParams(); + DISABLE_CLASS_COPY(EmergeParams); - //settings - MapgenParams params; - bool mapgen_debug_info; - u16 qlimit_total; - u16 qlimit_diskonly; - u16 qlimit_generate; + const NodeDefManager *ndef; // shared + bool enable_mapgen_debug_info; u32 gen_notify_on; - std::set gen_notify_on_deco_ids; - - //// Block emerge queue data structures - JMutex queuemutex; - std::map blocks_enqueued; - std::map peer_queue_count; + const std::set *gen_notify_on_deco_ids; // shared - //// Managers of map generation-related components BiomeManager *biomemgr; OreManager *oremgr; DecorationManager *decomgr; SchematicManager *schemmgr; - //// Methods - EmergeManager(IGameDef *gamedef); +private: + EmergeParams(EmergeManager *parent, 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: + const NodeDefManager *ndef; + bool enable_mapgen_debug_info; + + // Generation Notify + u32 gen_notify_on = 0; + std::set gen_notify_on_deco_ids; + + // Parameters passed to mapgens owned by ServerMap + // TODO(hmmmm): Remove this after mapgen helper methods using them + // are moved to ServerMap + MapgenParams *mgparams; + + // Hackish workaround: + // For now, EmergeManager must hold onto a ptr to the Map's setting manager + // since the Map can only be accessed through the Environment, and the + // Environment is not created until after script initialization. + MapSettingsManager *map_settings_mgr; + + // Methods + EmergeManager(Server *server); ~EmergeManager(); + DISABLE_CLASS_COPY(EmergeManager); + + // 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 loadMapgenParams(); - void initMapgens(); - Mapgen *getCurrentMapgen(); - Mapgen *createMapgen(std::string mgname, int mgid, - MapgenParams *mgparams); - MapgenSpecificParams *createMapgenParams(std::string mgname); void startThreads(); void stopThreads(); - bool enqueueBlockEmerge(u16 peer_id, v3s16 p, bool allow_generate); + bool isRunning(); + + bool enqueueBlockEmerge( + session_t peer_id, + v3s16 blockpos, + bool allow_generate, + bool ignore_queue_limits=false); + + bool enqueueBlockEmergeEx( + v3s16 blockpos, + session_t peer_id, + u16 flags, + EmergeCompletionCallback callback, + void *callback_param); + + v3s16 getContainingChunk(v3s16 blockpos); - void registerMapgen(std::string name, MapgenFactory *mgfactory); - void loadParamsFromSettings(Settings *settings); - void saveParamsToSettings(Settings *settings); + Mapgen *getCurrentMapgen(); - //mapgen helper methods - Biome *getBiomeAtPoint(v3s16 p); + // Mapgen helpers methods + int getSpawnLevelAtPoint(v2s16 p); int getGroundLevelAtPoint(v2s16 p); bool isBlockUnderground(v3s16 blockpos); - u32 getBlockSeed(v3s16 p); -}; -#endif + static v3s16 getContainingChunk(v3s16 blockpos, s16 chunksize); + +private: + std::vector m_mapgens; + std::vector m_threads; + bool m_threads_active = false; + + std::mutex m_queue_mutex; + std::map m_blocks_enqueued; + std::unordered_map 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; +};