]> git.lizzy.rs Git - dragonfireclient.git/commitdiff
Disentangle map implementations (#12148)
authorJude Melton-Houghton <jwmhjwmh@gmail.com>
Thu, 7 Apr 2022 19:58:04 +0000 (15:58 -0400)
committerGitHub <noreply@github.com>
Thu, 7 Apr 2022 19:58:04 +0000 (21:58 +0200)
Fixes violation of Liskov substitution principle
Fixes #12144

src/client/clientmap.h
src/map.cpp
src/map.h
src/script/lua_api/l_env.cpp
src/script/lua_api/l_vmanip.cpp
src/server.cpp

index d8554313d1cddf6fb56361c344a00165713a5287..4edad0d20275cd58c3f0d34d9b48113437091b70 100644 (file)
@@ -76,9 +76,9 @@ class ClientMap : public Map, public scene::ISceneNode
 
        virtual ~ClientMap() = default;
 
-       s32 mapType() const
+       bool maySaveBlocks() override
        {
-               return MAPTYPE_CLIENT;
+               return false;
        }
 
        void drop()
index 1cbc557078c7ce3a9ca15dc039d5c1106d391a46..9c9324f5f578ccbfc2899ecf204b7c7594413dd0 100644 (file)
@@ -246,22 +246,6 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n,
                action.setSetNode(p, rollback_oldnode, rollback_newnode);
                m_gamedef->rollback()->reportAction(action);
        }
-
-       /*
-               Add neighboring liquid nodes and this node to transform queue.
-               (it's vital for the node itself to get updated last, if it was removed.)
-        */
-
-       for (const v3s16 &dir : g_7dirs) {
-               v3s16 p2 = p + dir;
-
-               bool is_valid_position;
-               MapNode n2 = getNode(p2, &is_valid_position);
-               if(is_valid_position &&
-                               (m_nodedef->get(n2).isLiquid() ||
-                               n2.getContent() == CONTENT_AIR))
-                       m_transforming_liquid.push_back(p2);
-       }
 }
 
 void Map::removeNodeAndUpdate(v3s16 p,
@@ -342,7 +326,7 @@ struct TimeOrderedMapBlock {
 void Map::timerUpdate(float dtime, float unload_timeout, u32 max_loaded_blocks,
                std::vector<v3s16> *unloaded_blocks)
 {
-       bool save_before_unloading = (mapType() == MAPTYPE_SERVER);
+       bool save_before_unloading = maySaveBlocks();
 
        // Profile modified reasons
        Profiler modprofiler;
@@ -527,11 +511,11 @@ struct NodeNeighbor {
        { }
 };
 
-void Map::transforming_liquid_add(v3s16 p) {
+void ServerMap::transforming_liquid_add(v3s16 p) {
         m_transforming_liquid.push_back(p);
 }
 
-void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks,
+void ServerMap::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks,
                ServerEnvironment *env)
 {
        u32 loopcount = 0;
@@ -1565,6 +1549,29 @@ bool ServerMap::isBlockInQueue(v3s16 pos)
        return m_emerge && m_emerge->isBlockInQueue(pos);
 }
 
+void ServerMap::addNodeAndUpdate(v3s16 p, MapNode n,
+               std::map<v3s16, MapBlock*> &modified_blocks,
+               bool remove_metadata)
+{
+       Map::addNodeAndUpdate(p, n, modified_blocks, remove_metadata);
+
+       /*
+               Add neighboring liquid nodes and this node to transform queue.
+               (it's vital for the node itself to get updated last, if it was removed.)
+        */
+
+       for (const v3s16 &dir : g_7dirs) {
+               v3s16 p2 = p + dir;
+
+               bool is_valid_position;
+               MapNode n2 = getNode(p2, &is_valid_position);
+               if(is_valid_position &&
+                               (m_nodedef->get(n2).isLiquid() ||
+                               n2.getContent() == CONTENT_AIR))
+                       m_transforming_liquid.push_back(p2);
+       }
+}
+
 // N.B.  This requires no synchronization, since data will not be modified unless
 // the VoxelManipulator being updated belongs to the same thread.
 void ServerMap::updateVManip(v3s16 pos)
index fe580b20f8bccf9fbc35ca4a42466c37c109defe..9dc7a101c57d39c01c4f49c1f6c1ad9c9b5d6348 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.
        */
@@ -180,7 +171,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,
@@ -200,6 +191,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; }
@@ -207,14 +203,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);
 
@@ -226,9 +222,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
@@ -267,12 +260,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;
@@ -283,9 +272,6 @@ 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;
 
@@ -294,12 +280,6 @@ class Map /*: public NodeContainer*/
        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;
 };
 
 /*
@@ -317,11 +297,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
@@ -364,6 +339,10 @@ 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
        */
@@ -406,9 +385,16 @@ 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;
 
 private:
+       friend class LuaVoxelManip;
+
        // Emerge manager
        EmergeManager *m_emerge;
 
@@ -419,6 +405,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.
index 18ee3a521a4d0455f9ec933320c252762d04970e..54821df24e1db03e9a887bbbdf0834e9e302f6ca 100644 (file)
@@ -1386,7 +1386,7 @@ int ModApiEnvMod::l_transforming_liquid_add(lua_State *L)
        GET_ENV_PTR;
 
        v3s16 p0 = read_v3s16(L, 1);
-       env->getMap().transforming_liquid_add(p0);
+       env->getServerMap().transforming_liquid_add(p0);
        return 1;
 }
 
index e040e545bb5bc4c3c34d08f873480cea22cbf0ae..1fa0802104593ab56f262198d4da7b303ab2f84b 100644 (file)
@@ -166,7 +166,7 @@ int LuaVoxelManip::l_update_liquids(lua_State *L)
 
        LuaVoxelManip *o = checkobject(L, 1);
 
-       Map *map = &(env->getMap());
+       ServerMap *map = &(env->getServerMap());
        const NodeDefManager *ndef = getServer(L)->getNodeDefManager();
        MMVManip *vm = o->vm;
 
index 4bc049e320f1bd8812590175bccf0649f8bb0b8c..8ca8a9bdaeb8ff4bb43634a8546327ea270ea745 100644 (file)
@@ -665,7 +665,7 @@ void Server::AsyncRunStep(bool initial_step)
                ScopeProfiler sp(g_profiler, "Server: liquid transform");
 
                std::map<v3s16, MapBlock*> modified_blocks;
-               m_env->getMap().transformLiquids(modified_blocks, m_env);
+               m_env->getServerMap().transformLiquids(modified_blocks, m_env);
 
                /*
                        Set the modified blocks unsent for all the clients