X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fcommon%2Fplayerstats.qc;h=f8aa2b514059884b5ed43020a06740ece5a6fc37;hp=cbf7f9eef4207c06b783b830ca17235c5d4b29f9;hb=5adb218feb2c384fec2c6fbfa03ad0b3e4515550;hpb=4ad18eaf919d3b62b5818f29bc75a8e8fcf998e0 diff --git a/qcsrc/common/playerstats.qc b/qcsrc/common/playerstats.qc index cbf7f9eef..f8aa2b514 100644 --- a/qcsrc/common/playerstats.qc +++ b/qcsrc/common/playerstats.qc @@ -1,17 +1,29 @@ #include "playerstats.qh" + #if defined(CSQC) #elif defined(MENUQC) #elif defined(SVQC) - #include "constants.qh" - #include "util.qh" - #include - #include - #include "../server/anticheat.qh" - #include - #include - #include "../server/scores.qh" + #include + #include + #include + #include + #include + #include + #include + #include + #include #include - #include "../server/weapons/accuracy.qh" +#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 @@ -20,6 +32,48 @@ 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; } @@ -27,7 +81,7 @@ void PlayerStats_GameReport_AddPlayer(entity e) // set up player identification string s = ""; - if((e.crypto_idfp != "") && (CS(e).cvar_cl_allow_uidtracking == 1)) + if((e.crypto_idfp != "") && (CS_CVAR(e).cvar_cl_allow_uidtracking == 1)) { s = e.crypto_idfp; } else if(IS_BOT_CLIENT(e)) { s = sprintf("bot#%g#%s", skill, e.cleanname); } @@ -135,7 +189,7 @@ void PlayerStats_GameReport_FinalizePlayer(entity p) db_put(PS_GR_OUT_DB, sprintf("%s:_playerid", p.playerstats_id), ftos(p.playerid)); - if(CS(p).cvar_cl_allow_uid2name == 1 || IS_BOT_CLIENT(p)) + if(CS_CVAR(p).cvar_cl_allow_uid2name == 1 || IS_BOT_CLIENT(p)) db_put(PS_GR_OUT_DB, sprintf("%s:_netname", p.playerstats_id), playername(p.netname, p.team, false)); if(teamplay) @@ -151,12 +205,12 @@ 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); } - db_put(PS_GR_OUT_DB, sprintf("%s:_ranked", p.playerstats_id), ftos(CS(p).cvar_cl_allow_uidranking)); + db_put(PS_GR_OUT_DB, sprintf("%s:_ranked", p.playerstats_id), ftos(CS_CVAR(p).cvar_cl_allow_uidranking)); } strfree(p.playerstats_id); @@ -166,8 +220,8 @@ void PlayerStats_GameReport(bool finished) { if(PS_GR_OUT_DB < 0) { return; } - PlayerScore_Sort(score_dummyfield, 0, 0, 0); - PlayerScore_Sort(scoreboard_pos, 1, 1, 1); + PlayerScore_Sort(score_dummyfield, 0, false, false); + PlayerScore_Sort(scoreboard_pos, 1, true, true); if(teamplay) { PlayerScore_TeamStats(); } FOREACH_CLIENT(true, { @@ -227,6 +281,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); @@ -308,6 +366,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 @@ -542,7 +601,6 @@ void PlayerStats_PlayerBasic_Handler(entity fh, entity p, float status) #endif url_fputs(fh, sprintf("l %s\n", cvar_string("_menu_prvm_language"))); // language url_fputs(fh, sprintf("c %s\n", cvar_string("_menu_prvm_country"))); // country - url_fputs(fh, sprintf("g %s\n", cvar_string("_cl_gender"))); // gender url_fputs(fh, sprintf("n %s\n", cvar_string("_cl_name"))); // name url_fputs(fh, sprintf("m %s %s\n", cvar_string("_cl_playermodel"), cvar_string("_cl_playerskin"))); // model/skin */url_fputs(fh, "\n"); @@ -737,7 +795,6 @@ void PlayerStats_PlayerDetail_Handler(entity fh, entity unused, float status) #endif url_fputs(fh, sprintf("l %s\n", cvar_string("_menu_prvm_language"))); // language //url_fputs(fh, sprintf("c %s\n", cvar_string("_cl_country"))); // country - //url_fputs(fh, sprintf("g %s\n", cvar_string("_cl_gender"))); // gender url_fputs(fh, sprintf("n %s\n", cvar_string("_cl_name"))); // name url_fputs(fh, sprintf("m %s %s\n", cvar_string("_cl_playermodel"), cvar_string("_cl_playerskin"))); // model/skin url_fputs(fh, "\n"); @@ -943,7 +1000,6 @@ void PlayerInfo_ready(entity fh, entity p, float status) #ifdef MENUQC url_fputs(fh, sprintf("l %s\n", cvar_string("_menu_prvm_language"))); // language url_fputs(fh, sprintf("c %s\n", cvar_string("_menu_prvm_country"))); // country - url_fputs(fh, sprintf("g %s\n", cvar_string("_cl_gender"))); // gender url_fputs(fh, sprintf("n %s\n", cvar_string("_cl_name"))); // name url_fputs(fh, sprintf("m %s %s\n", cvar_string("_cl_playermodel"), cvar_string("_cl_playerskin"))); // model/skin #endif