X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fplayerstats.qc;h=e83305886cee1522ddbb5b8db4c11388ee59e0e7;hb=859c0b0164823639d984cede988a0a5d25467ff1;hp=c11efed8b78af9868d79c635bc0761fe483e7c62;hpb=6afdf61d7ac0614d3a0c1bee447bfebc54566730;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/playerstats.qc b/qcsrc/common/playerstats.qc index c11efed8b..e83305886 100644 --- a/qcsrc/common/playerstats.qc +++ b/qcsrc/common/playerstats.qc @@ -15,12 +15,65 @@ #include #endif + +#ifdef GAMEQC +REPLICATE(cvar_cl_allow_uid2name, int, "cl_allow_uid2name"); +REPLICATE(cvar_cl_allow_uidranking, bool, "cl_allow_uidranking"); +REPLICATE(cvar_cl_allow_uidtracking, int, "cl_allow_uidtracking"); +#endif + +#ifdef SVQC +REPLICATE_APPLYCHANGE("cl_allow_uidtracking", { PlayerStats_GameReport_AddPlayer(this); }); +#endif + #ifdef SVQC void PlayerStats_Prematch() { //foobar } +// Deletes current playerstats DB, creates a new one and fully initializes it +void PlayerStats_GameReport_Reset_All() +{ + strfree(PS_GR_OUT_TL); + strfree(PS_GR_OUT_PL); + strfree(PS_GR_OUT_EVL); + + if (PS_GR_OUT_DB >= 0) + { + db_close(PS_GR_OUT_DB); + PlayerStats_GameReport_Init(); + } + if(PS_GR_OUT_DB < 0) + return; + + for (int i = 0; i < 16; i++) + if (teamscorekeepers[i]) + PlayerStats_GameReport_AddTeam(i + 1); + FOREACH_CLIENT(true, { + // NOTE Adding back a player we are applying any cl_allow_uidtracking change + // usually only possible by reconnecting to the server + strfree(it.playerstats_id); + PlayerStats_GameReport_AddEvent(sprintf("kills-%d", it.playerid)); + PlayerStats_GameReport_AddPlayer(it); + }); + FOREACH(Scores, true, { + string label = scores_label(it); + if (label == "") + continue; + PlayerStats_GameReport_AddEvent(strcat(PLAYERSTATS_TOTAL, label)); + PlayerStats_GameReport_AddEvent(strcat(PLAYERSTATS_SCOREBOARD, label)); + }); + for(int i = 0; i < MAX_TEAMSCORE; ++i) + { + string label = teamscores_label(i); + if (label == "") + continue; + PlayerStats_GameReport_AddEvent(strcat(PLAYERSTATS_TOTAL, label)); + PlayerStats_GameReport_AddEvent(strcat(PLAYERSTATS_SCOREBOARD, label)); + } +} + void PlayerStats_GameReport_AddPlayer(entity e) { if((PS_GR_OUT_DB < 0) || (e.playerstats_id)) { return; } @@ -152,9 +205,15 @@ void PlayerStats_GameReport_FinalizePlayer(entity p) { if(CS(p).latency_cnt) { - float latency = (CS(p).latency_sum / CS(p).latency_cnt); + float latency = max(0, CS(p).latency_sum / CS(p).latency_cnt); if(latency) - PlayerStats_GameReport_Event_Player(p, PLAYERSTATS_AVGLATENCY, latency); + { + // if previous average latency exists (player disconnected and reconnected) + // make the average of previous and current average latency + float prev_latency = PlayerStats_GameReport_Event_Player(p, PLAYERSTATS_AVGLATENCY, 0); + float new_latency = !prev_latency ? latency : (prev_latency + latency) / 2; + PlayerStats_GameReport_Event_Player(p, PLAYERSTATS_AVGLATENCY, -prev_latency + new_latency); + } } db_put(PS_GR_OUT_DB, sprintf("%s:_ranked", p.playerstats_id), ftos(CS_CVAR(p).cvar_cl_allow_uidranking)); @@ -228,6 +287,10 @@ void PlayerStats_GameReport_Init() // initiated before InitGameplayMode so that PlayerStats_GameReport_DelayMapVote = true; serverflags |= SERVERFLAG_PLAYERSTATS; + if(autocvar_g_playerstats_gamereport_uri != cvar_defstring("g_playerstats_gamereport_uri")) + { + serverflags |= SERVERFLAG_PLAYERSTATS_CUSTOM; + } PlayerStats_GameReport_AddEvent(PLAYERSTATS_ALIVETIME); PlayerStats_GameReport_AddEvent(PLAYERSTATS_AVGLATENCY); @@ -309,6 +372,7 @@ void PlayerStats_GameReport_Handler(entity fh, entity pass, float status) * i: player index * n: nickname of the player (optional) * t: team ID + * r: player ranking enabled / disabled * e: followed by an event name, a space, and the event count/score * event names can be: * alivetime: total playing time of the player