]> git.lizzy.rs Git - minetest.git/blobdiff - src/serverenvironment.cpp
Add callback on_mapblocks_changed
[minetest.git] / src / serverenvironment.cpp
index 9dd5ba621f565bd13b0126c7b2880ec1c66fe961..aa6ba2f96770d89c76b4707e27fbab97ad525c84 100644 (file)
@@ -381,6 +381,18 @@ void ActiveBlockList::update(std::vector<PlayerSAO*> &active_players,
        m_list = std::move(newlist);
 }
 
+/*
+       OnMapblocksChangedReceiver
+*/
+
+void OnMapblocksChangedReceiver::onMapEditEvent(const MapEditEvent &event)
+{
+       assert(receiving);
+       for (const v3s16 &p : event.modified_blocks) {
+               modified_blocks.insert(p);
+       }
+}
+
 /*
        ServerEnvironment
 */
@@ -476,6 +488,11 @@ void ServerEnvironment::init()
 
        m_player_database = openPlayerDatabase(player_backend_name, m_path_world, conf);
        m_auth_database = openAuthDatabase(auth_backend_name, m_path_world, conf);
+
+       if (m_map && m_script->has_on_mapblocks_changed()) {
+               m_map->addEventReceiver(&m_on_mapblocks_changed_receiver);
+               m_on_mapblocks_changed_receiver.receiving = true;
+       }
 }
 
 ServerEnvironment::~ServerEnvironment()
@@ -1570,6 +1587,14 @@ void ServerEnvironment::step(float dtime)
        // Send outdated detached inventories
        m_server->sendDetachedInventories(PEER_ID_INEXISTENT, true);
 
+       // Notify mods of modified mapblocks
+       if (m_on_mapblocks_changed_receiver.receiving &&
+                       !m_on_mapblocks_changed_receiver.modified_blocks.empty()) {
+               std::unordered_set<v3s16> modified_blocks;
+               std::swap(modified_blocks, m_on_mapblocks_changed_receiver.modified_blocks);
+               m_script->on_mapblocks_changed(modified_blocks);
+       }
+
        const auto end_time = porting::getTimeUs();
        m_step_time_counter->increment(end_time - start_time);
 }