summaryrefslogtreecommitdiff
path: root/src/script/cpp_api
diff options
context:
space:
mode:
authorSmallJoker <SmallJoker@users.noreply.github.com>2018-04-30 18:43:49 +0200
committerGitHub <noreply@github.com>2018-04-30 18:43:49 +0200
commitba91624d8c354bac49c35a449029b6712022d0cb (patch)
tree8a6423ab354888691927f852754f86816f9c90c5 /src/script/cpp_api
parent0b5b32b026291d5bd8e47acebca10259a379fc1c (diff)
downloadminetest-ba91624d8c354bac49c35a449029b6712022d0cb.tar.gz
minetest-ba91624d8c354bac49c35a449029b6712022d0cb.tar.bz2
minetest-ba91624d8c354bac49c35a449029b6712022d0cb.zip
Allow damage for attached objects, add attach/detach callbacks (#6786)
* Allow right-clicking on attached LuaEntities
Diffstat (limited to 'src/script/cpp_api')
-rw-r--r--src/script/cpp_api/s_entity.cpp53
-rw-r--r--src/script/cpp_api/s_entity.h9
2 files changed, 32 insertions, 30 deletions
diff --git a/src/script/cpp_api/s_entity.cpp b/src/script/cpp_api/s_entity.cpp
index df4b77936..88dbcc620 100644
--- a/src/script/cpp_api/s_entity.cpp
+++ b/src/script/cpp_api/s_entity.cpp
@@ -262,7 +262,9 @@ bool ScriptApiEntity::luaentity_Punch(u16 id,
return retval;
}
-bool ScriptApiEntity::luaentity_on_death(u16 id, ServerActiveObject *killer)
+// Calls entity[field](ObjectRef self, ObjectRef sao)
+bool ScriptApiEntity::luaentity_run_simple_callback(u16 id,
+ ServerActiveObject *sao, const char *field)
{
SCRIPTAPI_PRECHECKHEADER
@@ -273,14 +275,14 @@ bool ScriptApiEntity::luaentity_on_death(u16 id, ServerActiveObject *killer)
int object = lua_gettop(L);
// State: object is at top of stack
// Get function
- lua_getfield(L, -1, "on_death");
+ lua_getfield(L, -1, field);
if (lua_isnil(L, -1)) {
- lua_pop(L, 2); // Pop on_death and entity
+ lua_pop(L, 2); // Pop callback field and entity
return false;
}
luaL_checktype(L, -1, LUA_TFUNCTION);
lua_pushvalue(L, object); // self
- objectrefGetOrCreate(L, killer); // killer reference
+ objectrefGetOrCreate(L, sao); // killer reference
setOriginFromTable(object);
PCALL_RES(lua_pcall(L, 2, 1, error_handler));
@@ -290,33 +292,28 @@ bool ScriptApiEntity::luaentity_on_death(u16 id, ServerActiveObject *killer)
return retval;
}
-// Calls entity:on_rightclick(ObjectRef clicker)
-void ScriptApiEntity::luaentity_Rightclick(u16 id,
- ServerActiveObject *clicker)
+bool ScriptApiEntity::luaentity_on_death(u16 id, ServerActiveObject *killer)
{
- SCRIPTAPI_PRECHECKHEADER
-
- //infostream<<"scriptapi_luaentity_step: id="<<id<<std::endl;
-
- int error_handler = PUSH_ERROR_HANDLER(L);
+ return luaentity_run_simple_callback(id, killer, "on_death");
+}
- // Get core.luaentities[id]
- luaentity_get(L, id);
- int object = lua_gettop(L);
- // State: object is at top of stack
- // Get function
- lua_getfield(L, -1, "on_rightclick");
- if (lua_isnil(L, -1)) {
- lua_pop(L, 2); // Pop on_rightclick and entity
- return;
- }
- luaL_checktype(L, -1, LUA_TFUNCTION);
- lua_pushvalue(L, object); // self
- objectrefGetOrCreate(L, clicker); // Clicker reference
+// Calls entity:on_rightclick(ObjectRef clicker)
+void ScriptApiEntity::luaentity_Rightclick(u16 id, ServerActiveObject *clicker)
+{
+ luaentity_run_simple_callback(id, clicker, "on_rightclick");
+}
- setOriginFromTable(object);
- PCALL_RES(lua_pcall(L, 2, 0, error_handler));
+void ScriptApiEntity::luaentity_on_attach_child(u16 id, ServerActiveObject *child)
+{
+ luaentity_run_simple_callback(id, child, "on_attach_child");
+}
- lua_pop(L, 2); // Pop object and error handler
+void ScriptApiEntity::luaentity_on_detach_child(u16 id, ServerActiveObject *child)
+{
+ luaentity_run_simple_callback(id, child, "on_detach_child");
}
+void ScriptApiEntity::luaentity_on_detach(u16 id, ServerActiveObject *parent)
+{
+ luaentity_run_simple_callback(id, parent, "on_detach");
+}
diff --git a/src/script/cpp_api/s_entity.h b/src/script/cpp_api/s_entity.h
index 173e24c30..966c2745e 100644
--- a/src/script/cpp_api/s_entity.h
+++ b/src/script/cpp_api/s_entity.h
@@ -41,6 +41,11 @@ public:
ServerActiveObject *puncher, float time_from_last_punch,
const ToolCapabilities *toolcap, v3f dir, s16 damage);
bool luaentity_on_death(u16 id, ServerActiveObject *killer);
- void luaentity_Rightclick(u16 id,
- ServerActiveObject *clicker);
+ void luaentity_Rightclick(u16 id, ServerActiveObject *clicker);
+ void luaentity_on_attach_child(u16 id, ServerActiveObject *child);
+ void luaentity_on_detach_child(u16 id, ServerActiveObject *child);
+ void luaentity_on_detach(u16 id, ServerActiveObject *parent);
+private:
+ bool luaentity_run_simple_callback(u16 id, ServerActiveObject *sao,
+ const char *field);
};