From 2341a4aff1242e978d6fad3772d4d4fb015c040d Mon Sep 17 00:00:00 2001 From: Zughy <63455151+Zughy@users.noreply.github.com> Date: Tue, 13 Oct 2020 21:27:52 +0200 Subject: [PATCH] Add ObjectRef:get_children() (#10480) Co-authored-by: Zughy <4279489-marco_a@users.noreply.gitlab.com> --- doc/lua_api.txt | 2 ++ src/script/lua_api/l_object.cpp | 22 ++++++++++++++++++++++ src/script/lua_api/l_object.h | 3 +++ 3 files changed, 27 insertions(+) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index c8b294149..1631d564c 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -6206,6 +6206,8 @@ object you are working with still exists. should appear in first person. * `get_attach()`: returns parent, bone, position, rotation, forced_visible, or nil if it isn't attached. +* `get_children()`: returns a list of ObjectRefs that are attached to the + object. * `set_detach()` * `set_bone_position(bone, position, rotation)` * `bone`: string diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index 57ed7e2cd..96c8c687c 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -738,6 +738,27 @@ int ObjectRef::l_get_attach(lua_State *L) return 5; } +// get_children(self) +int ObjectRef::l_get_children(lua_State *L) +{ + GET_ENV_PTR; + + ObjectRef *ref = checkobject(L, 1); + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) + return 0; + + const std::unordered_set child_ids = sao->getAttachmentChildIds(); + int i = 0; + lua_createtable(L, child_ids.size(), 0); + for (const int id : child_ids) { + ServerActiveObject *child = env->getActiveObject(id); + getScriptApiBase(L)->objectrefGetOrCreate(L, child); + lua_rawseti(L, -2, ++i); + } + return 1; +} + // set_detach(self) int ObjectRef::l_set_detach(lua_State *L) { @@ -2337,6 +2358,7 @@ luaL_Reg ObjectRef::methods[] = { luamethod(ObjectRef, get_bone_position), luamethod(ObjectRef, set_attach), luamethod(ObjectRef, get_attach), + luamethod(ObjectRef, get_children), luamethod(ObjectRef, set_detach), luamethod(ObjectRef, set_properties), luamethod(ObjectRef, get_properties), diff --git a/src/script/lua_api/l_object.h b/src/script/lua_api/l_object.h index ca03dfa2e..097a74cae 100644 --- a/src/script/lua_api/l_object.h +++ b/src/script/lua_api/l_object.h @@ -143,6 +143,9 @@ private: // get_attach(self) static int l_get_attach(lua_State *L); + // get_children(self) + static int l_get_children(lua_State *L); + // set_detach(self) static int l_set_detach(lua_State *L);