Skip to content

Commit

Permalink
Add player connected checks to GetPlayerInfo calls
Browse files Browse the repository at this point in the history
  • Loading branch information
tmp64 committed Sep 11, 2024
1 parent 2643d1e commit 66d5785
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 45 deletions.
4 changes: 2 additions & 2 deletions src/game/client/GameStudioModelRenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -525,7 +525,7 @@ void CGameStudioModelRenderer::ForceModelCommand(void)

CPlayerInfo *pi = GetPlayerInfo(i + 1)->Update();

if (!CHudSpectator::Get()->IsActivePlayer(gEngfuncs.GetEntityByIndex(i + 1)))
if (!pi->IsConnected() || !CHudSpectator::Get()->IsActivePlayer(gEngfuncs.GetEntityByIndex(i + 1)))
continue;

strncpy(plrName, pi->GetName(), MAX_PLAYER_NAME - 1);
Expand Down Expand Up @@ -601,7 +601,7 @@ void CGameStudioModelRenderer::ForceColorsCommand(void)

CPlayerInfo *pi = GetPlayerInfo(i + 1)->Update();

if (!CHudSpectator::Get()->IsActivePlayer(gEngfuncs.GetEntityByIndex(i + 1)))
if (!pi->IsConnected() || !CHudSpectator::Get()->IsActivePlayer(gEngfuncs.GetEntityByIndex(i + 1)))
continue;

strncpy(plrName, pi->GetName(), MAX_PLAYER_NAME - 1);
Expand Down
3 changes: 1 addition & 2 deletions src/game/client/hud/ag/ag_global.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,9 +82,8 @@ int AgHudGlobal::MsgFunc_AuthID(const char *pszName, int iSize, void *pbuf)
const int slot = READ_BYTE();
char *steamid = READ_STRING();

