From 60b5e260d0d266a03eb27cb8d0b082619ff07267 Mon Sep 17 00:00:00 2001 From: iThorgrim <125808072+iThorgrim@users.noreply.github.com> Date: Sun, 26 Jan 2025 18:48:32 +0100 Subject: [PATCH] feat(LuaEngine/MapMethods): add GetCreatures and GetCreaturesByAreaId methods (#230) Co-authored-by: 55Honey <71938210+55Honey@users.noreply.github.com> --- src/LuaEngine/LuaFunctions.cpp | 3 ++ src/LuaEngine/methods/MapMethods.h | 57 ++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/src/LuaEngine/LuaFunctions.cpp b/src/LuaEngine/LuaFunctions.cpp index 46aaf7255a..70d79b6244 100644 --- a/src/LuaEngine/LuaFunctions.cpp +++ b/src/LuaEngine/LuaFunctions.cpp @@ -1202,6 +1202,9 @@ ElunaRegister MapMethods[] = { "GetAreaId", &LuaMap::GetAreaId }, { "GetHeight", &LuaMap::GetHeight }, { "GetWorldObject", &LuaMap::GetWorldObject }, + { "GetCreatures", &LuaMap::GetCreatures }, + { "GetCreaturesByAreaId", &LuaMap::GetCreaturesByAreaId }, + // Setters { "SetWeather", &LuaMap::SetWeather }, diff --git a/src/LuaEngine/methods/MapMethods.h b/src/LuaEngine/methods/MapMethods.h index c2781cc975..a2a269aeea 100644 --- a/src/LuaEngine/methods/MapMethods.h +++ b/src/LuaEngine/methods/MapMethods.h @@ -325,5 +325,62 @@ namespace LuaMap lua_settop(L, tbl); return 1; } + + /** + * Returns a table with all the current [Creature]s in the map + * + * @return table mapCreatures + */ + int GetCreatures(lua_State* L, Map* map) + { + const auto& creatures = map->GetCreatureBySpawnIdStore(); + + lua_createtable(L, creatures.size(), 0); + int tbl = lua_gettop(L); + + for (const auto& pair : creatures) + { + Creature* creature = pair.second; + + Eluna::Push(L, creature); + lua_rawseti(L, tbl, creature->GetSpawnId()); + } + + lua_settop(L, tbl); + return 1; + } + + /** + * Returns a table with all the current [Creature]s in the specific area id + * + * @param number areaId : specific area id + * @return table mapCreatures + */ + int GetCreaturesByAreaId(lua_State* L, Map* map) + { + uint32 areaId = Eluna::CHECKVAL(L, 2, -1); + std::vector filteredCreatures; + + for (const auto& pair : map->GetCreatureBySpawnIdStore()) + { + Creature* creature = pair.second; + if (areaId == -1 || creature->GetAreaId() == areaId) + { + filteredCreatures.push_back(creature); + } + } + + lua_createtable(L, filteredCreatures.size(), 0); + int tbl = lua_gettop(L); + + for (Creature* creature : filteredCreatures) + { + Eluna::Push(L, creature); + lua_rawseti(L, tbl, creature->GetSpawnId()); + } + + lua_settop(L, tbl); + return 1; + } }; #endif