.float playerstats_addedglobalinfo;
.string playerstats_id;
+#define ALL_ANTICHEATS \
+ ANTICHEAT("_time"); \
+ ANTICHEAT("speedhack"); \
+ ANTICHEAT("speedhack_m1"); \
+ ANTICHEAT("speedhack_m2"); \
+ ANTICHEAT("speedhack_m3"); \
+ ANTICHEAT("speedhack_m4"); \
+ ANTICHEAT("speedhack_m5"); \
+ ANTICHEAT("div0_strafebot_old"); \
+ ANTICHEAT("div0_strafebot_new"); \
+ ANTICHEAT("div0_evade"); \
+ ANTICHEAT("idle_snapaim"); \
+ ANTICHEAT("idle_snapaim_signal"); \
+ ANTICHEAT("idle_snapaim_noise"); \
+ ANTICHEAT("idle_snapaim_m2"); \
+ ANTICHEAT("idle_snapaim_m3"); \
+ ANTICHEAT("idle_snapaim_m4"); \
+ ANTICHEAT("idle_snapaim_m7"); \
+ ANTICHEAT("idle_snapaim_m10");
+
void PlayerStats_Init() // initiated before InitGameplayMode so that scores are added properly
{
string uri;
if(playerstats_db >= 0)
playerstats_waitforme = FALSE; // must wait for it at match end
- serverflags |= SERVERFLAG_PLAYERSTATS;
+ serverflags |= SERVERFLAG_PLAYERSTATS;
PlayerStats_AddEvent(PLAYERSTATS_ALIVETIME);
PlayerStats_AddEvent(PLAYERSTATS_AVGLATENCY);
PlayerStats_AddEvent(strcat("acc-", w.netname, "-frags"));
}
+#define ANTICHEAT(name) \
+ PlayerStats_AddEvent("anticheat-" name)
+ ALL_ANTICHEATS
+#undef ANTICHEAT
+
PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_3);
PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_5);
PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_10);
string key;
key = sprintf("%s:*", e.playerstats_id);
-
+
string p;
p = db_get(playerstats_db, key);
if(p == "")
string key;
key = sprintf("%d", t);
-
+
string p;
p = db_get(playerstats_db, key);
if(p == "")
{
if(playerstats_db < 0)
return;
-
+
string key;
key = sprintf("*:%s", event_id);
-
+
string p;
p = db_get(playerstats_db, key);
if(p == "")
{
if((e.playerstats_id == "") || playerstats_db < 0)
return 0;
-
+
string key;
float val;
key = sprintf("%s:%s", e.playerstats_id, event_id);
U: UDP port number of the server
D: duration of the match
P: player ID of an existing player; this also sets the owner for all following "n", "e" and "t" lines (lower case!)
- Q: team number of an existing team (format: team#NN); this also sets the owner for all following "e" lines (lower case!)
+ Q: team number of an existing team (format: team#NN); this also sets the owner for all following "e" lines (lower case!)
n: nickname of the player (optional)
t: team ID
i: player index
//backtrace(strcat("adding player stat accuracy for ", p.netname, ".\n"));
}
+void PlayerStats_Anticheat(entity p)
+{
+ entity oldself = self;
+ self = p;
+
+#define ANTICHEAT(name) \
+ PlayerStats_Event(p, "anticheat-" name, anticheat_getvalue(name))
+ ALL_ANTICHEATS
+#undef ANTICHEAT
+ self = oldself;
+}
+
void PlayerStats_AddGlobalInfo(entity p)
{
if(playerstats_db < 0)
PlayerStats_Accuracy(p);
+ PlayerStats_Anticheat(p);
+
if(IS_REAL_CLIENT(p))
{
if(p.latency_cnt)
}
}
}
+
+#undef ALL_ANTICHEATS