X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fmap.h;h=821e638c1abc160b358b7cbddd6f26b39603d8f3;hb=cca4254f7c502b3e75691c6a3087da7cfcd72e28;hp=6b4942b4d319c94203bf5bd8c8b0a672c12238da;hpb=3face01a202040e4feff3b0936b4aa89c051c98d;p=dragonfireclient.git diff --git a/src/map.h b/src/map.h index 6b4942b4d..821e638c1 100644 --- a/src/map.h +++ b/src/map.h @@ -31,6 +31,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "voxel.h" #include "modifiedstate.h" #include "util/container.h" +#include "util/metricsbackend.h" #include "nodetimer.h" #include "map_settings_manager.h" #include "debug.h" @@ -45,6 +46,7 @@ class NodeMetadata; class IGameDef; class IRollbackManager; class EmergeManager; +class MetricsBackend; class ServerEnvironment; struct BlockMakeData; @@ -63,8 +65,7 @@ enum MapEditEventType{ MEET_REMOVENODE, // Node swapped (changed without metadata change) MEET_SWAPNODE, - // Node metadata of block changed (not knowing which node exactly) - // p stores block coordinate + // Node metadata changed MEET_BLOCK_NODE_METADATA_CHANGED, // Anything else (modified_blocks are set unsent) MEET_OTHER @@ -76,21 +77,11 @@ struct MapEditEvent v3s16 p; MapNode n = CONTENT_AIR; std::set modified_blocks; - u16 already_known_by_peer = 0; + bool is_private_change = false; MapEditEvent() = default; - MapEditEvent * clone() - { - MapEditEvent *event = new MapEditEvent(); - event->type = type; - event->p = p; - event->n = n; - event->modified_blocks = modified_blocks; - return event; - } - - VoxelArea getArea() + VoxelArea getArea() const { switch(type){ case MEET_ADDNODE: @@ -125,14 +116,14 @@ class MapEventReceiver { public: // event shall be deleted by caller after the call. - virtual void onMapEditEvent(MapEditEvent *event) = 0; + virtual void onMapEditEvent(const MapEditEvent &event) = 0; }; class Map /*: public NodeContainer*/ { public: - Map(std::ostream &dout, IGameDef *gamedef); + Map(IGameDef *gamedef); virtual ~Map(); DISABLE_CLASS_COPY(Map); @@ -152,16 +143,12 @@ class Map /*: public NodeContainer*/ void addEventReceiver(MapEventReceiver *event_receiver); void removeEventReceiver(MapEventReceiver *event_receiver); // event shall be deleted by caller after the call. - void dispatchEvent(MapEditEvent *event); + void dispatchEvent(const MapEditEvent &event); // On failure returns NULL - MapSector * getSectorNoGenerateNoExNoLock(v2s16 p2d); + MapSector * getSectorNoGenerateNoLock(v2s16 p2d); // Same as the above (there exists no lock anymore) - MapSector * getSectorNoGenerateNoEx(v2s16 p2d); - // On failure throws InvalidPositionException MapSector * getSectorNoGenerate(v2s16 p2d); - // Gets an existing sector or creates an empty one - //MapSector * getSectorCreate(v2s16 p2d); /* This is overloaded by ClientMap and ServerMap to allow @@ -173,7 +160,9 @@ class Map /*: public NodeContainer*/ MapBlock * getBlockNoCreate(v3s16 p); // Returns NULL if not found MapBlock * getBlockNoCreateNoEx(v3s16 p); - + + void listAllLoadedBlocks(std::vector &dst); + /* Server overrides */ virtual MapBlock * emergeBlock(v3s16 p, bool create_blank=true) { return getBlockNoCreateNoEx(p); } @@ -191,7 +180,7 @@ class Map /*: public NodeContainer*/ // Returns a CONTENT_IGNORE node if not found // If is_valid_position is not NULL then this will be set to true if the // position is valid, otherwise false - MapNode getNodeNoEx(v3s16 p, bool *is_valid_position = NULL); + MapNode getNode(v3s16 p, bool *is_valid_position = NULL); /* These handle lighting but not faces. @@ -279,24 +268,16 @@ class Map /*: public NodeContainer*/ void setNodeTimer(const NodeTimer &t); void removeNodeTimer(v3s16 p); - /* - Misc. - */ - std::map *getSectorsPtr(){return &m_sectors;} - /* Variables */ void transforming_liquid_add(v3s16 p); - s32 transforming_liquid_size(); bool isBlockOccluded(MapBlock *block, v3s16 cam_pos_nodes); protected: friend class LuaVoxelManip; - std::ostream &m_dout; // A bit deprecated, could be removed - IGameDef *m_gamedef; std::set m_event_receivers; @@ -313,8 +294,11 @@ class Map /*: public NodeContainer*/ // This stores the properties of the nodes on the map. const NodeDefManager *m_nodedef; - bool isOccluded(v3s16 p0, v3s16 p1, float step, float stepfac, - float start_off, float end_off, u32 needed_count); + bool determineAdditionalOcclusionCheck(const v3s16 &pos_camera, + const core::aabbox3d &block_bounds, v3s16 &check); + bool isOccluded(const v3s16 &pos_camera, const v3s16 &pos_target, + float step, float stepfac, float start_offset, float end_offset, + u32 needed_count); private: f32 m_transforming_liquid_loop_count_multiplier = 1.0f; @@ -335,7 +319,7 @@ class ServerMap : public Map /* savedir: directory to which map data should be saved */ - ServerMap(const std::string &savedir, IGameDef *gamedef, EmergeManager *emerge); + ServerMap(const std::string &savedir, IGameDef *gamedef, EmergeManager *emerge, MetricsBackend *mb); ~ServerMap(); s32 mapType() const @@ -351,8 +335,6 @@ class ServerMap : public Map */ MapSector *createSector(v2s16 p); - bool saoPositionOverLimit(const v3f &p); - /* Blocks are generated by using these and makeBlock(). */ @@ -385,44 +367,22 @@ class ServerMap : public Map */ MapBlock *getBlockOrEmerge(v3s16 p3d); - // Helper for placing objects on ground level - s16 findGroundLevel(v2s16 p2d); - - /* - Misc. helper functions for fiddling with directory and file - names when saving - */ - void createDirs(std::string path); - // returns something like "map/sectors/xxxxxxxx" - std::string getSectorDir(v2s16 pos, int layout = 2); - // dirname: final directory name - v2s16 getSectorPos(const std::string &dirname); - v3s16 getBlockPos(const std::string §ordir, const std::string &blockfile); - static std::string getBlockFilename(v3s16 p); - /* Database functions */ static MapDatabase *createDatabase(const std::string &name, const std::string &savedir, Settings &conf); - // Returns true if the database file does not exist - bool loadFromFolders(); - // Call these before and after saving of blocks void beginSave(); void endSave(); void save(ModifiedState save_level); void listAllLoadableBlocks(std::vector &dst); - void listAllLoadedBlocks(std::vector &dst); MapgenParams *getMapgenParams(); bool saveBlock(MapBlock *block); - static bool saveBlock(MapBlock *block, MapDatabase *db); - // This will generate a sector with getSector if not found. - void loadBlock(const std::string §ordir, const std::string &blockfile, - MapSector *sector, bool save_after_load=false); + static bool saveBlock(MapBlock *block, MapDatabase *db, int compression_level = -1); MapBlock* loadBlock(v3s16 p); // Database version void loadBlock(std::string *blob, v3s16 p3d, MapSector *sector, bool save_after_load=false); @@ -437,7 +397,6 @@ class ServerMap : public Map bool isSavingEnabled(){ return m_map_saving_enabled; } u64 getSeed(); - s16 getWaterLevel(); /*! * Fixes lighting in one map block. @@ -458,6 +417,7 @@ class ServerMap : public Map std::string m_savedir; bool m_map_saving_enabled; + int m_map_compression_level; #if 0 // Chunk size in MapSectors // If 0, chunks are disabled. @@ -465,6 +425,7 @@ class ServerMap : public Map // Chunks core::map m_chunks; #endif + std::set m_chunks_in_progress; /* Metadata is re-written on disk only if this is true. @@ -472,6 +433,9 @@ class ServerMap : public Map */ bool m_map_metadata_changed = true; MapDatabase *dbase = nullptr; + MapDatabase *dbase_ro = nullptr; + + MetricCounterPtr m_save_time_counter; };