X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fscript%2Fcpp_api%2Fs_entity.cpp;h=746f7013e99d6505770b308378a165d47f1b331f;hb=6e0e0324a48130376ab3c9fef03b84ee25608242;hp=9e2193970c28d45b61abf101cd5f8b05f28a28a8;hpb=3b9ae409c7d7e9445099b86c85392dba4771e08a;p=minetest.git diff --git a/src/script/cpp_api/s_entity.cpp b/src/script/cpp_api/s_entity.cpp index 9e2193970..746f7013e 100644 --- a/src/script/cpp_api/s_entity.cpp +++ b/src/script/cpp_api/s_entity.cpp @@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "object_properties.h" #include "common/c_converter.h" #include "common/c_content.h" +#include "server.h" bool ScriptApiEntity::luaentity_Add(u16 id, const char *name) { @@ -56,7 +57,7 @@ bool ScriptApiEntity::luaentity_Add(u16 id, const char *name) // Add object reference // This should be userdata with metatable ObjectRef - objectrefGet(L, id); + push_objectRef(L, id); luaL_checktype(L, -1, LUA_TUSERDATA); if (!luaL_checkudata(L, -1, "ObjectRef")) luaL_typerror(L, -1, "ObjectRef"); @@ -102,6 +103,32 @@ void ScriptApiEntity::luaentity_Activate(u16 id, lua_pop(L, 2); // Pop object and error handler } +void ScriptApiEntity::luaentity_Deactivate(u16 id) +{ + SCRIPTAPI_PRECHECKHEADER + + verbosestream << "scriptapi_luaentity_deactivate: id=" << id << std::endl; + + int error_handler = PUSH_ERROR_HANDLER(L); + + // Get the entity + luaentity_get(L, id); + int object = lua_gettop(L); + + // Get on_deactivate + lua_getfield(L, -1, "on_deactivate"); + if (!lua_isnil(L, -1)) { + luaL_checktype(L, -1, LUA_TFUNCTION); + lua_pushvalue(L, object); + + setOriginFromTable(object); + PCALL_RES(lua_pcall(L, 1, 0, error_handler)); + } else { + lua_pop(L, 1); + } + lua_pop(L, 2); // Pop object and error handler +} + void ScriptApiEntity::luaentity_Remove(u16 id) { SCRIPTAPI_PRECHECKHEADER @@ -156,7 +183,7 @@ std::string ScriptApiEntity::luaentity_GetStaticdata(u16 id) } void ScriptApiEntity::luaentity_GetProperties(u16 id, - ObjectProperties *prop) + ServerActiveObject *self, ObjectProperties *prop) { SCRIPTAPI_PRECHECKHEADER @@ -168,39 +195,20 @@ void ScriptApiEntity::luaentity_GetProperties(u16 id, // Set default values that differ from ObjectProperties defaults prop->hp_max = 10; - /* Read stuff */ - - prop->hp_max = getintfield_default(L, -1, "hp_max", 10); - - getboolfield(L, -1, "physical", prop->physical); - getboolfield(L, -1, "collide_with_objects", prop->collideWithObjects); - - getfloatfield(L, -1, "weight", prop->weight); - - lua_getfield(L, -1, "collisionbox"); - if (lua_istable(L, -1)) - prop->collisionbox = read_aabb3f(L, -1, 1.0); - lua_pop(L, 1); - - getstringfield(L, -1, "visual", prop->visual); - - getstringfield(L, -1, "mesh", prop->mesh); - // Deprecated: read object properties directly - read_object_properties(L, -1, prop); + read_object_properties(L, -1, self, prop, getServer()->idef()); // Read initial_properties lua_getfield(L, -1, "initial_properties"); - read_object_properties(L, -1, prop); + read_object_properties(L, -1, self, prop, getServer()->idef()); lua_pop(L, 1); } -void ScriptApiEntity::luaentity_Step(u16 id, float dtime) +void ScriptApiEntity::luaentity_Step(u16 id, float dtime, + const collisionMoveResult *moveresult) { SCRIPTAPI_PRECHECKHEADER - //infostream<<"scriptapi_luaentity_step: id="<(L, -1); lua_pop(L, 2); // Pop object and error handler return retval; } -// Calls entity:on_rightclick(ObjectRef clicker) -void ScriptApiEntity::luaentity_Rightclick(u16 id, - ServerActiveObject *clicker) +// Calls entity[field](ObjectRef self, ObjectRef sao) +bool ScriptApiEntity::luaentity_run_simple_callback(u16 id, + ServerActiveObject *sao, const char *field) { SCRIPTAPI_PRECHECKHEADER - //infostream<<"scriptapi_luaentity_step: id="<(L, -1); lua_pop(L, 2); // Pop object and error handler + return retval; +} + +bool ScriptApiEntity::luaentity_on_death(u16 id, ServerActiveObject *killer) +{ + return luaentity_run_simple_callback(id, killer, "on_death"); } +// Calls entity:on_rightclick(ObjectRef clicker) +void ScriptApiEntity::luaentity_Rightclick(u16 id, ServerActiveObject *clicker) +{ + luaentity_run_simple_callback(id, clicker, "on_rightclick"); +} + +void ScriptApiEntity::luaentity_on_attach_child(u16 id, ServerActiveObject *child) +{ + luaentity_run_simple_callback(id, child, "on_attach_child"); +} + +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"); +}