]> 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 9c5c16368b1e98e39074179ecaba9f40a6751c13..248312ebe5436d3f6539fe949ed9931b808583b9 100644 (file)
--- a/src/map.h
+++ b/src/map.h
@@ -54,10 +54,6 @@ struct BlockMakeData;
        MapEditEvent
 */
 
-#define MAPTYPE_BASE 0
-#define MAPTYPE_SERVER 1
-#define MAPTYPE_CLIENT 2
-
 enum MapEditEventType{
        // Node added (changed from air or something else to something)
        MEET_ADDNODE,
@@ -127,11 +123,6 @@ class Map /*: public NodeContainer*/
        virtual ~Map();
        DISABLE_CLASS_COPY(Map);
 
-       virtual s32 mapType() const
-       {
-               return MAPTYPE_BASE;
-       }
-
        /*
                Drop (client) or delete (server) the map.
        */
@@ -169,9 +160,6 @@ class Map /*: public NodeContainer*/
 
        inline const NodeDefManager * getNodeDefManager() { return m_nodedef; }
 
-       // Returns InvalidPositionException if not found
-       bool isNodeUnderground(v3s16 p);
-
        bool isValidPosition(v3s16 p);
 
        // throws InvalidPositionException if not found
@@ -185,7 +173,7 @@ class Map /*: public NodeContainer*/
        /*
                These handle lighting but not faces.
        */
-       void addNodeAndUpdate(v3s16 p, MapNode n,
+       virtual void addNodeAndUpdate(v3s16 p, MapNode n,
                        std::map<v3s16, MapBlock*> &modified_blocks,
                        bool remove_metadata = true);
        void removeNodeAndUpdate(v3s16 p,
@@ -205,6 +193,11 @@ class Map /*: public NodeContainer*/
 
        virtual void save(ModifiedState save_level) { FATAL_ERROR("FIXME"); }
 
+       /*
+               Return true unless the map definitely cannot save blocks.
+       */
+       virtual bool maySaveBlocks() { return true; }
+
        // Server implements these.
        // Client leaves them as no-op.
        virtual bool saveBlock(MapBlock *block) { return false; }
@@ -212,14 +205,14 @@ class Map /*: public NodeContainer*/
 
        /*
                Updates usage timers and unloads unused blocks and sectors.
-               Saves modified blocks before unloading on MAPTYPE_SERVER.
+               Saves modified blocks before unloading if possible.
        */
        void timerUpdate(float dtime, float unload_timeout, u32 max_loaded_blocks,
                        std::vector<v3s16> *unloaded_blocks=NULL);
 
        /*
                Unloads all blocks with a zero refCount().
-               Saves modified blocks before unloading on MAPTYPE_SERVER.
+               Saves modified blocks before unloading if possible.
        */
        void unloadUnreferencedBlocks(std::vector<v3s16> *unloaded_blocks=NULL);
 
@@ -231,9 +224,6 @@ class Map /*: public NodeContainer*/
        // For debug printing. Prints "Map: ", "ServerMap: " or "ClientMap: "
        virtual void PrintInfo(std::ostream &out);
 
-       void transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks,
-                       ServerEnvironment *env);
-
        /*
                Node metadata
                These are basically coordinate wrappers to MapBlock
@@ -272,12 +262,8 @@ class Map /*: public NodeContainer*/
                Variables
        */
 
-       void transforming_liquid_add(v3s16 p);
-
        bool isBlockOccluded(MapBlock *block, v3s16 cam_pos_nodes);
 protected:
-       friend class LuaVoxelManip;
-
        IGameDef *m_gamedef;
 
        std::set<MapEventReceiver*> m_event_receivers;
@@ -288,23 +274,17 @@ class Map /*: public NodeContainer*/
        MapSector *m_sector_cache = nullptr;
        v2s16 m_sector_cache_p;
 
-       // Queued transforming water nodes
-       UniqueQueue<v3s16> m_transforming_liquid;
-
        // This stores the properties of the nodes on the map.
        const NodeDefManager *m_nodedef;
 
+       // Can be implemented by child class
+       virtual void reportMetrics(u64 save_time_us, u32 saved_blocks, u32 all_blocks) {}
+
        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;
-       u32 m_unprocessed_count = 0;
-       u64 m_inc_trending_up_start_time = 0; // milliseconds
-       bool m_queue_size_timer_started = false;
 };
 
 /*
@@ -322,11 +302,6 @@ class ServerMap : public Map
        ServerMap(const std::string &savedir, IGameDef *gamedef, EmergeManager *emerge, MetricsBackend *mb);
        ~ServerMap();
 
-       s32 mapType() const
-       {
-               return MAPTYPE_SERVER;
-       }
-
        /*
                Get a sector from somewhere.
                - Check memory
@@ -357,7 +332,7 @@ class ServerMap : public Map
                - Create blank filled with CONTENT_IGNORE
 
        */
-       MapBlock *emergeBlock(v3s16 p, bool create_blank=true);
+       MapBlock *emergeBlock(v3s16 p, bool create_blank=true) override;
 
        /*
                Try to get a block.
@@ -369,32 +344,36 @@ class ServerMap : public Map
 
        bool isBlockInQueue(v3s16 pos);
 
+       void addNodeAndUpdate(v3s16 p, MapNode n,
+                       std::map<v3s16, MapBlock*> &modified_blocks,
+                       bool remove_metadata) override;
+
        /*
                Database functions
        */
        static MapDatabase *createDatabase(const std::string &name, const std::string &savedir, Settings &conf);
 
        // Call these before and after saving of blocks
-       void beginSave();
-       void endSave();
+       void beginSave() override;
+       void endSave() override;
 
-       void save(ModifiedState save_level);
+       void save(ModifiedState save_level) override;
        void listAllLoadableBlocks(std::vector<v3s16> &dst);
 
        MapgenParams *getMapgenParams();
 
-       bool saveBlock(MapBlock *block);
+       bool saveBlock(MapBlock *block) override;
        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);
 
