]> git.lizzy.rs Git - dragonfireclient.git/commitdiff
Add API for mods to hook liquid transformation events (#11405)
authorWarr1024 <warr1024@gmail.com>
Fri, 9 Jul 2021 13:08:40 +0000 (09:08 -0400)
committerGitHub <noreply@github.com>
Fri, 9 Jul 2021 13:08:40 +0000 (09:08 -0400)
Add API for mods to hook liquid transformation events

Without this API, there is no reliable way for mods to be
notified when liquid transform modifies nodes and mods are
forced to poll for changes.  This allows mods to detect
changes to flowing liquid nodes and liquid renewal using
event-driven logic.

builtin/game/register.lua
doc/lua_api.txt
src/map.cpp
src/script/cpp_api/s_env.cpp
src/script/cpp_api/s_env.h

index c075358559b96ceb515860130c994d64a9789821..56e40c75c9ccf13baf978a6caad240590b1d9bc4 100644 (file)
@@ -610,6 +610,7 @@ core.registered_on_modchannel_message, core.register_on_modchannel_message = mak
 core.registered_on_player_inventory_actions, core.register_on_player_inventory_action = make_registration()
 core.registered_allow_player_inventory_actions, core.register_allow_player_inventory_action = make_registration()
 core.registered_on_rightclickplayers, core.register_on_rightclickplayer = make_registration()
+core.registered_on_liquid_transformed, core.register_on_liquid_transformed = make_registration()
 
 --
 -- Compatibility for on_mapgen_init()
index aa59898d761efc801247d1d4426b493136e20d29..fc6d077e198613abfd1f7deeb70d9b31d84f6f7e 100644 (file)
@@ -4859,6 +4859,12 @@ Call these functions only at load time!
     * Called when an incoming mod channel message is received
     * You should have joined some channels to receive events.
     * If message comes from a server mod, `sender` field is an empty string.
+* `minetest.register_on_liquid_transformed(function(post_list, node_list))`
+    * Called after liquid nodes are modified by the engine's liquid transformation
+      process.
+    * `pos_list` is an array of all modified positions.
+    * `node_list` is an array of the old node that was previously at the position
+      with the corresponding index in pos_list.
 
 Setting-related
 ---------------
index 641287c3d9a427a72178a40e764ad06d6942952f..30ce064d6a00410edfee53d2b6c01ef1e557f016 100644 (file)
@@ -829,7 +829,7 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks,
                m_transforming_liquid.push_back(iter);
 
        voxalgo::update_lighting_nodes(this, changed_nodes, modified_blocks);
-
+       env->getScriptIface()->on_liquid_transformed(changed_nodes);
 
        /* ----------------------------------------------------------------------
         * Manage the queue so that it does not grow indefinately
index c4a39a8698901fe22d04895148577497e02a51e0..c11de37578b810c98a5061259f9027d84eac155b 100644 (file)
@@ -25,6 +25,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "mapgen/mapgen.h"
 #include "lua_api/l_env.h"
 #include "server.h"
+#include "script/common/c_content.h"
+
 
 void ScriptApiEnv::environment_OnGenerated(v3s16 minp, v3s16 maxp,
        u32 blockseed)
@@ -267,3 +269,35 @@ void ScriptApiEnv::on_emerge_area_completion(
                luaL_unref(L, LUA_REGISTRYINDEX, state->args_ref);
        }
 }
+
+void ScriptApiEnv::on_liquid_transformed(
+       const std::vector<std::pair<v3s16, MapNode>> &list)
+{
+       SCRIPTAPI_PRECHECKHEADER
+
+       // Get core.registered_on_liquid_transformed
+       lua_getglobal(L, "core");
+       lua_getfield(L, -1, "registered_on_liquid_transformed");
+       luaL_checktype(L, -1, LUA_TTABLE);
+       lua_remove(L, -2);
+
+       // Skip converting list and calling hook if there are
+       // no registered callbacks.
+       if(lua_objlen(L, -1) < 1) return;
+
+       // Convert the list to a pos array and a node array for lua
+       int index = 1;
+       const NodeDefManager *ndef = getEnv()->getGameDef()->ndef();
+       lua_createtable(L, list.size(), 0);
+       lua_createtable(L, list.size(), 0);
+       for(std::pair<v3s16, MapNode> p : list) {
+               lua_pushnumber(L, index);
+               push_v3s16(L, p.first);
+               lua_rawset(L, -4);
+               lua_pushnumber(L, index++);
+               pushnode(L, p.second, ndef);
+               lua_rawset(L, -3);
+       }
+
+       runCallbacks(2, RUN_CALLBACKS_MODE_FIRST);
+}
\ No newline at end of file
index 232a08aaff1b774bec6baa10e4b94e031427d504..090858f17238c4b06fef729a010846a283ff0b65 100644 (file)
@@ -21,6 +21,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include "cpp_api/s_base.h"
 #include "irr_v3d.h"
+#include "mapnode.h"
+#include <vector>
 
 class ServerEnvironment;
 struct ScriptCallbackState;
@@ -41,5 +43,8 @@ class ScriptApiEnv : virtual public ScriptApiBase
        void on_emerge_area_completion(v3s16 blockpos, int action,
                ScriptCallbackState *state);
 
+       // Called after liquid transform changes
+       void on_liquid_transformed(const std::vector<std::pair<v3s16, MapNode>> &list);
+
        void initializeEnvironment(ServerEnvironment *env);
 };