void PlayerStats_AddPlayer(entity e)
{
+ string s;
+
if(playerstats_db < 0)
return;
if(e.playerstats_id)
return;
+ s = string_null;
if(e.crypto_idfp != "" && e.cvar_cl_allow_uidtracking == 1)
- e.playerstats_id = strzone(e.crypto_idfp);
+ s = e.crypto_idfp;
else if(clienttype(e) == CLIENTTYPE_BOT)
- e.playerstats_id = strzone(sprintf("bot#%d", e.playerid));
- else
- e.playerstats_id = strzone(sprintf("player#%d", e.playerid));
+ s = sprintf("bot#%g#%s", skill, e.cleanname);
+
+ if(!s || find(world, playerstats_id, s)) // already have one of the ID - next one can't be tracked then!
+ {
+ if(clienttype(e) == CLIENTTYPE_BOT)
+ s = sprintf("bot#%d", e.playerid);
+ else
+ s = sprintf("player#%d", e.playerid);
+ }
+
+ e.playerstats_id = strzone(s);
string key;
key = sprintf("%s:*", e.playerstats_id);
T: time at which the game ended
G: game type
M: map name
+ I: match ID (see "matchid" in g_world.qc
S: "hostname" of the server
C: number of "unpure" cvar changes
+ U: UDP port number of the server
P: player ID of an existing player; this also sets the owner for all following "n", "e" and "t" lines (lower case!)
n: nickname of the player (optional)
- t: team ID
+ t: team ID
e: followed by an event name, a space, and the event count/score
event names can be:
alivetime: total playing time of the player
url_fputs(fh, sprintf("I %s\n", matchid));
url_fputs(fh, sprintf("S %s\n", cvar_string("hostname")));
url_fputs(fh, sprintf("C %d\n", cvar_purechanges_count));
+ url_fputs(fh, sprintf("U %d\n", cvar("port")));
for(p = playerstats_last; (pn = db_get(playerstats_db, sprintf("%s:*", p))) != ""; p = pn)
{
url_fputs(fh, sprintf("P %s\n", p));
void PlayerStats_EndMatch(float finished)
{
entity p, winner;
- winner = PlayerScore_Sort(score_dummyfield);
- FOR_EACH_PLAYER(p) // spectators intentionally not included
+ winner = PlayerScore_Sort(score_dummyfield);
+ FOR_EACH_CLIENT(p) // spectators intentionally not included
{
- PlayerScore_PlayerStats(p);
PlayerStats_Accuracy(p);
+ if(g_arena || g_lms || g_ca)
+ {
+ if(p.alivetime <= 0)
+ continue;
+ }
+ else
+ {
+ if(p.classname != "player")
+ continue;
+ }
+ PlayerScore_PlayerStats(p);
PlayerStats_Event(p, PLAYERSTATS_SCOREBOARD_VALID, 1);
if(finished)
{