diff options
author | Warr1024 <warr1024@gmail.com> | 2021-07-09 09:08:40 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-09 09:08:40 -0400 |
commit | 52128ae11e8b1a7ce66a87c53f1b15f3aabe69f4 (patch) | |
tree | dff52505d4b86b9934cc6f37f9b4ceeca5a54014 /src | |
parent | e9bc59e376f88f1d4d1c6d3fedf62d9049e3e60d (diff) | |
download | minetest-52128ae11e8b1a7ce66a87c53f1b15f3aabe69f4.tar.gz minetest-52128ae11e8b1a7ce66a87c53f1b15f3aabe69f4.tar.bz2 minetest-52128ae11e8b1a7ce66a87c53f1b15f3aabe69f4.zip |
Add API for mods to hook liquid transformation events (#11405)
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/map.cpp | 2 | ||||
-rw-r--r-- | src/script/cpp_api/s_env.cpp | 34 | ||||
-rw-r--r-- | src/script/cpp_api/s_env.h | 5 |
3 files changed, 40 insertions, 1 deletions
diff --git a/src/map.cpp b/src/map.cpp index 641287c3d..30ce064d6 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -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 diff --git a/src/script/cpp_api/s_env.cpp b/src/script/cpp_api/s_env.cpp index c4a39a869..c11de3757 100644 --- a/src/script/cpp_api/s_env.cpp +++ b/src/script/cpp_api/s_env.cpp @@ -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 diff --git a/src/script/cpp_api/s_env.h b/src/script/cpp_api/s_env.h index 232a08aaf..090858f17 100644 --- a/src/script/cpp_api/s_env.h +++ b/src/script/cpp_api/s_env.h @@ -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 @@ public: 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); }; |