Unify time score handling in the server

It's now always -1 for "no time" or a nonnegative integer for the number
of seconds it took the player to finish the map.
This commit is contained in:
heinrich5991 2022-10-12 16:07:35 +02:00
parent f977a382f3
commit d8053fba7d
6 changed files with 16 additions and 29 deletions

View file

@ -296,7 +296,7 @@ void CServer::CClient::Reset()
m_LastAckedSnapshot = -1;
m_LastInputTick = -1;
m_SnapRate = CClient::SNAPRATE_INIT;
m_Score = 0;
m_Score = -1;
m_NextMapChunk = 0;
m_Flags = 0;
}
@ -2014,7 +2014,7 @@ void CServer::CacheServerInfo(CCache *pCache, int Type, bool SendClients)
q.AddString(ClientClan(i), MAX_CLAN_LENGTH); // client clan
ADD_INT(q, m_aClients[i].m_Country); // client country
ADD_INT(q, m_aClients[i].m_Score); // client score
ADD_INT(q, m_aClients[i].m_Score == -1 ? -9999 : m_aClients[i].m_Score == 9999 ? -10000 : -m_aClients[i].m_Score); // client score
ADD_INT(q, GameServer()->IsClientPlayer(i) ? 1 : 0); // is player?
if(Type == SERVERINFO_EXTENDED)
q.AddString("", 0); // extra info, reserved
@ -2096,7 +2096,7 @@ void CServer::CacheServerInfoSixup(CCache *pCache, bool SendClients)
Packer.AddString(ClientName(i), MAX_NAME_LENGTH); // client name
Packer.AddString(ClientClan(i), MAX_CLAN_LENGTH); // client clan
Packer.AddInt(m_aClients[i].m_Country); // client country
Packer.AddInt(m_aClients[i].m_Score == -9999 ? -1 : -m_aClients[i].m_Score); // client score
Packer.AddInt(m_aClients[i].m_Score); // client score
Packer.AddInt(GameServer()->IsClientPlayer(i) ? 0 : 1); // flag spectator=1, bot=2 (player=0)
}
}
@ -2250,7 +2250,7 @@ void CServer::UpdateRegisterServerInfo()
EscapeJson(aCName, sizeof(aCName), ClientName(i)),
EscapeJson(aCClan, sizeof(aCClan), ClientClan(i)),
m_aClients[i].m_Country,
m_aClients[i].m_Score,
m_aClients[i].m_Score == -1 ? -9999 : m_aClients[i].m_Score == 9999 ? -10000 : -m_aClients[i].m_Score,
JsonBool(GameServer()->IsClientPlayer(i)));
str_append(aInfo, aClientInfo, sizeof(aInfo));
FirstPlayer = false;

View file

