]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/map.h
Merge branch 'master' of https://github.com/minetest/minetest
[dragonfireclient.git] / src / map.h
index c3a1c1897dbc35d5594b140b888678c7aa12006b..e0db2e2627a01c4345df8978d90e895a4a43e784 100644 (file)
--- a/src/map.h
+++ b/src/map.h
@@ -17,8 +17,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
-#ifndef MAP_HEADER
-#define MAP_HEADER
+#pragma once
 
 #include <iostream>
 #include <sstream>
@@ -32,8 +31,10 @@ 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"
 
 class Settings;
 class MapDatabase;
@@ -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<v3s16> modified_blocks;
-       u16 already_known_by_peer = 0;
+       bool is_private_change = false;
 
-       MapEditEvent() {}
+       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:
@@ -108,11 +99,7 @@ struct MapEditEvent
                case MEET_OTHER:
                {
                        VoxelArea a;
-                       for(std::set<v3s16>::iterator
-                                       i = modified_blocks.begin();
-                                       i != modified_blocks.end(); ++i)
-                       {
-                               v3s16 p = *i;
+                       for (v3s16 p : modified_blocks) {
                                v3s16 np1 = p*MAP_BLOCKSIZE;
                                v3s16 np2 = np1 + v3s16(1,1,1)*MAP_BLOCKSIZE - v3s16(1,1,1);
                                a.addPoint(np1);
@@ -129,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);
 
@@ -156,35 +143,31 @@ 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
                their differing fetch methods.
        */
        virtual MapSector * emergeSector(v2s16 p){ return NULL; }
-       virtual MapSector * emergeSector(v2s16 p,
-                       std::map<v3s16, MapBlock*> &changed_blocks){ return NULL; }
 
        // Returns InvalidPositionException if not found
        MapBlock * getBlockNoCreate(v3s16 p);
        // Returns NULL if not found
        MapBlock * getBlockNoCreateNoEx(v3s16 p);
-
+       
+       void listAllLoadedBlocks(std::vector<v3s16> &dst);
+       
        /* Server overrides */
        virtual MapBlock * emergeBlock(v3s16 p, bool create_blank=true)
        { return getBlockNoCreateNoEx(p); }
 
-       inline INodeDefManager * getNodeDefManager() { return m_nodedef; }
+       inline const NodeDefManager * getNodeDefManager() { return m_nodedef; }
 
        // Returns InvalidPositionException if not found
        bool isNodeUnderground(v3s16 p);
@@ -197,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.
@@ -217,8 +200,8 @@ class Map /*: public NodeContainer*/
        bool removeNodeWithEvent(v3s16 p);
 
        // Call these before and after saving of many blocks
-       virtual void beginSave() { return; }
-       virtual void endSave() { return; }
+       virtual void beginSave() {}
+       virtual void endSave() {}
 
        virtual void save(ModifiedState save_level) { FATAL_ERROR("FIXME"); }
 
@@ -285,24 +268,16 @@ class Map /*: public NodeContainer*/
        void setNodeTimer(const NodeTimer &t);
        void removeNodeTimer(v3s16 p);
 
-       /*
-               Misc.
-       */
-       std::map<v2s16, MapSector*> *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<MapEventReceiver*> m_event_receivers;
@@ -317,10 +292,13 @@ class Map /*: public NodeContainer*/
        UniqueQueue<v3s16> m_transforming_liquid;
 
        // This stores the properties of the nodes on the map.
-       INodeDefManager *m_nodedef;
+       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<s16> &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;
@@ -341,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
@@ -355,9 +333,7 @@ class ServerMap : public Map
                - Check disk (doesn't load blocks)
                - Create blank one
        */
-       ServerMapSector *createSector(v2s16 p);
-
-       bool saoPositionOverLimit(const v3f &p);
+       MapSector *createSector(v2s16 p);
 
        /*
                Blocks are generated by using these and makeBlock().
@@ -391,56 +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 &sectordir, 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<v3s16> &dst);
-       void listAllLoadedBlocks(std::vector<v3s16> &dst);
 
        MapgenParams *getMapgenParams();
 
-       /*void saveChunkMeta();
-       void loadChunkMeta();*/
-
-       // The sector mutex should be locked when calling most of these
-
-       // This only saves sector-specific data such as the heightmap
-       // (no MapBlocks)
-       // DEPRECATED? Sectors have no metadata anymore.
-       void saveSectorMeta(ServerMapSector *sector);
-       MapSector* loadSectorMeta(std::string dirname, bool save_after_load);
-       bool loadSectorMeta(v2s16 p2d);
-
        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 &sectordir, 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);
@@ -455,7 +397,6 @@ class ServerMap : public Map
        bool isSavingEnabled(){ return m_map_saving_enabled; }
 
        u64 getSeed();
-       s16 getWaterLevel();
 
        /*!
         * Fixes lighting in one map block.
@@ -476,13 +417,9 @@ class ServerMap : public Map
        std::string m_savedir;
        bool m_map_saving_enabled;
 
-#if 0
-       // Chunk size in MapSectors
-       // If 0, chunks are disabled.
-       s16 m_chunksize;
-       // Chunks
-       core::map<v2s16, MapChunk*> m_chunks;
-#endif
+       int m_map_compression_level;
+
+       std::set<v3s16> m_chunks_in_progress;
 
        /*
                Metadata is re-written on disk only if this is true.
@@ -490,6 +427,9 @@ class ServerMap : public Map
        */
        bool m_map_metadata_changed = true;
        MapDatabase *dbase = nullptr;
+       MapDatabase *dbase_ro = nullptr;
+
+       MetricCounterPtr m_save_time_counter;
 };
 
 
@@ -500,7 +440,7 @@ class MMVManip : public VoxelManipulator
 {
 public:
        MMVManip(Map *map);
-       virtual ~MMVManip();
+       virtual ~MMVManip() = default;
 
        virtual void clear()
        {
@@ -525,5 +465,3 @@ class MMVManip : public VoxelManipulator
        */
        std::map<v3s16, u8> m_loaded_blocks;
 };
-
-#endif