Skip to content

Commit f37bbad

Browse files
authored
Refactor client CLuaTeamDefs (PR #3944)
1 parent ed1301b commit f37bbad

File tree

4 files changed

+59
-141
lines changed

4 files changed

+59
-141
lines changed

Client/mods/deathmatch/logic/CClientTeam.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,19 @@ void CClientTeam::RemoveAll()
6464
m_List.clear();
6565
}
6666

67+
std::vector<CClientPlayer*> CClientTeam::GetPlayers() const
68+
{
69+
std::vector<CClientPlayer*> players;
70+
71+
for (auto iter = IterBegin(); iter != IterEnd(); ++iter)
72+
{
73+
if (!(*iter)->IsBeingDeleted())
74+
players.push_back(*iter);
75+
}
76+
77+
return players;
78+
}
79+
6780
bool CClientTeam::Exists(CClientPlayer* pPlayer)
6881
{
6982
list<CClientPlayer*>::const_iterator iter = m_List.begin();
@@ -96,4 +109,4 @@ void CClientTeam::SetColor(unsigned char ucRed, unsigned char ucGreen, unsigned
96109
m_ucRed = ucRed;
97110
m_ucGreen = ucGreen;
98111
m_ucBlue = ucBlue;
99-
}
112+
}

Client/mods/deathmatch/logic/CClientTeam.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,12 @@ class CClientTeam final : public CClientEntity
4444
void AddPlayer(CClientPlayer* pPlayer, bool bChangePlayer = false);
4545
void RemovePlayer(CClientPlayer* pPlayer, bool bChangePlayer = false);
4646
void RemoveAll();
47+
std::vector<CClientPlayer*> GetPlayers() const;
4748

4849
bool Exists(CClientPlayer* pPlayer);
4950

50-
std::list<CClientPlayer*>::const_iterator IterBegin() { return m_List.begin(); }
51-
std::list<CClientPlayer*>::const_iterator IterEnd() { return m_List.end(); }
51+
std::list<CClientPlayer*>::const_iterator IterBegin() const noexcept { return m_List.begin(); }
52+
std::list<CClientPlayer*>::const_iterator IterEnd() const noexcept { return m_List.end(); }
5253

5354
void GetPosition(CVector& vecPosition) const { vecPosition = m_vecPosition; }
5455
void SetPosition(const CVector& vecPosition) { m_vecPosition = vecPosition; }

Client/mods/deathmatch/logic/luadefs/CLuaTeamDefs.cpp

Lines changed: 34 additions & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,23 @@
22
*
33
* PROJECT: Multi Theft Auto
44
* LICENSE: See LICENSE in the top level directory
5-
* FILE: mods/shared_logic/luadefs/CLuaTeamDefs.cpp
6-
* PURPOSE: Lua team definitions class
75
*
86
* Multi Theft Auto is available from http://www.multitheftauto.com/
97
*
108
*****************************************************************************/
119

1210
#include "StdInc.h"
13-
using std::list;
11+
#include <lua/CLuaFunctionParser.h>
1412