@ -119,8 +119,7 @@ void CPlayer::Reset()
m_DND = false;
m_LastPause = 0;
m_Score = -9999;
m_HasFinishScore = false;
m_Score = -1;
// Variable initialized:
m_Last_Team = 0;
@ -337,11 +336,10 @@ void CPlayer::Snap(int SnappingClient)
int SnappingClientVersion = GameServer()->GetClientVersion(SnappingClient);
int Latency = SnappingClient == SERVER_DEMO_CLIENT ? m_Latency.m_Min : GameServer()->m_apPlayers[SnappingClient]->m_aCurLatency[m_ClientID];
int Score = abs(m_Score) * -1;
int Score = m_Score;
// send 0 if times of others are not shown
if(SnappingClient != m_ClientID && g_Config.m_SvHideScore)
Score = -9999;
Score = -1;
if(!Server()->IsSixup(SnappingClient))
{
@ -350,7 +348,10 @@ void CPlayer::Snap(int SnappingClient)
return;
pPlayerInfo->m_Latency = Latency;
pPlayerInfo->m_Score = Score;
// -9999 stands for no time and isn't displayed in scoreboard, so
// shift the time by a second if the player actually took 9999
// seconds to finish the map.
pPlayerInfo->m_Score = Score == -1 ? -9999 : Score == 9999 ? -10000 : -Score;
pPlayerInfo->m_Local = (int)(m_ClientID == SnappingClient && (m_Paused != PAUSE_PAUSED || SnappingClientVersion >= VERSION_DDNET_OLD));
pPlayerInfo->m_ClientID = id;
pPlayerInfo->m_Team = m_Team;
@ -373,7 +374,7 @@ void CPlayer::Snap(int SnappingClient)
pPlayerInfo->m_PlayerFlags |= protocol7::PLAYERFLAG_ADMIN;
// Times are in milliseconds for 0.7
pPlayerInfo->m_Score = Score == -9999 ? -1 : -Score * 1000;
pPlayerInfo->m_Score = Score == -1 ? -1 : Score * 1000;
pPlayerInfo->m_Latency = Latency;
}
@ -878,13 +879,7 @@ void CPlayer::ProcessScoreResult(CScorePlayerResult &Result)
break;
case CScorePlayerResult::PLAYER_INFO:
GameServer()->Score()->PlayerData(m_ClientID)->Set(Result.m_Data.m_Info.m_Time, Result.m_Data.m_Info.m_aTimeCp);
m_Score = Result.m_Data.m_Info.m_Score;
m_HasFinishScore = Result.m_Data.m_Info.m_HasFinishScore;
// -9999 stands for no time and isn't displayed in scoreboard, so
// shift the time by a second if the player actually took 9999
// seconds to finish the map.
if(m_HasFinishScore && m_Score == -9999)
m_Score = -10000;
m_Score = Result.m_Data.m_Info.m_Time;
Server()->ExpireServerInfo();
int Birthday = Result.m_Data.m_Info.m_Birthday;
if(Birthday != 0 && !m_BirthdayAnnounced)

View file

@ -182,7 +182,6 @@ public:
bool m_SpecTeam;
bool m_NinjaJetpack;
bool m_Afk;
bool m_HasFinishScore;
int m_ChatScore;

View file

@ -37,10 +37,8 @@ void CScorePlayerResult::SetVariant(Variant v)
m_Data.m_MapVote.m_aServer[0] = '\0';
break;
case PLAYER_INFO:
m_Data.m_Info.m_Score = -9999;
m_Data.m_Info.m_Birthday = 0;
m_Data.m_Info.m_HasFinishScore = false;
m_Data.m_Info.m_Time = 0;
m_Data.m_Info.m_Time = -1;
for(float &TimeCp : m_Data.m_Info.m_aTimeCp)
TimeCp = 0;
}
@ -165,8 +163,6 @@ bool CScoreWorker::LoadPlayerData(IDbConnection *pSqlServer, const ISqlData *pGa
// get the best time
float Time = pSqlServer->GetFloat(1);
pResult->m_Data.m_Info.m_Time = Time;
pResult->m_Data.m_Info.m_Score = -Time;
pResult->m_Data.m_Info.m_HasFinishScore = true;
}
for(int i = 0; i < NUM_CHECKPOINTS; i++)

View file

@ -45,10 +45,8 @@ struct CScorePlayerResult : ISqlResult
char m_aBroadcast[1024];
struct
{
float m_Time;
float m_Time; // -1 for no time.
float m_aTimeCp[NUM_CHECKPOINTS];
int m_Score;
int m_HasFinishScore;
int m_Birthday; // 0 indicates no birthday
} m_Info;
struct

View file

@ -809,10 +809,9 @@ void CGameTeams::OnFinish(CPlayer *Player, float Time, const char *pTimestamp)
}
int TTime = 0 - (int)Time;
if(Player->m_Score < TTime || !Player->m_HasFinishScore)
if(Player->m_Score == -1 || Player->m_Score < TTime)
{
Player->m_Score = TTime;
Player->m_HasFinishScore = true;
}
}