X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fplayerstats.qc;h=233762202efda470e23ed15819f2fa2fadf34bd5;hb=e4fdca5e33811690b935475b5a758872c4eb7659;hp=b885807fad5cf5e8335a7a9b27bd6a10ad0d055f;hpb=ed25b097beea2aee6cdec771ebd01a257cf08fc9;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/playerstats.qc b/qcsrc/common/playerstats.qc index b885807fa..233762202 100644 --- a/qcsrc/common/playerstats.qc +++ b/qcsrc/common/playerstats.qc @@ -1,12 +1,9 @@ #if defined(CSQC) #elif defined(MENUQC) #elif defined(SVQC) - #include "../dpdefs/progsdefs.qh" - #include "../dpdefs/dpextensions.qh" #include "constants.qh" #include "util.qh" - #include "urllib.qh" - #include "weapons/weapons.qh" + #include #include "../server/weapons/accuracy.qh" #include "../server/defs.qh" #include "playerstats.qh" @@ -14,7 +11,7 @@ #endif #ifdef SVQC -void PlayerStats_Prematch(void) +void PlayerStats_Prematch() { //foobar } @@ -30,7 +27,7 @@ void PlayerStats_GameReport_AddPlayer(entity e) { s = e.crypto_idfp; } else if(IS_BOT_CLIENT(e)) { 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(IS_BOT_CLIENT(e)) @@ -38,13 +35,13 @@ void PlayerStats_GameReport_AddPlayer(entity e) else { s = sprintf("player#%d", e.playerid); } } - + e.playerstats_id = strzone(s); // now add the player to the database string key = sprintf("%s:*", e.playerstats_id); string p = db_get(PS_GR_OUT_DB, key); - + if(p == "") { if(PS_GR_OUT_PL) @@ -63,7 +60,7 @@ void PlayerStats_GameReport_AddTeam(float t) string key = sprintf("%d", t); string p = db_get(PS_GR_OUT_DB, key); - + if(p == "") { if(PS_GR_OUT_TL) @@ -82,7 +79,7 @@ void PlayerStats_GameReport_AddEvent(string event_id) string key = sprintf("*:%s", event_id); string p = db_get(PS_GR_OUT_DB, key); - + if(p == "") { if(PS_GR_OUT_EVL) @@ -109,24 +106,16 @@ float PlayerStats_GameReport_Event(string prefix, string event_id, float value) void PlayerStats_GameReport_Accuracy(entity p) { - entity w; - float i; - - for(i = WEP_FIRST; i <= WEP_LAST; ++i) - { - w = get_weaponinfo(i); - - #define ACCMAC(suffix,field) \ - PS_GR_P_ADDVAL(p, sprintf("acc-%s-%s", w.netname, suffix), p.accuracy.(field[i-1])); - + #define ACCMAC(suffix, field) \ + PS_GR_P_ADDVAL(p, sprintf("acc-%s-%s", it.netname, suffix), p.accuracy.(field[i-1])); + FOREACH(Weapons, it != WEP_Null, { ACCMAC("hit", accuracy_hit) ACCMAC("fired", accuracy_fired) ACCMAC("cnt-hit", accuracy_cnt_hit) ACCMAC("cnt-fired", accuracy_cnt_fired) ACCMAC("frags", accuracy_frags) - - #undef ACCMAC - } + }); + #undef ACCMAC } void PlayerStats_GameReport_FinalizePlayer(entity p) @@ -169,40 +158,38 @@ void PlayerStats_GameReport_FinalizePlayer(entity p) void PlayerStats_GameReport(float finished) { if(PS_GR_OUT_DB < 0) { return; } - + PlayerScore_Sort(score_dummyfield, 0, 0, 0); PlayerScore_Sort(scoreboard_pos, 1, 1, 1); if(teamplay) { PlayerScore_TeamStats(); } - entity p; - FOR_EACH_CLIENT(p) - { + FOREACH_CLIENT(true, { // add personal score rank - PS_GR_P_ADDVAL(p, PLAYERSTATS_RANK, p.score_dummyfield); + PS_GR_P_ADDVAL(it, PLAYERSTATS_RANK, it.score_dummyfield); // scoreboard data - if(p.scoreboard_pos) + if(it.scoreboard_pos) { // scoreboard is valid! - PS_GR_P_ADDVAL(p, PLAYERSTATS_SCOREBOARD_VALID, 1); + PS_GR_P_ADDVAL(it, PLAYERSTATS_SCOREBOARD_VALID, 1); // add scoreboard position - PS_GR_P_ADDVAL(p, PLAYERSTATS_SCOREBOARD_POS, p.scoreboard_pos); + PS_GR_P_ADDVAL(it, PLAYERSTATS_SCOREBOARD_POS, it.scoreboard_pos); // add scoreboard data - PlayerScore_PlayerStats(p); + PlayerScore_PlayerStats(it); // if the match ended normally, add winning info if(finished) { - PS_GR_P_ADDVAL(p, PLAYERSTATS_WINS, p.winning); - PS_GR_P_ADDVAL(p, PLAYERSTATS_MATCHES, 1); + PS_GR_P_ADDVAL(it, PLAYERSTATS_WINS, it.winning); + PS_GR_P_ADDVAL(it, PLAYERSTATS_MATCHES, 1); } } // collect final player information - PlayerStats_GameReport_FinalizePlayer(p); - } + PlayerStats_GameReport_FinalizePlayer(it); + }); if(autocvar_g_playerstats_gamereport_uri != "") { @@ -244,17 +231,13 @@ void PlayerStats_GameReport_Init() // initiated before InitGameplayMode so that PlayerStats_GameReport_AddEvent(PLAYERSTATS_RANK); // accuracy stats - entity w; - float i; - for(i = WEP_FIRST; i <= WEP_LAST; ++i) - { - w = get_weaponinfo(i); - PlayerStats_GameReport_AddEvent(strcat("acc-", w.netname, "-hit")); - PlayerStats_GameReport_AddEvent(strcat("acc-", w.netname, "-fired")); - PlayerStats_GameReport_AddEvent(strcat("acc-", w.netname, "-cnt-hit")); - PlayerStats_GameReport_AddEvent(strcat("acc-", w.netname, "-cnt-fired")); - PlayerStats_GameReport_AddEvent(strcat("acc-", w.netname, "-frags")); - } + FOREACH(Weapons, it != WEP_Null, { + PlayerStats_GameReport_AddEvent(strcat("acc-", it.netname, "-hit")); + PlayerStats_GameReport_AddEvent(strcat("acc-", it.netname, "-fired")); + PlayerStats_GameReport_AddEvent(strcat("acc-", it.netname, "-cnt-hit")); + PlayerStats_GameReport_AddEvent(strcat("acc-", it.netname, "-cnt-fired")); + PlayerStats_GameReport_AddEvent(strcat("acc-", it.netname, "-frags")); + }); PlayerStats_GameReport_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_3); PlayerStats_GameReport_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_5); @@ -363,7 +346,7 @@ void PlayerStats_GameReport_Handler(entity fh, entity pass, float status) nn = db_get(PS_GR_OUT_DB, sprintf("%s:_playerid", p)); if(nn != "") { url_fputs(fh, sprintf("i %s\n", nn)); } - // player name + // player name nn = db_get(PS_GR_OUT_DB, sprintf("%s:_netname", p)); if(nn != "") { url_fputs(fh, sprintf("n %s\n", nn)); } @@ -396,17 +379,17 @@ void PlayerStats_GameReport_Handler(entity fh, entity pass, float status) { // url_fclose is processing, we got a response for writing the data // this must come from HTTP - dprint("Got response from player stats server:\n"); - while((s = url_fgets(fh))) { dprint(" ", s, "\n"); } - dprint("End of response.\n"); + LOG_TRACE("Got response from player stats server:\n"); + while((s = url_fgets(fh))) { LOG_TRACE(" ", s, "\n"); } + LOG_TRACE("End of response.\n"); url_fclose(fh); break; } - + case URL_READY_CLOSED: { // url_fclose has finished - dprint("Player stats written\n"); + LOG_TRACE("Player stats written\n"); PlayerStats_GameReport_DelayMapVote = false; if(PS_GR_OUT_DB >= 0) { @@ -415,11 +398,11 @@ void PlayerStats_GameReport_Handler(entity fh, entity pass, float status) } break; } - + case URL_READY_ERROR: default: { - print("Player stats writing failed: ", ftos(status), "\n"); + LOG_INFO("Player stats writing failed: ", ftos(status), "\n"); PlayerStats_GameReport_DelayMapVote = false; if(PS_GR_OUT_DB >= 0) { @@ -445,7 +428,7 @@ void PlayerStats_PlayerBasic(entity joiningplayer, float newrequest) // now request the information uri = strcat(uri, "/player/", uri_escape(uri_escape(joiningplayer.crypto_idfp)), "/elo.txt"); - dprint("Retrieving playerstats from URL: ", uri, "\n"); + LOG_TRACE("Retrieving playerstats from URL: ", uri, "\n"); url_single_fopen( uri, FILE_APPEND, @@ -471,12 +454,10 @@ void PlayerStats_PlayerBasic(entity joiningplayer, float newrequest) // server has this disabled, kill the DB and set status to idle if(PS_B_IN_DB >= 0) { - entity player; - db_close(PS_B_IN_DB); PS_B_IN_DB = -1; - FOR_EACH_REALCLIENT(player) { player.playerstats_basicstatus = PS_B_STATUS_IDLE; } + FOREACH_CLIENT(IS_REAL_CLIENT(it), it.playerstats_basicstatus = PS_B_STATUS_IDLE); } } } @@ -486,7 +467,7 @@ void PlayerStats_PlayerBasic_CheckUpdate(entity joiningplayer) // determine whether we should retrieve playerbasic information again #if 0 - printf("PlayerStats_PlayerBasic_CheckUpdate('%s'): %f\n", + LOG_INFOF("PlayerStats_PlayerBasic_CheckUpdate('%s'): %f\n", joiningplayer.netname, time ); @@ -510,29 +491,29 @@ void PlayerStats_PlayerBasic_Handler(entity fh, entity p, float status) { case URL_READY_CANWRITE: { - dprint("-- Sending data to player stats server\n"); + LOG_TRACE("-- Sending data to player stats server\n"); /*url_fputs(fh, "V 1\n"); #ifdef WATERMARK url_fputs(fh, sprintf("R %s\n", WATERMARK)); #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("_menu_prvm_gender"))); // gender + 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"); url_fclose(fh); break; } - + case URL_READY_CANREAD: { string s = ""; - dprint("-- Got response from player stats server:\n"); + LOG_TRACE("-- Got response from player stats server:\n"); //string gametype = string_null; while((s = url_fgets(fh))) { - dprint(" ", s, "\n"); + LOG_TRACE(" ", s, "\n"); /* string key = "", value = "", data = ""; @@ -583,21 +564,21 @@ void PlayerStats_PlayerBasic_Handler(entity fh, entity p, float status) continue; */ } - dprint("-- End of response.\n"); + LOG_TRACE("-- End of response.\n"); url_fclose(fh); break; } case URL_READY_CLOSED: { // url_fclose has finished - print("Player stats synchronized with server\n"); + LOG_INFO("Player stats synchronized with server\n"); break; } - + case URL_READY_ERROR: default: { - print("Receiving player stats failed: ", ftos(status), "\n"); + LOG_INFO("Receiving player stats failed: ", ftos(status), "\n"); break; } } @@ -612,7 +593,7 @@ void PlayerStats_PlayerBasic_Handler(entity fh, entity p, float status) float i = 0; for(e = PS_D_IN_EVL; (en = db_get(PS_D_IN_DB, e)) != ""; e = en) { - print(sprintf("%d:%s:%s\n", i, e, db_get(PS_D_IN_DB, sprintf("#%s", e)))); + LOG_INFO(sprintf("%d:%s:%s\n", i, e, db_get(PS_D_IN_DB, sprintf("#%s", e)))); ++i; } #endif @@ -630,16 +611,16 @@ void PlayerStats_PlayerDetail_AddItem(string event, string data) db_put(PS_D_IN_DB, marker, PS_D_IN_EVL); strunzone(PS_D_IN_EVL); } - else { db_put(PS_D_IN_DB, marker, "#"); } + else { db_put(PS_D_IN_DB, marker, "#"); } PS_D_IN_EVL = strzone(marker); } // now actually set the event data db_put(PS_D_IN_DB, sprintf("#%s", event), data); - dprint("Added item ", sprintf("#%s", event), "=", data, " to PS_D_IN_DB\n"); + LOG_TRACE("Added item ", sprintf("#%s", event), "=", data, " to PS_D_IN_DB\n"); } -void PlayerStats_PlayerDetail(void) +void PlayerStats_PlayerDetail() { // http://stats.xonotic.org/player/me if((autocvar_g_playerstats_playerdetail_uri != "") && (crypto_getmyidstatus(0) > 0)) @@ -649,7 +630,7 @@ void PlayerStats_PlayerDetail(void) PS_D_IN_DB = db_create(); //uri = strcat(uri, "/player/", uri_escape(crypto_getmyidfp(0))); - dprint("Retrieving playerstats from URL: ", autocvar_g_playerstats_playerdetail_uri, "\n"); + LOG_TRACE("Retrieving playerstats from URL: ", autocvar_g_playerstats_playerdetail_uri, "\n"); url_single_fopen( autocvar_g_playerstats_playerdetail_uri, FILE_APPEND, @@ -672,13 +653,13 @@ void PlayerStats_PlayerDetail(void) } } -void PlayerStats_PlayerDetail_CheckUpdate(void) +void PlayerStats_PlayerDetail_CheckUpdate() { // determine whether we should retrieve playerdetail information again float gamecount = cvar("cl_matchcount"); #if 0 - printf("PlayerStats_PlayerDetail_CheckUpdate(): %f >= %f, %d > %d\n", + LOG_INFOF("PlayerStats_PlayerDetail_CheckUpdate(): %f >= %f, %d > %d\n", time, PS_D_NEXTUPDATETIME, PS_D_LASTGAMECOUNT, @@ -704,7 +685,7 @@ void PlayerStats_PlayerDetail_Handler(entity fh, entity unused, float status) { case URL_READY_CANWRITE: { - dprint("PlayerStats_PlayerDetail_Handler(): Sending data to player stats server...\n"); + LOG_TRACE("PlayerStats_PlayerDetail_Handler(): Sending data to player stats server...\n"); url_fputs(fh, "V 1\n"); #ifdef WATERMARK url_fputs(fh, sprintf("R %s\n", WATERMARK)); @@ -718,7 +699,7 @@ void PlayerStats_PlayerDetail_Handler(entity fh, entity unused, float status) url_fclose(fh); break; } - + case URL_READY_CANREAD: { //print("PlayerStats_PlayerDetail_Handler(): Got response from player stats server:\n"); @@ -730,7 +711,7 @@ void PlayerStats_PlayerDetail_Handler(entity fh, entity unused, float status) string key = "", event = "", data = ""; if(argv(0) == "#") { continue; } - + if(count == 2) { key = argv(0); @@ -774,10 +755,10 @@ void PlayerStats_PlayerDetail_Handler(entity fh, entity unused, float status) } break; } - + default: { - printf( + LOG_INFOF( "PlayerStats_PlayerDetail_Handler(): ERROR: " "Key went unhandled? Is our version outdated?\n" "PlayerStats_PlayerDetail_Handler(): " @@ -791,7 +772,7 @@ void PlayerStats_PlayerDetail_Handler(entity fh, entity unused, float status) } #if 0 - print(sprintf( + LOG_INFO(sprintf( "PlayerStats_PlayerDetail_Handler(): " "Key '%s', Event '%s', Data '%s'\n", key, @@ -810,14 +791,14 @@ void PlayerStats_PlayerDetail_Handler(entity fh, entity unused, float status) case URL_READY_CLOSED: { // url_fclose has finished - print("PlayerStats_PlayerDetail_Handler(): Player stats synchronized with server.\n"); + LOG_INFO("PlayerStats_PlayerDetail_Handler(): Player stats synchronized with server.\n"); break; } case URL_READY_ERROR: default: { - print("PlayerStats_PlayerDetail_Handler(): Receiving player stats failed: ", ftos(status), "\n"); + LOG_INFO("PlayerStats_PlayerDetail_Handler(): Receiving player stats failed: ", ftos(status), "\n"); PlayerStats_PlayerDetail_Status = PS_D_STATUS_ERROR; if(PS_D_IN_DB >= 0) { @@ -917,7 +898,7 @@ 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("_menu_prvm_gender"))); // gender + 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 @@ -1038,8 +1019,7 @@ void PlayerInfo_Details() #endif #ifdef CSQC -/* - * FIXME - crypto_* builtin functions missing in CSQC (csprogsdefs.qh:885) +// FIXME - crypto_* builtin functions missing in CSQC (csprogsdefs.qh:885) void PlayerInfo_Details() { print("-- Getting detailed PlayerInfo for local player (CSQC)\n");