1513
void CLuaTeamDefs::LoadFunctions()
1614
{
1715
constexpr static const std::pair<const char*, lua_CFunction> functions[]{
18-
{"getTeamFromName", GetTeamFromName}, {"getTeamName", GetTeamName}, {"getTeamColor", GetTeamColor},
19-
{"getTeamFriendlyFire", GetTeamFriendlyFire}, {"getPlayersInTeam", GetPlayersInTeam}, {"countPlayersInTeam", CountPlayersInTeam},
16+
{"getTeamFromName", ArgumentParserWarn<false, GetTeamFromName>},
17+
{"getTeamName", ArgumentParserWarn<false, GetTeamName>},
18+
{"getTeamColor", ArgumentParserWarn<false, GetTeamColor>},
19+
{"getTeamFriendlyFire", ArgumentParserWarn<false, GetTeamFriendlyFire>},
20+
{"getPlayersInTeam", ArgumentParserWarn<false, GetPlayersInTeam>},
21+
{"countPlayersInTeam", ArgumentParserWarn<false, CountPlayersInTeam>}
2022
};
2123

2224
// Add functions
@@ -28,156 +30,58 @@ void CLuaTeamDefs::AddClass(lua_State* luaVM)
2830
{
2931
lua_newclass(luaVM);
3032

31-
lua_classfunction(luaVM, "create", "getTeamFromName");
3233
lua_classfunction(luaVM, "getFromName", "getTeamFromName");
3334
lua_classfunction(luaVM, "countPlayers", "countPlayersInTeam");
3435
lua_classfunction(luaVM, "getFriendlyFire", "getTeamFriendlyFire");
3536
lua_classfunction(luaVM, "getName", "getTeamName");
3637
lua_classfunction(luaVM, "getColor", "getTeamColor");
3738
lua_classfunction(luaVM, "getPlayers", "getPlayersInTeam");
3839

39-
lua_classvariable(luaVM, "playerCount", NULL, "countPlayersInTeam");
40-
lua_classvariable(luaVM, "friendlyFire", NULL, "getTeamFriendlyFire");
41-
lua_classvariable(luaVM, "players", NULL, "getPlayersInTeam");
42-
lua_classvariable(luaVM, "name", NULL, "getTeamName");
40+
lua_classvariable(luaVM, "playerCount", nullptr, "countPlayersInTeam");
41+
lua_classvariable(luaVM, "friendlyFire", nullptr, "getTeamFriendlyFire");
42+
lua_classvariable(luaVM, "players", nullptr, "getPlayersInTeam");
43+
lua_classvariable(luaVM, "name", nullptr, "getTeamName");
4344

4445
lua_registerclass(luaVM, "Team", "Element");
4546
}
4647

47-
int CLuaTeamDefs::GetTeamFromName(lua_State* luaVM)
48+
std::variant<CClientTeam*, bool> CLuaTeamDefs::GetTeamFromName(const std::string name) noexcept
4849
{
49-
SString strName = "";
50-
CScriptArgReader argStream(luaVM);
51-
argStream.ReadString(strName);
52-
53-
if (!argStream.HasErrors())
54-
{
55-
CClientTeam* pTeam = m_pTeamManager->GetTeam(strName);
56-
if (pTeam)
57-
{
58-
lua_pushelement(luaVM, pTeam);
59-
return 1;
60-
}
61-
}
62-
else
63-
m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage());
64-
65-
lua_pushboolean(luaVM, false);
66-
return 1;
50+
CClientTeam* team = m_pTeamManager->GetTeam(name.c_str());
51+
52+
if (!team)
53+
return false;
54+
55+
return team;
6756
}
6857

69-
int CLuaTeamDefs::GetTeamName(lua_State* luaVM)
58+
std::string CLuaTeamDefs::GetTeamName(CClientTeam* team)
7059
{
71-
CClientTeam* pTeam = NULL;
72-
CScriptArgReader argStream(luaVM);
73-
argStream.ReadUserData(pTeam);
74-
75-
if (!argStream.HasErrors())
76-
{
77-
const char* szName = pTeam->GetTeamName();
78-
if (szName)
79-
{
80-
lua_pushstring(luaVM, szName);
81-
return 1;
82-
}
83-
}
84-
else
85-
m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage());
86-
87-
lua_pushboolean(luaVM, false);
88-
return 1;
60+
return std::string(team->GetTeamName());
8961
}
9062

91-
int CLuaTeamDefs::GetTeamColor(lua_State* luaVM)
63+
CLuaMultiReturn<std::uint8_t, std::uint8_t, std::uint8_t> CLuaTeamDefs::GetTeamColor(CClientTeam* team) noexcept
9264
{
93-
CClientTeam* pTeam = NULL;
94-
CScriptArgReader argStream(luaVM);
95-
argStream.ReadUserData(pTeam);
96-
97-
if (!argStream.HasErrors())
98-
{
99-
unsigned char ucRed, ucGreen, ucBlue;
100-
pTeam->GetColor(ucRed, ucGreen, ucBlue);
101-
102-
lua_pushnumber(luaVM, ucRed);
103-
lua_pushnumber(luaVM, ucGreen);
104-
lua_pushnumber(luaVM, ucBlue);
105-
return 3;
106-
}
107-
else
108-
m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage());
109-
110-
lua_pushboolean(luaVM, false);
111-
return 1;
65+
std::uint8_t red;
66+
std::uint8_t green;
67+
std::uint8_t blue;
68+
69+
team->GetColor(red, green, blue);
70+
71+
return {red, green, blue};
11272
}
11373

