]> git.lizzy.rs Git - minetest.git/blobdiff - src/serverenvironment.h
Add callback on_mapblocks_changed
[minetest.git] / src / serverenvironment.h
index 5dc329a60e8f531a686ac4020cea6607a0bc3f1a..bb40a33ce221c09bbfb5eda439fcc238fa2fab86 100644 (file)
@@ -21,7 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include "activeobject.h"
 #include "environment.h"
-#include "mapnode.h"
+#include "map.h"
 #include "settings.h"
 #include "server/activeobjectmgr.h"
 #include "util/numeric.h"
@@ -30,9 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include <random>
 
 class IGameDef;
-class ServerMap;
 struct GameParams;
-class MapBlock;
 class RemotePlayer;
 class PlayerDatabase;
 class AuthDatabase;
@@ -95,7 +93,8 @@ struct LoadingBlockModifierDef
 
        virtual ~LoadingBlockModifierDef() = default;
 
-       virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n){};
+       virtual void trigger(ServerEnvironment *env, v3s16 p,
+                       MapNode n, float dtime_s) {};
 };
 
 struct LBMContentMapping
@@ -129,7 +128,8 @@ class LBMManager
        std::string createIntroductionTimesString();
 
        // Don't call this before loadIntroductionTimes() ran.
-       void applyLBMs(ServerEnvironment *env, MapBlock *block, u32 stamp);
+       void applyLBMs(ServerEnvironment *env, MapBlock *block,
+                       u32 stamp, float dtime_s);
 
        // Warning: do not make this std::unordered_map, order is relevant here
        typedef std::map<u32, LBMContentMapping> lbm_lookup_map;
@@ -180,11 +180,27 @@ class ActiveBlockList
                m_list.clear();
        }
 
+       void remove(v3s16 p) {
+               m_list.erase(p);
+               m_abm_list.erase(p);
+       }
+
        std::set<v3s16> m_list;
        std::set<v3s16> m_abm_list;
+       // list of blocks that are always active, not modified by this class
        std::set<v3s16> m_forceloaded_list;
 };
 
+/*
+       ServerEnvironment::m_on_mapblocks_changed_receiver
+*/
+struct OnMapblocksChangedReceiver : public MapEventReceiver {
+       std::unordered_set<v3s16> modified_blocks;
+       bool receiving = false;
+
+       void onMapEditEvent(const MapEditEvent &event) override;
+};
+
 /*
        Operation mode for ServerEnvironment::clearObjects()
 */
@@ -197,13 +213,15 @@ enum ClearObjectsMode {
                CLEAR_OBJECTS_MODE_QUICK,
 };
 
-class ServerEnvironment : public Environment
+class ServerEnvironment final : public Environment
 {
 public:
-       ServerEnvironment(ServerMap *map, ServerScripting *scriptIface,
+       ServerEnvironment(ServerMap *map, ServerScripting *script_iface,
                Server *server, const std::string &path_world, MetricsBackend *mb);
        ~ServerEnvironment();
 
+       void init();
+
        Map & getMap();
 
        ServerMap & getServerMap();
@@ -445,6 +463,8 @@ class ServerEnvironment : public Environment
        Server *m_server;
        // Active Object Manager
        server::ActiveObjectMgr m_ao_manager;
+       // on_mapblocks_changed map event receiver
+       OnMapblocksChangedReceiver m_on_mapblocks_changed_receiver;
        // World path
        const std::string m_path_world;
        // Outgoing network message buffer for active objects
@@ -454,7 +474,8 @@ class ServerEnvironment : public Environment
        IntervalLimiter m_object_management_interval;
        // List of active blocks
        ActiveBlockList m_active_blocks;
-       IntervalLimiter m_active_blocks_management_interval;
+       int m_fast_active_block_divider = 1;
+       IntervalLimiter m_active_blocks_mgmt_interval;
        IntervalLimiter m_active_block_modifier_interval;
        IntervalLimiter m_active_blocks_nodemetadata_interval;
        // Whether the variables below have been read from file yet