X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fplayerstats.qc;h=d8af629624b5e8ea10c22f7cc446681fb8346362;hb=98b2c4213abe04f3ec96a95471ba5fe5fe57e008;hp=ad58221269f0466b1733733a2b925982f10a5504;hpb=641c47df604de42c11c68a7d80813b29affcefb2;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/playerstats.qc b/qcsrc/common/playerstats.qc index ad5822126..d8af62962 100644 --- a/qcsrc/common/playerstats.qc +++ b/qcsrc/common/playerstats.qc @@ -1,13 +1,14 @@ +#include "playerstats.qh" #if defined(CSQC) #elif defined(MENUQC) #elif defined(SVQC) #include "constants.qh" #include "util.qh" - #include - #include "../server/weapons/accuracy.qh" + #include + #include "../server/anticheat.qh" #include "../server/defs.qh" - #include "playerstats.qh" #include "../server/scores.qh" + #include "../server/weapons/accuracy.qh" #endif #ifdef SVQC @@ -21,9 +22,9 @@ void PlayerStats_GameReport_AddPlayer(entity e) if((PS_GR_OUT_DB < 0) || (e.playerstats_id)) { return; } // set up player identification - string s = string_null; + string s = ""; - if((e.crypto_idfp != "") && (e.cvar_cl_allow_uidtracking == 1)) + if((e.crypto_idfp != "") && (CS(e).cvar_cl_allow_uidtracking == 1)) { s = e.crypto_idfp; } else if(IS_BOT_CLIENT(e)) { s = sprintf("bot#%g#%s", skill, e.cleanname); } @@ -107,7 +108,7 @@ float PlayerStats_GameReport_Event(string prefix, string event_id, float value) void PlayerStats_GameReport_Accuracy(entity p) { #define ACCMAC(suffix, field) \ - PS_GR_P_ADDVAL(p, sprintf("acc-%s-%s", it.netname, suffix), p.accuracy.(field[i-1])); + PS_GR_P_ADDVAL(p, sprintf("acc-%s-%s", it.netname, suffix), CS(p).accuracy.(field[i-1])); FOREACH(Weapons, it != WEP_Null, { ACCMAC("hit", accuracy_hit) ACCMAC("fired", accuracy_fired) @@ -131,8 +132,8 @@ void PlayerStats_GameReport_FinalizePlayer(entity p) db_put(PS_GR_OUT_DB, sprintf("%s:_playerid", p.playerstats_id), ftos(p.playerid)); - if(p.cvar_cl_allow_uid2name == 1 || IS_BOT_CLIENT(p)) - db_put(PS_GR_OUT_DB, sprintf("%s:_netname", p.playerstats_id), p.netname); + if(CS(p).cvar_cl_allow_uid2name == 1 || IS_BOT_CLIENT(p)) + db_put(PS_GR_OUT_DB, sprintf("%s:_netname", p.playerstats_id), playername(p, false)); if(teamplay) db_put(PS_GR_OUT_DB, sprintf("%s:_team", p.playerstats_id), ftos(p.team)); @@ -141,12 +142,13 @@ void PlayerStats_GameReport_FinalizePlayer(entity p) PS_GR_P_ADDVAL(p, PLAYERSTATS_JOINS, 1); PlayerStats_GameReport_Accuracy(p); + anticheat_report_to_playerstats(p); if(IS_REAL_CLIENT(p)) { - if(p.latency_cnt) + if(CS(p).latency_cnt) { - float latency = (p.latency_sum / p.latency_cnt); + float latency = (CS(p).latency_sum / CS(p).latency_cnt); if(latency) { PS_GR_P_ADDVAL(p, PLAYERSTATS_AVGLATENCY, latency); } } } @@ -249,10 +251,26 @@ void PlayerStats_GameReport_Init() // initiated before InitGameplayMode so that PlayerStats_GameReport_AddEvent(PLAYERSTATS_ACHIEVEMENT_BOTLIKE); PlayerStats_GameReport_AddEvent(PLAYERSTATS_ACHIEVEMENT_FIRSTBLOOD); PlayerStats_GameReport_AddEvent(PLAYERSTATS_ACHIEVEMENT_FIRSTVICTIM); + + anticheat_register_to_playerstats(); } else { PlayerStats_GameReport_DelayMapVote = false; } } +// this... is a hack, a temporary one until we get a proper duel gametype +string PlayerStats_GetGametype() +{ + if(IS_GAMETYPE(DEATHMATCH) && autocvar_g_maxplayers == 2) + { + // probably duel, but let's make sure + int plcount = 0; + FOREACH_CLIENT(IS_PLAYER(it), ++plcount); + if(plcount <= 2) + return "duel"; + } + return GetGametype(); +} + void PlayerStats_GameReport_Handler(entity fh, entity pass, float status) { string t, tn; @@ -309,7 +327,7 @@ void PlayerStats_GameReport_Handler(entity fh, entity pass, float status) #ifdef WATERMARK url_fputs(fh, sprintf("R %s\n", WATERMARK)); #endif - url_fputs(fh, sprintf("G %s\n", GetGametype())); + url_fputs(fh, sprintf("G %s\n", PlayerStats_GetGametype())); url_fputs(fh, sprintf("O %s\n", modname)); url_fputs(fh, sprintf("M %s\n", GetMapname())); url_fputs(fh, sprintf("I %s\n", matchid)); @@ -402,7 +420,7 @@ void PlayerStats_GameReport_Handler(entity fh, entity pass, float status) case URL_READY_ERROR: default: { - LOG_INFO("Player stats writing failed: ", ftos(status), "\n"); + LOG_INFO("Player stats writing failed: ", ftos(status)); PlayerStats_GameReport_DelayMapVote = false; if(PS_GR_OUT_DB >= 0) { @@ -416,13 +434,13 @@ void PlayerStats_GameReport_Handler(entity fh, entity pass, float status) void PlayerStats_PlayerBasic(entity joiningplayer, float newrequest) { - PlayerScore_Add(joiningplayer, SP_ELO, -1); + GameRules_scoring_add(joiningplayer, ELO, -1); // http://stats.xonotic.org/player/GgXRw6piDtFIbMArMuiAi8JG4tiin8VLjZgsKB60Uds=/elo.txt if(autocvar_g_playerstats_playerbasic_uri != "") { string uri = autocvar_g_playerstats_playerbasic_uri; if (joiningplayer.crypto_idfp == "") { - PlayerScore_Add(joiningplayer, SP_ELO, -1); + GameRules_scoring_add(joiningplayer, ELO, -1); } else { // create the database if it doesn't already exist if(PS_B_IN_DB < 0) @@ -454,7 +472,7 @@ void PlayerStats_PlayerBasic(entity joiningplayer, float newrequest) else { // server has this disabled, kill the DB and set status to idle - PlayerScore_Add(joiningplayer, SP_ELO, -1); + GameRules_scoring_add(joiningplayer, ELO, -1); if(PS_B_IN_DB >= 0) { db_close(PS_B_IN_DB); @@ -552,10 +570,10 @@ void PlayerStats_PlayerBasic_Handler(entity fh, entity p, float status) case "e": LOG_TRACE("G: ", gt); LOG_TRACE("e: ", data); - if (gt == GetGametype()) { + if (gt == PlayerStats_GetGametype()) { handled = true; float e = stof(data); - PlayerScore_Add(p, SP_ELO, +1 + e); + GameRules_scoring_add(p, ELO, +1 + e); } if (gt == "") { // PlayerInfo_AddItem(p, value, data); @@ -572,18 +590,18 @@ void PlayerStats_PlayerBasic_Handler(entity fh, entity p, float status) case URL_READY_CLOSED: { // url_fclose has finished - LOG_INFO("Player stats synchronized with server\n"); + LOG_INFO("Player stats synchronized with server"); return; } case URL_READY_ERROR: default: { - LOG_INFO("Receiving player stats failed: ", ftos(status), "\n"); + LOG_INFO("Receiving player stats failed: ", ftos(status)); break; } } - PlayerScore_Add(p, SP_ELO, -1); + GameRules_scoring_add(p, ELO, -1); } #endif // SVQC @@ -595,7 +613,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) { - LOG_INFO(sprintf("%d:%s:%s\n", i, e, db_get(PS_D_IN_DB, sprintf("#%s", e)))); + LOG_INFOF("%d:%s:%s", i, e, db_get(PS_D_IN_DB, sprintf("#%s", e))); ++i; } #endif @@ -661,7 +679,7 @@ void PlayerStats_PlayerDetail_CheckUpdate() float gamecount = cvar("cl_matchcount"); #if 0 - LOG_INFOF("PlayerStats_PlayerDetail_CheckUpdate(): %f >= %f, %d > %d\n", + LOG_INFOF("PlayerStats_PlayerDetail_CheckUpdate(): %f >= %f, %d > %d", time, PS_D_NEXTUPDATETIME, PS_D_LASTGAMECOUNT, @@ -764,7 +782,7 @@ void PlayerStats_PlayerDetail_Handler(entity fh, entity unused, float status) "PlayerStats_PlayerDetail_Handler(): ERROR: " "Key went unhandled? Is our version outdated?\n" "PlayerStats_PlayerDetail_Handler(): " - "Key '%s', Event '%s', Data '%s'\n", + "Key '%s', Event '%s', Data '%s'", key, event, data @@ -774,13 +792,13 @@ void PlayerStats_PlayerDetail_Handler(entity fh, entity unused, float status) } #if 0 - LOG_INFO(sprintf( + LOG_INFOF( "PlayerStats_PlayerDetail_Handler(): " - "Key '%s', Event '%s', Data '%s'\n", + "Key '%s', Event '%s', Data '%s'", key, event, data - )); + ); #endif } //print("PlayerStats_PlayerDetail_Handler(): End of response.\n"); @@ -793,14 +811,14 @@ void PlayerStats_PlayerDetail_Handler(entity fh, entity unused, float status) case URL_READY_CLOSED: { // url_fclose has finished - LOG_INFO("PlayerStats_PlayerDetail_Handler(): Player stats synchronized with server.\n"); + LOG_INFO("PlayerStats_PlayerDetail_Handler(): Player stats synchronized with server."); break; } case URL_READY_ERROR: default: { - LOG_INFO("PlayerStats_PlayerDetail_Handler(): Receiving player stats failed: ", ftos(status), "\n"); + LOG_INFO("PlayerStats_PlayerDetail_Handler(): Receiving player stats failed: ", ftos(status)); PlayerStats_PlayerDetail_Status = PS_D_STATUS_ERROR; if(PS_D_IN_DB >= 0) {