114-
int CLuaTeamDefs::GetTeamFriendlyFire(lua_State* luaVM)
74+
bool CLuaTeamDefs::GetTeamFriendlyFire(CClientTeam* team) noexcept
11575
{
116-
CClientTeam* pTeam = NULL;
117-
CScriptArgReader argStream(luaVM);
118-
argStream.ReadUserData(pTeam);
119-
120-
if (!argStream.HasErrors())
121-
{
122-
bool bFriendlyFire = pTeam->GetFriendlyFire();
123-
lua_pushboolean(luaVM, bFriendlyFire);
124-
return 1;
125-
}
126-
else
127-
m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage());
128-
129-
lua_pushboolean(luaVM, false);
130-
return 1;
76+
return team->GetFriendlyFire();
13177
}
13278

133-
int CLuaTeamDefs::GetPlayersInTeam(lua_State* luaVM)
79+
std::vector<CClientPlayer*> CLuaTeamDefs::GetPlayersInTeam(CClientTeam* team)
13480
{
135-
CClientTeam* pTeam = NULL;
136-
CScriptArgReader argStream(luaVM);
137-
argStream.ReadUserData(pTeam);
138-
139-
if (!argStream.HasErrors())
140-
{
141-
lua_newtable(luaVM);
142-
143-
unsigned int uiIndex = 0;
144-
145-
list<CClientPlayer*>::const_iterator iter = pTeam->IterBegin();
146-
for (; iter != pTeam->IterEnd(); iter++)
147-
{
148-
CClientPlayer* pPlayer = *iter;
149-
if (!pPlayer->IsBeingDeleted())
150-
{
151-
lua_pushnumber(luaVM, ++uiIndex);
152-
lua_pushelement(luaVM, pPlayer);
153-
lua_settable(luaVM, -3);
154-
}
155-
}
156-
157-
return 1;
158-
}
159-
else
160-
m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage());
161-
162-
lua_pushboolean(luaVM, false);
163-
return 1;
81+
return team->GetPlayers();
16482
}
16583

166-
int CLuaTeamDefs::CountPlayersInTeam(lua_State* luaVM)
84+
std::uint32_t CLuaTeamDefs::CountPlayersInTeam(CClientTeam* team) noexcept
16785
{
168-
CClientTeam* pTeam = NULL;
169-
CScriptArgReader argStream(luaVM);
170-
argStream.ReadUserData(pTeam);
171-
172-
if (!argStream.HasErrors())
173-
{
174-
unsigned int uiCount = pTeam->CountPlayers();
175-
lua_pushnumber(luaVM, uiCount);
176-
return 1;
177-
}
178-
else
179-
m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage());
180-
181-
lua_pushboolean(luaVM, false);
182-
return 1;
86+
return team->CountPlayers();
18387
}

Client/mods/deathmatch/logic/luadefs/CLuaTeamDefs.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,26 @@
22
*
33
* PROJECT: Multi Theft Auto
44
* LICENSE: See LICENSE in the top level directory
5-
* FILE: mods/shared_logic/luadefs/CLuaTeamDefs.cpp
6-
* PURPOSE: Lua team definitions class
75
*
86
* Multi Theft Auto is available from http://www.multitheftauto.com/
97
*
108
*****************************************************************************/
119

1210
#pragma once
1311
#include "CLuaDefs.h"
12+
#include <lua/CLuaMultiReturn.h>
1413

1514
class CLuaTeamDefs : public CLuaDefs
1615
{
1716
public:
1817
static void LoadFunctions();
1918
static void AddClass(lua_State* luaVM);
2019

21-
LUA_DECLARE(GetTeamFromName);
22-
LUA_DECLARE(GetTeamName);
23-
LUA_DECLARE(GetTeamColor);
24-
LUA_DECLARE(GetTeamFriendlyFire);
25-
LUA_DECLARE(GetPlayersInTeam);
26-
LUA_DECLARE(CountPlayersInTeam);
20+
private:
21+
static std::variant<CClientTeam*, bool> GetTeamFromName(const std::string name) noexcept;
22+
static std::string GetTeamName(CClientTeam* team);
23+
static CLuaMultiReturn<std::uint8_t, std::uint8_t, std::uint8_t> GetTeamColor(CClientTeam* team) noexcept;
24+
static bool GetTeamFriendlyFire(CClientTeam* team) noexcept;
25+
static std::vector<CClientPlayer*> GetPlayersInTeam(CClientTeam* team);
26+
static std::uint32_t CountPlayersInTeam(CClientTeam* team) noexcept;
2727
};

0 commit comments

Comments
 (0)