]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/script/cpp_api/s_client.cpp
[CSM] Add `on_dignode` callback (#5140)
[dragonfireclient.git] / src / script / cpp_api / s_client.cpp
index 08af8ebdc76dd76048f19218017990fdf64ece88..2c8fee334682590bbf55a0276ce3ce2078474143 100644 (file)
@@ -20,6 +20,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include "s_client.h"
 #include "s_internal.h"
+#include "client.h"
+#include "common/c_converter.h"
+#include "common/c_content.h"
 
 void ScriptApiClient::on_shutdown()
 {
@@ -59,3 +62,99 @@ bool ScriptApiClient::on_receiving_message(const std::string &message)
        bool ate = lua_toboolean(L, -1);
        return ate;
 }
+
+void ScriptApiClient::on_damage_taken(int32_t damage_amount)
+{
+       SCRIPTAPI_PRECHECKHEADER
+
+       // Get core.registered_on_chat_messages
+       lua_getglobal(L, "core");
+       lua_getfield(L, -1, "registered_on_damage_taken");
+       // Call callbacks
+       lua_pushinteger(L, damage_amount);
+       runCallbacks(1, RUN_CALLBACKS_MODE_OR_SC);
+}
+
+void ScriptApiClient::on_hp_modification(int32_t newhp)
+{
+       SCRIPTAPI_PRECHECKHEADER
+
+       // Get core.registered_on_chat_messages
+       lua_getglobal(L, "core");
+       lua_getfield(L, -1, "registered_on_hp_modification");
+       // Call callbacks
+       lua_pushinteger(L, newhp);
+       runCallbacks(1, RUN_CALLBACKS_MODE_OR_SC);
+}
+
+void ScriptApiClient::on_death()
+{
+       SCRIPTAPI_PRECHECKHEADER
+
+       // Get registered shutdown hooks
+       lua_getglobal(L, "core");
+       lua_getfield(L, -1, "registered_on_death");
+       // Call callbacks
+       runCallbacks(0, RUN_CALLBACKS_MODE_FIRST);
+}
+
+void ScriptApiClient::environment_step(float dtime)
+{
+       SCRIPTAPI_PRECHECKHEADER
+
+       // Get core.registered_globalsteps
+       lua_getglobal(L, "core");
+       lua_getfield(L, -1, "registered_globalsteps");
+       // Call callbacks
+       lua_pushnumber(L, dtime);
+       try {
+               runCallbacks(1, RUN_CALLBACKS_MODE_FIRST);
+       } catch (LuaError &e) {
+               getClient()->setFatalError(std::string("Client environment_step: ") + e.what() + "\n"
+                               + script_get_backtrace(L));
+       }
+}
+
+void ScriptApiClient::on_formspec_input(const std::string &formname,
+       const StringMap &fields)
+{
+       SCRIPTAPI_PRECHECKHEADER
+
+       // Get core.registered_on_chat_messages
+       lua_getglobal(L, "core");
+       lua_getfield(L, -1, "registered_on_formspec_input");
+       // Call callbacks
+       // param 1
+       lua_pushstring(L, formname.c_str());
+       // param 2
+       lua_newtable(L);
+       StringMap::const_iterator it;
+       for (it = fields.begin(); it != fields.end(); ++it) {
+               const std::string &name = it->first;
+               const std::string &value = it->second;
+               lua_pushstring(L, name.c_str());
+               lua_pushlstring(L, value.c_str(), value.size());
+               lua_settable(L, -3);
+       }
+       runCallbacks(2, RUN_CALLBACKS_MODE_OR_SC);
+}
+
+bool ScriptApiClient::on_dignode(v3s16 p, MapNode node)
+{
+       SCRIPTAPI_PRECHECKHEADER
+
+       INodeDefManager *ndef = getClient()->ndef();
+
+       // Get core.registered_on_dignode
+       lua_getglobal(L, "core");
+       lua_getfield(L, -1, "registered_on_dignode");
+
+       // Push data
+       push_v3s16(L, p);
+       pushnode(L, node, ndef);
+
+       // Call functions
+       runCallbacks(2, RUN_CALLBACKS_MODE_OR);
+       bool blocked = lua_toboolean(L, -1);
+       return blocked;
+}
\ No newline at end of file