if (slot > 0 && slot <= MAX_PLAYERS)
if (CPlayerInfo *pi = GetPlayerInfoSafe(slot))
{
CPlayerInfo *pi = GetPlayerInfo(slot);
if (!strncmp(steamid, "STEAM_", 6) || !strncmp(steamid, "VALVE_", 6))
Q_strncpy(pi->m_szSteamID, steamid + 6, sizeof(pi->m_szSteamID)); // cutout "STEAM_" or "VALVE_" start of the string
else
Expand Down
72 changes: 35 additions & 37 deletions src/game/client/hud/chat.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -838,8 +838,8 @@ Color CHudChat::GetDefaultTextColor(void)
//-----------------------------------------------------------------------------
Color CHudChat::GetClientColor(int clientIndex)
{
if (clientIndex >= 1 && clientIndex <= MAX_PLAYERS)
return g_pViewport->GetTeamColor(GetPlayerInfo(clientIndex)->Update()->GetTeamNumber());
if (CPlayerInfo *pi = GetPlayerInfoSafe(clientIndex))
return g_pViewport->GetTeamColor(pi->Update()->GetTeamNumber());

return g_pViewport->GetTeamColor(0);
}
Expand Down Expand Up @@ -1206,46 +1206,44 @@ void CHudChat::ChatPrintf(int iPlayerIndex, const char *fmt, ...)
AgHudLocation::Get()->ParseAndEditSayString(iPlayerIndex, msg, sizeof(msg));

// Replace server name with real name
CPlayerInfo *pi = nullptr;
if (iPlayerIndex != 0)
{
pi = GetPlayerInfo(iPlayerIndex)->Update();
CPlayerInfo *pi = GetPlayerInfoSafe(iPlayerIndex);
if (pi)
pi->Update();

if (pi->HasRealName())
{
const char *realname = pi->GetDisplayName();
int realnamelen = strlen(realname);
if (pi && pi->HasRealName())
{
const char *realname = pi->GetDisplayName();
int realnamelen = strlen(realname);

// Find player name
const char *nameinmsg = strstr(msg, pi->GetName());
int namelen = 0;
// Find player name
const char *nameinmsg = strstr(msg, pi->GetName());
int namelen = 0;

if (!nameinmsg)
{
// Try name without color codes (miniAG bug)
const char *strippedname = RemoveColorCodes(pi->GetName());
nameinmsg = strstr(msg, strippedname);
if (!nameinmsg)
{
// Try name without color codes (miniAG bug)
const char *strippedname = RemoveColorCodes(pi->GetName());
nameinmsg = strstr(msg, strippedname);

if (nameinmsg)
namelen = strlen(strippedname);
}
else
{
namelen = strlen(pi->GetName());
}
if (nameinmsg)
namelen = strlen(strippedname);
}
else
{
namelen = strlen(pi->GetName());
}

if (namelen > 0)
{
int namestart = nameinmsg - msg;
int nameend = namestart + namelen;
int realnameend = namestart + realnamelen;
if (namelen > 0)
{
int namestart = nameinmsg - msg;
int nameend = namestart + namelen;
int realnameend = namestart + realnamelen;

// Move part after the name to where it will be after replace
memmove(msg + realnameend, msg + nameend, std::min(sizeof(msg) - nameend + 1, sizeof(msg) - realnameend - 1));
// Move part after the name to where it will be after replace
memmove(msg + realnameend, msg + nameend, std::min(sizeof(msg) - nameend + 1, sizeof(msg) - realnameend - 1));

// Replace name with realname
memcpy(msg + namestart, realname, realnamelen);
}
// Replace name with realname
memcpy(msg + namestart, realname, realnamelen);
}
}

Expand Down Expand Up @@ -1293,9 +1291,9 @@ void CHudChat::ChatPrintf(int iPlayerIndex, const char *fmt, ...)
int iNameLength = 0;

const char *playerName = "Console";
if (iPlayerIndex != 0)
if (CPlayerInfo *pi = GetPlayerInfoSafe(iPlayerIndex))
{
playerName = GetPlayerInfo(iPlayerIndex)->Update()->GetDisplayName();
playerName = pi->Update()->GetDisplayName();
}

int msglen = strlen(pmsg);
Expand Down
8 changes: 4 additions & 4 deletions src/game/client/hud/death_notice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ int CHudDeathNotice::MsgFunc_DeathMsg(const char *pszName, int iSize, void *pbuf
// Get the Killer's name
CPlayerInfo *killerInfo = nullptr;
const char *killer_name;
if (killer != 0 && (killerInfo = GetPlayerInfo(killer))->IsConnected())
if (killer != 0 && (killerInfo = GetPlayerInfoSafe(killer)))
{
killer_name = killerInfo->GetDisplayName();

Expand All @@ -223,7 +223,7 @@ int CHudDeathNotice::MsgFunc_DeathMsg(const char *pszName, int iSize, void *pbuf
// Get the Victim's name
const char *victim_name = NULL;
// If victim is -1, the killer killed a specific, non-player object (like a sentrygun)
if (((char)victim) != -1)
if (((char)victim) != -1 && GetPlayerInfoSafe(victim))
victim_name = GetPlayerInfo(victim)->GetDisplayName();
if (!victim_name)
{
Expand All @@ -232,9 +232,9 @@ int CHudDeathNotice::MsgFunc_DeathMsg(const char *pszName, int iSize, void *pbuf
}
else
{
CPlayerInfo *victimInfo = GetPlayerInfo(victim);
CPlayerInfo *victimInfo = GetPlayerInfoSafe(victim);

if (victimInfo->GetTeamNumber() == 0)
if (!victimInfo || victimInfo->GetTeamNumber() == 0)
{
rgDeathNoticeList[i].bVictimHasColor = false;
}
Expand Down
1 change: 1 addition & 0 deletions src/game/client/player_info.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -334,6 +334,7 @@ bool CPlayerInfo::IsSpectator()

const char *CPlayerInfo::GetDisplayName(bool bNoColorCodes)
{
Assert(m_bIsConnected);
const char *name = nullptr;

if (m_szRealName[0])
Expand Down

0 comments on commit 66d5785

Please sign in to comment.