From: Rudolf Polzer Date: Mon, 14 Nov 2016 20:14:59 +0000 (-0500) Subject: Report anticheat data to playerstats; remove unused anticheat_getvalue function. X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=refs%2Fmerge-requests%2F390%2Fhead;p=xonotic%2Fxonotic-data.pk3dir.git Report anticheat data to playerstats; remove unused anticheat_getvalue function. --- diff --git a/qcsrc/common/playerstats.qc b/qcsrc/common/playerstats.qc index 4dab61164..b879b63b0 100644 --- a/qcsrc/common/playerstats.qc +++ b/qcsrc/common/playerstats.qc @@ -5,9 +5,10 @@ #include "constants.qh" #include "util.qh" #include - #include "../server/weapons/accuracy.qh" + #include "../server/anticheat.qh" #include "../server/defs.qh" #include "../server/scores.qh" + #include "../server/weapons/accuracy.qh" #endif #ifdef SVQC @@ -141,6 +142,7 @@ 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)) { @@ -249,6 +251,8 @@ 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; } } diff --git a/qcsrc/common/playerstats.qh b/qcsrc/common/playerstats.qh index 73496ba76..1fafb1397 100644 --- a/qcsrc/common/playerstats.qh +++ b/qcsrc/common/playerstats.qh @@ -40,6 +40,7 @@ const string PLAYERSTATS_SCOREBOARD_POS = "scoreboardpos"; const string PLAYERSTATS_TOTAL = "total-"; const string PLAYERSTATS_SCOREBOARD = "scoreboard-"; +const string PLAYERSTATS_ANTICHEAT = "anticheat-"; const string PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_3 = "achievement-kill-spree-3"; const string PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_5 = "achievement-kill-spree-5"; diff --git a/qcsrc/common/state.qc b/qcsrc/common/state.qc index 891461c6a..1a2fb1e7b 100644 --- a/qcsrc/common/state.qc +++ b/qcsrc/common/state.qc @@ -63,7 +63,7 @@ void ClientState_attach(entity this) void bot_clientdisconnect(entity this); void W_HitPlotClose(entity this); -void anticheat_report(entity this); +void anticheat_report_to_eventlog(entity this); void playerdemo_shutdown(entity this); void entcs_detach(entity this); void accuracy_free(entity this); @@ -80,7 +80,7 @@ void ClientState_detach(entity this) bot_clientdisconnect(this); W_HitPlotClose(this); - anticheat_report(this); + anticheat_report_to_eventlog(this); playerdemo_shutdown(this); entcs_detach(this); accuracy_free(this); diff --git a/qcsrc/server/anticheat.qc b/qcsrc/server/anticheat.qc index 4861fe2a7..4e794cb3f 100644 --- a/qcsrc/server/anticheat.qc +++ b/qcsrc/server/anticheat.qc @@ -6,6 +6,7 @@ #include "miscfunctions.qh" #include "command/common.qh" +#include #include .float anticheat_jointime; @@ -158,67 +159,66 @@ void anticheat_prethink(entity this) CS(this).anticheat_div0_evade_offset = 0; } -string anticheat_display(float f, float tmin, float mi, float ma) +string anticheat_display(float f, float t, float tmin, float mi, float ma) { string s; s = ftos(f); - if(f <= mi) - return strcat(s, ":N"); - if(f >= ma) - return strcat(s, ":Y"); + if (t >= tmin) { + if(f <= mi) + return strcat(s, ":N"); + if(f >= ma) + return strcat(s, ":Y"); + } return strcat(s, ":-"); } -void anticheat_report(entity this) -{ +#define ANTICHEATS(ANTICHEAT) \ + ANTICHEAT("speedhack", MEAN_EVALUATE(CS(this), anticheat_speedhack), 240, 0, 9999); /* Actually this one seems broken. */ \ + ANTICHEAT("speedhack_m1", MEAN_EVALUATE(CS(this), anticheat_speedhack_m1), 240, 1.01, 1.25); \ + ANTICHEAT("speedhack_m2", MEAN_EVALUATE(CS(this), anticheat_speedhack_m2), 240, 1.01, 1.25); \ + ANTICHEAT("speedhack_m3", MEAN_EVALUATE(CS(this), anticheat_speedhack_m3), 240, 1.01, 1.25); \ + ANTICHEAT("speedhack_m4", MEAN_EVALUATE(CS(this), anticheat_speedhack_m4), 240, 1.01, 1.25); \ + ANTICHEAT("speedhack_m5", MEAN_EVALUATE(CS(this), anticheat_speedhack_m5), 240, 1.01, 1.25); \ + ANTICHEAT("div0_strafebot_old", MEAN_EVALUATE(CS(this), anticheat_div0_strafebot_old), 120, 0.15, 0.4); \ + ANTICHEAT("div0_strafebot_new", MEAN_EVALUATE(CS(this), anticheat_div0_strafebot_new), 120, 0.25, 0.8); \ + ANTICHEAT("div0_evade", MEAN_EVALUATE(CS(this), anticheat_div0_evade), 120, 0.2, 0.5); \ + ANTICHEAT("idle_snapaim", MEAN_EVALUATE(CS(this), anticheat_idle_snapaim_signal) - MEAN_EVALUATE(CS(this), anticheat_idle_snapaim_noise), 120, 0, 9999); \ + ANTICHEAT("idle_snapaim_signal", MEAN_EVALUATE(CS(this), anticheat_idle_snapaim_signal), 120, 0, 9999); \ + ANTICHEAT("idle_snapaim_noise", MEAN_EVALUATE(CS(this), anticheat_idle_snapaim_noise), 120, 0, 9999); \ + ANTICHEAT("idle_snapaim_m2", MEAN_EVALUATE(CS(this), anticheat_idle_snapaim_m2), 120, 0, 9999); \ + ANTICHEAT("idle_snapaim_m3", MEAN_EVALUATE(CS(this), anticheat_idle_snapaim_m3), 120, 0, 9999); \ + ANTICHEAT("idle_snapaim_m4", MEAN_EVALUATE(CS(this), anticheat_idle_snapaim_m4), 120, 0, 9999); \ + ANTICHEAT("idle_snapaim_m7", MEAN_EVALUATE(CS(this), anticheat_idle_snapaim_m7), 120, 0, 9999); \ + ANTICHEAT("idle_snapaim_m10", MEAN_EVALUATE(CS(this), anticheat_idle_snapaim_m10), 120, 0, 9999) + +void anticheat_report_to_eventlog(entity this) { if(!autocvar_sv_eventlog) return; - // TODO(divVerent): Use xonstat to acquire good thresholds. GameLogEcho(strcat(":anticheat:_time:", ftos(this.playerid), ":", ftos(servertime - CS(this).anticheat_jointime))); - GameLogEcho(strcat(":anticheat:speedhack:", ftos(this.playerid), ":", anticheat_display(MEAN_EVALUATE(CS(this), anticheat_speedhack), 240, 0, 9999))); // Actually this one seems broken. - GameLogEcho(strcat(":anticheat:speedhack_m1:", ftos(this.playerid), ":", anticheat_display(MEAN_EVALUATE(CS(this), anticheat_speedhack_m1), 240, 1.01, 1.25))); - GameLogEcho(strcat(":anticheat:speedhack_m2:", ftos(this.playerid), ":", anticheat_display(MEAN_EVALUATE(CS(this), anticheat_speedhack_m2), 240, 1.01, 1.25))); - GameLogEcho(strcat(":anticheat:speedhack_m3:", ftos(this.playerid), ":", anticheat_display(MEAN_EVALUATE(CS(this), anticheat_speedhack_m3), 240, 1.01, 1.25))); - GameLogEcho(strcat(":anticheat:speedhack_m4:", ftos(this.playerid), ":", anticheat_display(MEAN_EVALUATE(CS(this), anticheat_speedhack_m4), 240, 1.01, 1.25))); - GameLogEcho(strcat(":anticheat:speedhack_m5:", ftos(this.playerid), ":", anticheat_display(MEAN_EVALUATE(CS(this), anticheat_speedhack_m5), 240, 1.01, 1.25))); - GameLogEcho(strcat(":anticheat:div0_strafebot_old:", ftos(this.playerid), ":", anticheat_display(MEAN_EVALUATE(CS(this), anticheat_div0_strafebot_old), 120, 0.15, 0.4))); - GameLogEcho(strcat(":anticheat:div0_strafebot_new:", ftos(this.playerid), ":", anticheat_display(MEAN_EVALUATE(CS(this), anticheat_div0_strafebot_new), 120, 0.25, 0.8))); - GameLogEcho(strcat(":anticheat:div0_evade:", ftos(this.playerid), ":", anticheat_display(MEAN_EVALUATE(CS(this), anticheat_div0_evade), 120, 0.2, 0.5))); - GameLogEcho(strcat(":anticheat:idle_snapaim:", ftos(this.playerid), ":", anticheat_display(MEAN_EVALUATE(CS(this), anticheat_idle_snapaim_signal) - MEAN_EVALUATE(CS(this), anticheat_idle_snapaim_noise), 120, 0, 9999))); - GameLogEcho(strcat(":anticheat:idle_snapaim_signal:", ftos(this.playerid), ":", anticheat_display(MEAN_EVALUATE(CS(this), anticheat_idle_snapaim_signal), 120, 0, 9999))); - GameLogEcho(strcat(":anticheat:idle_snapaim_noise:", ftos(this.playerid), ":", anticheat_display(MEAN_EVALUATE(CS(this), anticheat_idle_snapaim_noise), 120, 0, 9999))); - GameLogEcho(strcat(":anticheat:idle_snapaim_m2:", ftos(this.playerid), ":", anticheat_display(MEAN_EVALUATE(CS(this), anticheat_idle_snapaim_m2), 120, 0, 9999))); - GameLogEcho(strcat(":anticheat:idle_snapaim_m3:", ftos(this.playerid), ":", anticheat_display(MEAN_EVALUATE(CS(this), anticheat_idle_snapaim_m3), 120, 0, 9999))); - GameLogEcho(strcat(":anticheat:idle_snapaim_m4:", ftos(this.playerid), ":", anticheat_display(MEAN_EVALUATE(CS(this), anticheat_idle_snapaim_m4), 120, 0, 9999))); - GameLogEcho(strcat(":anticheat:idle_snapaim_m7:", ftos(this.playerid), ":", anticheat_display(MEAN_EVALUATE(CS(this), anticheat_idle_snapaim_m7), 120, 0, 9999))); - GameLogEcho(strcat(":anticheat:idle_snapaim_m10:", ftos(this.playerid), ":", anticheat_display(MEAN_EVALUATE(CS(this), anticheat_idle_snapaim_m10), 120, 0, 9999))); +#define ANTICHEAT_REPORT_ONE(name, f, tmin, mi, ma) \ + GameLogEcho(strcat(":anticheat:", name, ":", anticheat_display(f, servertime - CS(this).anticheat_jointime, tmin, mi, ma))) + ANTICHEATS(ANTICHEAT_REPORT_ONE); +#undef ANTICHEAT_REPORT_ONE } -float anticheat_getvalue(entity this, string id) -{ - switch(id) { - case "_time": return servertime - CS(this).anticheat_jointime; - case "speedhack": return MEAN_EVALUATE(CS(this), anticheat_speedhack); - case "speedhack_m1": return MEAN_EVALUATE(CS(this), anticheat_speedhack_m1); - case "speedhack_m2": return MEAN_EVALUATE(CS(this), anticheat_speedhack_m2); - case "speedhack_m3": return MEAN_EVALUATE(CS(this), anticheat_speedhack_m3); - case "speedhack_m4": return MEAN_EVALUATE(CS(this), anticheat_speedhack_m4); - case "speedhack_m5": return MEAN_EVALUATE(CS(this), anticheat_speedhack_m5); - case "div0_strafebot_old": return MEAN_EVALUATE(CS(this), anticheat_div0_strafebot_old); - case "div0_strafebot_new": return MEAN_EVALUATE(CS(this), anticheat_div0_strafebot_new); - case "div0_evade": return MEAN_EVALUATE(CS(this), anticheat_div0_evade); - case "idle_snapaim": return MEAN_EVALUATE(CS(this), anticheat_idle_snapaim_signal) - MEAN_EVALUATE(CS(this), anticheat_idle_snapaim_noise); - case "idle_snapaim_signal": return MEAN_EVALUATE(CS(this), anticheat_idle_snapaim_signal); - case "idle_snapaim_noise": return MEAN_EVALUATE(CS(this), anticheat_idle_snapaim_noise); - case "idle_snapaim_m2": return MEAN_EVALUATE(CS(this), anticheat_idle_snapaim_m2); - case "idle_snapaim_m3": return MEAN_EVALUATE(CS(this), anticheat_idle_snapaim_m3); - case "idle_snapaim_m4": return MEAN_EVALUATE(CS(this), anticheat_idle_snapaim_m4); - case "idle_snapaim_m7": return MEAN_EVALUATE(CS(this), anticheat_idle_snapaim_m7); - case "idle_snapaim_m10": return MEAN_EVALUATE(CS(this), anticheat_idle_snapaim_m10); - } - return -1; +void anticheat_report_to_playerstats(entity this) { + PS_GR_P_ADDVAL(this, strcat(PLAYERSTATS_ANTICHEAT, "_time"), servertime - CS(this).anticheat_jointime); +#define ANTICHEAT_REPORT_ONE(name, f, tmin, mi, ma) \ + PS_GR_P_ADDVAL(this, strcat(PLAYERSTATS_ANTICHEAT, name), f) + ANTICHEATS(ANTICHEAT_REPORT_ONE); +#undef ANTICHEAT_REPORT_ONE } +void anticheat_register_to_playerstats() { + PlayerStats_GameReport_AddEvent(strcat(PLAYERSTATS_ANTICHEAT, "_time")); +#define ANTICHEAT_REGISTER_ONE(name, unused_f, unused_tmin, unused_mi, unused_ma) \ + PlayerStats_GameReport_AddEvent(strcat(PLAYERSTATS_ANTICHEAT, name)) + ANTICHEATS(ANTICHEAT_REGISTER_ONE); +#undef ANTICHEAT_REGISTER_ONE +} + +#undef ANTICHEATS + void anticheat_startframe() { anticheat_div0_evade_evasion_delta += frametime * (0.5 + random()); diff --git a/qcsrc/server/anticheat.qh b/qcsrc/server/anticheat.qh index 2b0522b99..dd870dd39 100644 --- a/qcsrc/server/anticheat.qh +++ b/qcsrc/server/anticheat.qh @@ -1,14 +1,14 @@ #pragma once void anticheat_init(entity this); -void anticheat_report(entity this); +void anticheat_report_to_eventlog(entity this); +void anticheat_report_to_playerstats(entity this); +void anticheat_register_to_playerstats(); void anticheat_physics(entity this); void anticheat_spectatecopy(entity this, entity spectatee); void anticheat_prethink(entity this); -float anticheat_getvalue(entity this, string name); - void anticheat_startframe(); void anticheat_endframe(); diff --git a/qcsrc/server/command/sv_cmd.qc b/qcsrc/server/command/sv_cmd.qc index cbc65680a..f2be14b60 100644 --- a/qcsrc/server/command/sv_cmd.qc +++ b/qcsrc/server/command/sv_cmd.qc @@ -226,7 +226,7 @@ void GameCommand_anticheat(float request, float argc) if (accepted > 0) { - anticheat_report(client); + anticheat_report_to_eventlog(client); return; } else