diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaElementDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaElementDefs.cpp index c763e1d3f4..285262f5ce 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaElementDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaElementDefs.cpp @@ -61,6 +61,7 @@ void CLuaElementDefs::LoadFunctions() {"getElementColShape", GetElementColShape}, {"isElementInWater", IsElementInWater}, {"isElementSyncer", IsElementSyncer}, + {"getElementsSyncedByPlayer", ArgumentParser}, {"isElementCollidableWith", IsElementCollidableWith}, {"isElementDoubleSided", IsElementDoubleSided}, {"getElementCollisionsEnabled", GetElementCollisionsEnabled}, @@ -1478,6 +1479,36 @@ int CLuaElementDefs::IsElementSyncer(lua_State* luaVM) return 1; } +std::vector CLuaElementDefs::GetElementsSyncedByPlayer() +{ + std::vector elements; + + // Check all peds + CPedSync* pPedSync = m_pClientGame->GetPedSync(); + for (auto iter = pPedSync->IterBegin(); iter != pPedSync->IterEnd(); ++iter) + { + elements.push_back(*iter); + } + + // Check all vehicles + CUnoccupiedVehicleSync* pVehicleSync = m_pClientGame->GetUnoccupiedVehicleSync(); + for (auto iter = pVehicleSync->IterBegin(); iter != pVehicleSync->IterEnd(); ++iter) + { + elements.push_back(*iter); + } + +#ifdef WITH_OBJECT_SYNC + // Check all objects + CObjectSync* pObjectSync = m_pClientGame->GetObjectSync(); + for (auto iter = pObjectSync->IterBegin(); iter != pObjectSync->IterEnd(); ++iter) + { + elements.push_back(*iter); + } +#endif + + return elements; +} + int CLuaElementDefs::IsElementCollidableWith(lua_State* luaVM) { // Verify the arguments diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaElementDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaElementDefs.h index 3d82ddcb14..20a891baa9 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaElementDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaElementDefs.h @@ -63,6 +63,7 @@ class CLuaElementDefs : public CLuaDefs LUA_DECLARE(GetElementColShape); LUA_DECLARE(IsElementInWater); LUA_DECLARE(IsElementSyncer); + static std::vector GetElementsSyncedByPlayer(); LUA_DECLARE(IsElementCollidableWith); LUA_DECLARE(IsElementDoubleSided); LUA_DECLARE(GetElementCollisionsEnabled); diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaDefs.cpp b/Server/mods/deathmatch/logic/luadefs/CLuaDefs.cpp index 7d054a0dcb..f87ca54b35 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaDefs.cpp +++ b/Server/mods/deathmatch/logic/luadefs/CLuaDefs.cpp @@ -47,6 +47,7 @@ CObjectManager* CLuaDefs::m_pObjectManager = NULL; CBuildingManager* CLuaDefs::m_pBuildingManager = nullptr; CPickupManager* CLuaDefs::m_pPickupManager = NULL; CPlayerManager* CLuaDefs::m_pPlayerManager = NULL; +CPedManager* CLuaDefs::m_pPedManager = NULL; CRadarAreaManager* CLuaDefs::m_pRadarAreaManager = NULL; CRegisteredCommands* CLuaDefs::m_pRegisteredCommands; CElement* CLuaDefs::m_pRootElement = NULL; @@ -71,6 +72,7 @@ void CLuaDefs::Initialize(CGame* pGame) m_pBuildingManager = pGame->GetBuildingManager(); m_pPickupManager = pGame->GetPickupManager(); m_pPlayerManager = pGame->GetPlayerManager(); + m_pPedManager = pGame->GetPedManager(); m_pRadarAreaManager = pGame->GetRadarAreaManager(); m_pRegisteredCommands = pGame->GetRegisteredCommands(); m_pScriptDebugging = pGame->GetScriptDebugging(); diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaDefs.h b/Server/mods/deathmatch/logic/luadefs/CLuaDefs.h index f8e3e90e9d..7ba1c45d3d 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaDefs.h +++ b/Server/mods/deathmatch/logic/luadefs/CLuaDefs.h @@ -24,6 +24,7 @@ #include "../CBuildingManager.h" #include "../CPickupManager.h" #include "../CPlayerManager.h" +#include "../CPedManager.h" #include "../CRadarAreaManager.h" #include "../CRegisteredCommands.h" #include "../CResourceManager.h" @@ -59,6 +60,7 @@ class CLuaDefs static CBuildingManager* m_pBuildingManager; static CPickupManager* m_pPickupManager; static CPlayerManager* m_pPlayerManager; + static CPedManager* m_pPedManager; static CRadarAreaManager* m_pRadarAreaManager; static CRegisteredCommands* m_pRegisteredCommands; static CElement* m_pRootElement; diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaElementDefs.cpp b/Server/mods/deathmatch/logic/luadefs/CLuaElementDefs.cpp index 7d339104fb..468908af8d 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaElementDefs.cpp +++ b/Server/mods/deathmatch/logic/luadefs/CLuaElementDefs.cpp @@ -59,6 +59,7 @@ void CLuaElementDefs::LoadFunctions() {"getElementHealth", getElementHealth}, {"getElementModel", getElementModel}, {"getElementSyncer", getElementSyncer}, + {"getElementsSyncedByPlayer", ArgumentParser}, {"getElementCollisionsEnabled", getElementCollisionsEnabled}, {"getLowLODElement", getLowLODElement}, {"isElementOnFire", ArgumentParser}, @@ -1383,6 +1384,38 @@ int CLuaElementDefs::getElementSyncer(lua_State* luaVM) return 1; } +std::vector CLuaElementDefs::GetElementsSyncedByPlayer(CPlayer* player) +{ + std::vector elements; + + // Check all vehicles + for (CVehicle* pVehicle : m_pVehicleManager->GetVehicles()) + { + if (pVehicle->GetSyncer() == player) + elements.push_back(pVehicle); + } + + // Check all peds + for (auto iter = m_pPedManager->IterBegin(); iter != m_pPedManager->IterEnd(); ++iter) + { + CPed* pPed = *iter; + if (pPed->GetSyncer() == player) + elements.push_back(pPed); + } + +#ifdef WITH_OBJECT_SYNC + // Check all objects + for (auto iter = m_pObjectManager->IterBegin(); iter != m_pObjectManager->IterEnd(); ++iter) + { + CObject* pObject = *iter; + if (pObject->GetSyncer() == player) + elements.push_back(pObject); + } +#endif + + return elements; +} + int CLuaElementDefs::getElementCollisionsEnabled(lua_State* luaVM) { // bool getElementCollisionsEnabled ( element theElement ) diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaElementDefs.h b/Server/mods/deathmatch/logic/luadefs/CLuaElementDefs.h index 89745b5a3f..4ccc14bacf 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaElementDefs.h +++ b/Server/mods/deathmatch/logic/luadefs/CLuaElementDefs.h @@ -57,6 +57,7 @@ class CLuaElementDefs : public CLuaDefs LUA_DECLARE(getElementModel); LUA_DECLARE(isElementInWater); LUA_DECLARE(getElementSyncer); + static std::vector GetElementsSyncedByPlayer(CPlayer* player); LUA_DECLARE(getElementCollisionsEnabled); LUA_DECLARE(isElementFrozen); LUA_DECLARE(getLowLODElement); diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaPlayerDefs.cpp b/Server/mods/deathmatch/logic/luadefs/CLuaPlayerDefs.cpp index 41ea546480..8662de77eb 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaPlayerDefs.cpp +++ b/Server/mods/deathmatch/logic/luadefs/CLuaPlayerDefs.cpp @@ -180,6 +180,7 @@ void CLuaPlayerDefs::AddClass(lua_State* luaVM) lua_classfunction(luaVM, "getCameraMatrix", "getCameraMatrix"); lua_classfunction(luaVM, "getCameraTarget", "getCameraTarget"); lua_classfunction(luaVM, "getScriptDebugLevel", "getPlayerScriptDebugLevel"); + lua_classfunction(luaVM, "getElementsSyncedBy", "getElementsSyncedByPlayer"); lua_classvariable(luaVM, "account", NULL, "getPlayerAccount"); lua_classvariable(luaVM, "cameraInterior", "setCameraInterior", "getCameraInterior");