-       bool deleteBlock(v3s16 blockpos);
+       bool deleteBlock(v3s16 blockpos) override;
 
        void updateVManip(v3s16 pos);
 
        // For debug printing
-       virtual void PrintInfo(std::ostream &out);
+       void PrintInfo(std::ostream &out) override;
 
        bool isSavingEnabled(){ return m_map_saving_enabled; }
 
@@ -410,9 +389,20 @@ class ServerMap : public Map
        bool repairBlockLight(v3s16 blockpos,
                std::map<v3s16, MapBlock *> *modified_blocks);
 
+       void transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks,
+                       ServerEnvironment *env);
+
+       void transforming_liquid_add(v3s16 p);
+
        MapSettingsManager settings_mgr;
 
+protected:
+
+       void reportMetrics(u64 save_time_us, u32 saved_blocks, u32 all_blocks) override;
+
 private:
+       friend class LuaVoxelManip;
+
        // Emerge manager
        EmergeManager *m_emerge;
 
@@ -423,6 +413,13 @@ class ServerMap : public Map
 
        std::set<v3s16> m_chunks_in_progress;
 
+       // Queued transforming water nodes
+       UniqueQueue<v3s16> m_transforming_liquid;
+       f32 m_transforming_liquid_loop_count_multiplier = 1.0f;
+       u32 m_unprocessed_count = 0;
+       u64 m_inc_trending_up_start_time = 0; // milliseconds
+       bool m_queue_size_timer_started = false;
+
        /*
                Metadata is re-written on disk only if this is true.
                This is reset to false when written on disk.
@@ -431,7 +428,10 @@ class ServerMap : public Map
        MapDatabase *dbase = nullptr;
        MapDatabase *dbase_ro = nullptr;
 
+       // Map metrics
+       MetricGaugePtr m_loaded_blocks_gauge;
        MetricCounterPtr m_save_time_counter;
+       MetricCounterPtr m_save_count_counter;
 };
 
 
@@ -457,10 +457,25 @@ class MMVManip : public VoxelManipulator
        void blitBackAll(std::map<v3s16, MapBlock*> * modified_blocks,
                bool overwrite_generated = true);
 
+       /*
+               Creates a copy of this VManip including contents, the copy will not be
+               associated with a Map.
+       */
+       MMVManip *clone() const;
+
+       // Reassociates a copied VManip to a map
+       void reparent(Map *map);
+
+       // Is it impossible to call initialEmerge / blitBackAll?
+       inline bool isOrphan() const { return !m_map; }
+
        bool m_is_dirty = false;
 
 protected:
-       Map *m_map;
+       MMVManip() {};
+
+       // may be null
+       Map *m_map = nullptr;
        /*
                key = blockpos
                value = flags describing the block