20REPLICATE(cvar_cl_allow_uid2name,
int,
"cl_allow_uid2name");
21REPLICATE(cvar_cl_allow_uidranking,
bool,
"cl_allow_uidranking");
22REPLICATE(cvar_cl_allow_uidtracking,
int,
"cl_allow_uidtracking");
50 for (
int i = 0; i < 16; ++i)
59 it.handicap_avg_given_sum = 0;
60 it.handicap_avg_taken_sum = 0;
86 if((e.crypto_idfp !=
"") && (
CS_CVAR(e).cvar_cl_allow_uidtracking == 1))
87 { s = e.crypto_idfp; }
89 { s = sprintf(
"bot#%g#%s",
skill, e.cleanname); }
94 { s = sprintf(
"bot#%d", e.playerid); }
96 { s = sprintf(
"player#%d", e.playerid); }
102 string key = sprintf(
"%s:*", e.playerstats_id);
121 string key = sprintf(
"%d", t);
140 string key = sprintf(
"*:%s", event_id);
160 string key =
strcat(prefix,
":", event_id);
169 #define ACCMAC(suffix, field) \
170 PlayerStats_GameReport_Event_Player(p, \
171 sprintf("acc-%s-%s", it.netname, suffix), CS(p).accuracy.(field[i-1]));
185 if((p.playerstats_id ==
"") ||
PS_GR_OUT_DB < 0) {
return; }
188 if(p.alivetime_start)
191 p.alivetime_start = 0;
218 float new_latency = !prev_latency ? latency : (prev_latency + latency) / 2;
242 if(it.scoreboard_pos)
418 url_fputs(fh, sprintf(
"R %s\n", WATERMARK));
439 url_fputs(fh, sprintf(
"Q team#%s\n", t));
445 if(v != 0) {
url_fputs(fh, sprintf(
"e %s %g\n", e, v)); }
458 if(nn !=
"") {
url_fputs(fh, sprintf(
"i %s\n", nn)); }
462 if(nn !=
"") {
url_fputs(fh, sprintf(
"n %s\n", nn)); }
473 if(nn !=
"") {
url_fputs(fh, sprintf(
"r %s\n", nn)); }
479 if(v != 0) {
url_fputs(fh, sprintf(
"e %s %g\n", e, v)); }
497 LOG_DEBUG(
"Got response from player stats server:");
520 LOG_INFO(
"Player stats writing failed: ",
ftos(status));
539 if (joiningplayer.crypto_idfp ==
"") {
548 uri =
strcat(uri,
"&hashkey=", uri_escape(joiningplayer.crypto_idfp));
549 LOG_DEBUG(
"Retrieving playerstats from URL: ", uri);
603 LOG_DEBUGF(
"PlayerStats_PlayerBasic_CheckUpdate('%s'): %f",
604 joiningplayer.netname,
611 if(!joiningplayer.playerstats_basicstatus)
627 LOG_DEBUG(
"-- Sending data to player stats server");
639 temp =
strcat(temp,
"\n", s);
665 LOG_INFO(
"Player stats synchronized with server");
672 LOG_INFO(
"Receiving player stats failed: ",
ftos(status));
684 string e =
"", en =
"";
698 string marker = sprintf(
"%s", event);
712 LOG_DEBUG(
"Added item ", sprintf(
"#%s", event),
"=", data,
" to PS_D_IN_DB");
751 float gamecount =
cvar(
"cl_matchcount");
754 LOG_INFOF(
"PlayerStats_PlayerDetail_CheckUpdate(): %f >= %f, %d > %d",
780 LOG_DEBUG(
"PlayerStats_PlayerDetail_Handler(): Sending data to player stats server...");
783 url_fputs(fh, sprintf(
"R %s\n", WATERMARK));
802 string key =
"",
event =
"", data =
"";
804 if(
argv(0) ==
"#") {
continue; }
836 if(event !=
"" && data !=
"")
853 "PlayerStats_PlayerDetail_Handler(): ERROR: "
854 "Key went unhandled? Is our version outdated?\n"
855 "PlayerStats_PlayerDetail_Handler(): "
856 "Key '%s', Event '%s', Data '%s'",
867 "PlayerStats_PlayerDetail_Handler(): "
868 "Key '%s', Event '%s', Data '%s'",
885 LOG_INFO(
"PlayerStats_PlayerDetail_Handler(): Player stats synchronized with server.");
892 LOG_INFO(
"PlayerStats_PlayerDetail_Handler(): Receiving player stats failed: ",
ftos(status));
float accuracy_fired[REGISTRY_MAX(Weapons)]
float accuracy_frags[REGISTRY_MAX(Weapons)]
float accuracy_cnt_hit[REGISTRY_MAX(Weapons)]
float accuracy_hit[REGISTRY_MAX(Weapons)]
float accuracy_cnt_fired[REGISTRY_MAX(Weapons)]
float accuracy_real[REGISTRY_MAX(Weapons)]
void anticheat_report_to_playerstats(entity this)
void anticheat_register_to_playerstats()
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
#define scores_label(this)
#define teamscores_label(i)
string playername(string thename, int teamid, bool team_colorize)
const int SERVERFLAG_PLAYERSTATS
const int SERVERFLAG_PLAYERSTATS_CUSTOM
#define tokenizebyseparator
#define pass(name, colormin, colormax)
#define FOREACH(list, cond, body)
ERASEABLE int json_parse(string in, bool() func)
ERASEABLE string json_get(int buf, string key)
#define REPLICATE_APPLYCHANGE(var, ApplyChange_code)
Allows setting code that will be executed on cvar value changes.
#define REPLICATE(...)
Replicates a client cvar into a server field.
ERASEABLE void db_close(int db)
ERASEABLE int db_create()
ERASEABLE string db_get(int db, string key)
ERASEABLE void db_put(int db, string key, string value)
strcat(_("^F4Countdown stopped!"), "\n^BG", _("Teams are too unbalanced."))
float PlayerStats_GameReport_Event(string prefix, string event_id, float value)
void PlayerStats_GameReport(bool finished)
void PlayerStats_PlayerBasic(entity joiningplayer, float newrequest)
void PlayerStats_GameReport_FinalizePlayer(entity p)
void PlayerStats_Prematch()
#define ACCMAC(suffix, field)
void PlayerStats_GameReport_Handler(entity fh, entity pass, float status)
void PlayerStats_PlayerBasic_CheckUpdate(entity joiningplayer)
void PlayerStats_PlayerBasic_Handler(entity fh, entity p, float status)
void PlayerStats_GameReport_Accuracy(entity p)
void PlayerStats_GameReport_AddPlayer(entity e)
void PlayerStats_GameReport_AddTeam(int t)
void PlayerStats_GameReport_Init()
void PlayerStats_GameReport_Reset_All()
void PlayerStats_PlayerDetail_CheckUpdate()
void PlayerStats_PlayerDetail()
void PlayerStats_PlayerDetail_AddItem(string event, string data)
void PlayerStats_PlayerDetail_Handler(entity fh, entity unused, float status)
void PlayerStats_GameReport_AddEvent(string event_id)
string PlayerStats_GetGametype()
const string PLAYERSTATS_ACHIEVEMENT_FIRSTBLOOD
const string PLAYERSTATS_ACHIEVEMENT_FIRSTVICTIM
const string PLAYERSTATS_MATCHES
const string PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_25
const string PLAYERSTATS_HANDICAP_TAKEN
const string PLAYERSTATS_WINS
const string PLAYERSTATS_ACHIEVEMENT_BOTLIKE
float PlayerStats_PlayerDetail_Status
const string PLAYERSTATS_JOINS
float PS_D_NEXTUPDATETIME
const string PLAYERSTATS_SCOREBOARD
const float PS_B_STATUS_RECEIVED
string autocvar_g_playerstats_gamereport_uri
const float PS_B_STATUS_UPDATING
const string PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_20
const float PS_D_STATUS_WAITING
const float PS_D_STATUS_RECEIVED
string autocvar_g_playerstats_playerdetail_uri
const float PS_B_STATUS_WAITING
const string PLAYERSTATS_SCOREBOARD_VALID
string autocvar_g_playerstats_playerbasic_uri
const string PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_3
const string PLAYERSTATS_HANDICAP_GIVEN
const string PLAYERSTATS_TOTAL
const string PLAYERSTATS_RANK
const float PS_D_STATUS_ERROR
const string PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_30
const string PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_10
float autocvar_g_playerstats_playerdetail_autoupdatetime
string autocvar_g_playerstats_gamereport_ladder
const string PLAYERSTATS_AVGLATENCY
const string PLAYERSTATS_ALIVETIME
const string PLAYERSTATS_SCOREBOARD_POS
const float PS_B_STATUS_IDLE
#define PlayerStats_GameReport_Event_Player(ent, eventid, val)
bool PlayerStats_GameReport_DelayMapVote
const float PS_D_STATUS_IDLE
const string PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_15
const string PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_5
entity teamscorekeepers[16]
void PlayerScore_PlayerStats(entity p)
entity PlayerScore_Sort(.float field, int teams, bool strict, bool nospectators)
Sorts the players and stores their place in the given field, starting with.
void PlayerScore_TeamStats()
int autocvar_g_maxplayers
ClientState CS(Client this)
#define SHUTDOWN(func)
before shutdown
#define GameRules_scoring_add(client, fld, value)
#define EXPECT_NE(val1, val2)
ERASEABLE string url_fgets(entity e)
ERASEABLE void url_multi_fopen(string url, int mode, url_ready_func rdy, entity pass)
ERASEABLE void url_fputs(entity e, string s)
ERASEABLE void url_single_fopen(string url, int mode, url_ready_func rdy, entity pass)
ERASEABLE void url_fclose(entity e)
const float URL_READY_CLOSED
const float URL_READY_ERROR
const float URL_READY_CANREAD
const float URL_READY_CANWRITE
#define IS_REAL_CLIENT(v)
#define FOREACH_CLIENT(cond, body)
#define IS_BOT_CLIENT(v)
want: (IS_CLIENT(v) && !IS_REAL_CLIENT(v))
float cvar_purechanges_count