diff options
author | SmallJoker <SmallJoker@users.noreply.github.com> | 2018-04-30 18:43:49 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-04-30 18:43:49 +0200 |
commit | ba91624d8c354bac49c35a449029b6712022d0cb (patch) | |
tree | 8a6423ab354888691927f852754f86816f9c90c5 /src/script/cpp_api | |
parent | 0b5b32b026291d5bd8e47acebca10259a379fc1c (diff) | |
download | minetest-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.cpp | 53 | ||||
-rw-r--r-- | src/script/cpp_api/s_entity.h | 9 |
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); }; |