diff --git a/Server/mods/deathmatch/logic/CTeam.cpp b/Server/mods/deathmatch/logic/CTeam.cpp index 5c639b1dad..7f132939b3 100644 --- a/Server/mods/deathmatch/logic/CTeam.cpp +++ b/Server/mods/deathmatch/logic/CTeam.cpp @@ -13,7 +13,6 @@ #include "CTeam.h" #include "CLogger.h" #include "Utils.h" -#include "lua/LuaCommon.h" CTeam::CTeam(CTeamManager* pTeamManager, CElement* pParent, const char* szName, unsigned char ucRed, unsigned char ucGreen, unsigned char ucBlue) : CElement(pParent) @@ -118,19 +117,17 @@ void CTeam::RemoveAllPlayers() m_Players.clear(); } -void CTeam::GetPlayers(lua_State* luaVM) +std::vector CTeam::GetPlayers() const { - unsigned int uiIndex = 0; - list::const_iterator iter = m_Players.begin(); - for (; iter != m_Players.end(); ++iter) + std::vector players; + + for (auto iter = m_Players.begin(); iter != m_Players.end(); ++iter) { if (!(*iter)->IsBeingDeleted()) - { - lua_pushnumber(luaVM, ++uiIndex); - lua_pushelement(luaVM, *iter); - lua_settable(luaVM, -3); - } + players.push_back(*iter); } + + return players; } void CTeam::GetColor(unsigned char& ucRed, unsigned char& ucGreen, unsigned char& ucBlue) diff --git a/Server/mods/deathmatch/logic/CTeam.h b/Server/mods/deathmatch/logic/CTeam.h index b2f4356dcb..82de034270 100644 --- a/Server/mods/deathmatch/logic/CTeam.h +++ b/Server/mods/deathmatch/logic/CTeam.h @@ -36,7 +36,7 @@ class CTeam final : public CElement void AddPlayer(CPlayer* pPlayer, bool bChangePlayer = false); void RemovePlayer(CPlayer* pPlayer, bool bChangePlayer = false); void RemoveAllPlayers(); - void GetPlayers(lua_State* luaVM); + std::vector GetPlayers() const; void GetColor(unsigned char& ucRed, unsigned char& ucGreen, unsigned char& ucBlue); void SetColor(unsigned char ucRed, unsigned char ucGreen, unsigned char ucBlue); diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaTeamDefs.cpp b/Server/mods/deathmatch/logic/luadefs/CLuaTeamDefs.cpp index f9993c86c0..008e962155 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaTeamDefs.cpp +++ b/Server/mods/deathmatch/logic/luadefs/CLuaTeamDefs.cpp @@ -1,9 +1,7 @@ /***************************************************************************** * - * PROJECT: Multi Theft Auto v1.x + * PROJECT: Multi Theft Auto * LICENSE: See LICENSE in the top level directory - * FILE: mods/deathmatch/logic/luadefs/CLuaTeamDefs.cpp - * PURPOSE: Lua function definitions class * * Multi Theft Auto is available from http://www.multitheftauto.com/ * @@ -13,27 +11,27 @@ #include "CLuaTeamDefs.h" #include "CLuaGenericDefs.h" #include "CStaticFunctionDefinitions.h" -#include "CScriptArgReader.h" +#include void CLuaTeamDefs::LoadFunctions() { constexpr static const std::pair functions[]{ // Team create/destroy functions - {"createTeam", CreateTeam}, + {"createTeam", ArgumentParserWarn}, // Team get funcs - {"getTeamFromName", GetTeamFromName}, - {"getTeamName", GetTeamName}, - {"getTeamColor", GetTeamColor}, - {"getTeamFriendlyFire", GetTeamFriendlyFire}, - {"getPlayersInTeam", GetPlayersInTeam}, - {"countPlayersInTeam", CountPlayersInTeam}, + {"getTeamName", ArgumentParserWarn}, + {"getTeamFromName", ArgumentParserWarn}, + {"getTeamColor", ArgumentParserWarn}, + {"getTeamFriendlyFire", ArgumentParserWarn}, + {"getPlayersInTeam", ArgumentParserWarn}, + {"countPlayersInTeam", ArgumentParserWarn}, // Team set funcs - {"setPlayerTeam", SetPlayerTeam}, - {"setTeamName", SetTeamName}, - {"setTeamColor", SetTeamColor}, - {"setTeamFriendlyFire", SetTeamFriendlyFire}, + {"setPlayerTeam", ArgumentParserWarn}, + {"setTeamName", ArgumentParserWarn}, + {"setTeamColor", ArgumentParserWarn}, + {"setTeamFriendlyFire", ArgumentParserWarn} }; // Add functions @@ -50,7 +48,7 @@ void CLuaTeamDefs::AddClass(lua_State* luaVM) lua_classfunction(luaVM, "countPlayers", "countPlayersInTeam"); lua_classfunction(luaVM, "getPlayers", "getPlayersInTeam"); lua_classfunction(luaVM, "outputChat", "outputChatBox", ArgumentParserWarn); - + lua_classfunction(luaVM, "getFriendlyFire", "getTeamFriendlyFire"); lua_classfunction(luaVM, "getName", "getTeamName"); lua_classfunction(luaVM, "getColor", "getTeamColor"); @@ -67,282 +65,84 @@ void CLuaTeamDefs::AddClass(lua_State* luaVM) lua_registerclass(luaVM, "Team", "Element"); } -int CLuaTeamDefs::SetPlayerTeam(lua_State* luaVM) +std::variant CLuaTeamDefs::CreateTeam(lua_State* lua, const std::string name, const std::uint8_t red, const std::uint8_t green, const std::uint8_t blue) { - CPlayer* pPlayer; - CTeam* pTeam; - - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pPlayer); - argStream.ReadUserData(pTeam, NULL); + CLuaMain& vm = lua_getownercluamain(lua); + CResource* resource = vm.GetResource(); - if (!argStream.HasErrors()) - { - if (CStaticFunctionDefinitions::SetPlayerTeam(pPlayer, pTeam)) - { - lua_pushboolean(luaVM, true); - return 1; - } - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + if (!resource) + return false; - lua_pushboolean(luaVM, false); - return 1; -} + CTeam* team = CStaticFunctionDefinitions::CreateTeam(resource, name.c_str(), red, green, blue); -int CLuaTeamDefs::CreateTeam(lua_State* luaVM) -{ - SString strName; - unsigned char ucRed; - unsigned char ucGreen; - unsigned char ucBlue; + if (!team) + return false; - CScriptArgReader argStream(luaVM); - argStream.ReadString(strName); - argStream.ReadNumber(ucRed, 235); - argStream.ReadNumber(ucGreen, 221); - argStream.ReadNumber(ucBlue, 178); + CElementGroup* group = resource->GetElementGroup(); - if (!argStream.HasErrors()) - { - CLuaMain* pLuaMain = g_pGame->GetLuaManager()->GetVirtualMachine(luaVM); - if (pLuaMain) - { - CResource* pResource = pLuaMain->GetResource(); - if (pResource) - { - CTeam* pTeam = CStaticFunctionDefinitions::CreateTeam(pResource, strName, ucRed, ucGreen, ucBlue); - if (pTeam) - { - CElementGroup* pGroup = pResource->GetElementGroup(); - if (pGroup) - { - pGroup->Add(pTeam); - } - lua_pushelement(luaVM, pTeam); - return 1; - } - } - } - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + if (group) + group->Add(team); - lua_pushboolean(luaVM, false); - return 1; + return team; } -int CLuaTeamDefs::GetPlayersInTeam(lua_State* luaVM) +std::variant CLuaTeamDefs::GetTeamFromName(const std::string name) { - CTeam* pTeam; + CTeam* team = m_pTeamManager->GetTeam(name.c_str()); - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pTeam); + if (!team) + return false; - if (!argStream.HasErrors()) - { - lua_newtable(luaVM); - - pTeam->GetPlayers(luaVM); - return 1; - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushboolean(luaVM, false); - return 1; + return team; } -int CLuaTeamDefs::GetTeamFromName(lua_State* luaVM) +std::string CLuaTeamDefs::GetTeamName(CTeam* team) { - SString strName; - - CScriptArgReader argStream(luaVM); - argStream.ReadString(strName); - - if (!argStream.HasErrors()) - { - CTeam* pTeam = CStaticFunctionDefinitions::GetTeamFromName(strName); - if (pTeam) - { - lua_pushelement(luaVM, pTeam); - return 1; - } - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushboolean(luaVM, false); - return 1; + return team->GetTeamName(); } -int CLuaTeamDefs::GetTeamName(lua_State* luaVM) +CLuaMultiReturn CLuaTeamDefs::GetTeamColor(CTeam* team) noexcept { - CTeam* pTeam; - - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pTeam); + std::uint8_t red; + std::uint8_t green; + std::uint8_t blue; - if (!argStream.HasErrors()) - { - SString strTeamName; - if (CStaticFunctionDefinitions::GetTeamName(pTeam, strTeamName)) - { - lua_pushstring(luaVM, strTeamName); - return 1; - } - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + team->GetColor(red, green, blue); - lua_pushboolean(luaVM, false); - return 1; + return {red, green, blue}; } -int CLuaTeamDefs::GetTeamColor(lua_State* luaVM) +bool CLuaTeamDefs::GetTeamFriendlyFire(CTeam* team) noexcept { - CTeam* pTeam; - - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pTeam); - - if (!argStream.HasErrors()) - { - unsigned char ucRed, ucGreen, ucBlue; - if (CStaticFunctionDefinitions::GetTeamColor(pTeam, ucRed, ucGreen, ucBlue)) - { - lua_pushnumber(luaVM, ucRed); - lua_pushnumber(luaVM, ucGreen); - lua_pushnumber(luaVM, ucBlue); - return 3; - } - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushboolean(luaVM, false); - return 1; + return team->GetFriendlyFire(); } -int CLuaTeamDefs::GetTeamFriendlyFire(lua_State* luaVM) +std::vector CLuaTeamDefs::GetPlayersInTeam(CTeam* team) { - CTeam* pTeam; - - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pTeam); - - if (!argStream.HasErrors()) - { - bool bFriendlyFire; - if (CStaticFunctionDefinitions::GetTeamFriendlyFire(pTeam, bFriendlyFire)) - { - lua_pushboolean(luaVM, bFriendlyFire); - return 1; - } - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushboolean(luaVM, false); - return 1; + return team->GetPlayers(); } -int CLuaTeamDefs::CountPlayersInTeam(lua_State* luaVM) +std::uint32_t CLuaTeamDefs::CountPlayersInTeam(CTeam* team) noexcept { - CTeam* pTeam; - - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pTeam); - - if (!argStream.HasErrors()) - { - unsigned int uiCount; - if (CStaticFunctionDefinitions::CountPlayersInTeam(pTeam, uiCount)) - { - lua_pushnumber(luaVM, uiCount); - return 1; - } - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushboolean(luaVM, false); - return 1; + return team->CountPlayers(); } -int CLuaTeamDefs::SetTeamName(lua_State* luaVM) +bool CLuaTeamDefs::SetPlayerTeam(CPlayer* player, CTeam* team) noexcept { - CTeam* pElement; - SString strName; - - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pElement); - argStream.ReadString(strName); - - if (!argStream.HasErrors()) - { - if (CStaticFunctionDefinitions::SetTeamName(pElement, strName)) - { - lua_pushboolean(luaVM, true); - return 1; - } - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushboolean(luaVM, false); - return 1; + return CStaticFunctionDefinitions::SetPlayerTeam(player, team); } -int CLuaTeamDefs::SetTeamColor(lua_State* luaVM) +bool CLuaTeamDefs::SetTeamName(CTeam* team, const std::string name) { - CTeam* pElement; - unsigned char ucRed; - unsigned char ucGreen; - unsigned char ucBlue; - - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pElement); - argStream.ReadNumber(ucRed); - argStream.ReadNumber(ucGreen); - argStream.ReadNumber(ucBlue); - - if (!argStream.HasErrors()) - { - if (CStaticFunctionDefinitions::SetTeamColor(pElement, ucRed, ucGreen, ucBlue)) - { - lua_pushboolean(luaVM, true); - return 1; - } - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushboolean(luaVM, false); - return 1; + return CStaticFunctionDefinitions::SetTeamName(team, name.c_str()); } -int CLuaTeamDefs::SetTeamFriendlyFire(lua_State* luaVM) +bool CLuaTeamDefs::SetTeamColor(CTeam* team, const std::uint8_t red, const std::uint8_t green, const std::uint8_t blue) noexcept { - CTeam* pElement; - bool bFriendlyFire; - - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pElement); - argStream.ReadBool(bFriendlyFire); - - if (!argStream.HasErrors()) - { - if (CStaticFunctionDefinitions::SetTeamFriendlyFire(pElement, bFriendlyFire)) - { - lua_pushboolean(luaVM, true); - return 1; - } - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + return CStaticFunctionDefinitions::SetTeamColor(team, red, green, blue); +} - lua_pushboolean(luaVM, false); - return 1; +bool CLuaTeamDefs::SetTeamFriendlyFire(CTeam* team, const bool state) noexcept +{ + return CStaticFunctionDefinitions::SetTeamFriendlyFire(team, state); } diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaTeamDefs.h b/Server/mods/deathmatch/logic/luadefs/CLuaTeamDefs.h index 0de7999a34..3ebad22e0f 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaTeamDefs.h +++ b/Server/mods/deathmatch/logic/luadefs/CLuaTeamDefs.h @@ -1,9 +1,7 @@ /***************************************************************************** * - * PROJECT: Multi Theft Auto v1.0 + * PROJECT: Multi Theft Auto * LICENSE: See LICENSE in the top level directory - * FILE: mods/deathmatch/logic/luadefs/CLuaTeamDefs.h - * PURPOSE: Lua function definitions class * * Multi Theft Auto is available from http://www.multitheftauto.com/ * @@ -11,6 +9,7 @@ #pragma once #include "CLuaDefs.h" +#include class CLuaTeamDefs : public CLuaDefs { @@ -18,20 +17,21 @@ class CLuaTeamDefs : public CLuaDefs static void LoadFunctions(); static void AddClass(lua_State* luaVM); +private: // Team create/destroy functions - LUA_DECLARE(CreateTeam); + static std::variant CreateTeam(lua_State* lua, const std::string name, const std::uint8_t red, const std::uint8_t green, const std::uint8_t blue); // Team get funcs - LUA_DECLARE(GetTeamFromName); - LUA_DECLARE(GetTeamName); - LUA_DECLARE(GetTeamColor); - LUA_DECLARE(GetTeamFriendlyFire); - LUA_DECLARE(GetPlayersInTeam); - LUA_DECLARE(CountPlayersInTeam); + static std::variant GetTeamFromName(const std::string name); + static std::string GetTeamName(CTeam* team); + static CLuaMultiReturn GetTeamColor(CTeam* team) noexcept; + static bool GetTeamFriendlyFire(CTeam* team) noexcept; + static std::vector GetPlayersInTeam(CTeam* team); + static std::uint32_t CountPlayersInTeam(CTeam* team) noexcept; // Team set funcs - LUA_DECLARE(SetPlayerTeam); - LUA_DECLARE(SetTeamName); - LUA_DECLARE(SetTeamColor); - LUA_DECLARE(SetTeamFriendlyFire); -}; \ No newline at end of file + static bool SetPlayerTeam(CPlayer* player, CTeam* team) noexcept; + static bool SetTeamName(CTeam* team, const std::string name); + static bool SetTeamColor(CTeam* team, const std::uint8_t red, const std::uint8_t green, const std::uint8_t blue) noexcept; + static bool SetTeamFriendlyFire(CTeam* team, const bool state) noexcept; +};