X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fplayerstats.qc;h=6b04eea9d6a06e648420feb83de200e4316fd529;hp=7da57f2c23102dc26ca4e73af96cce7387940e21;hb=2886ed5676755f4242704d64d3315124026496bb;hpb=10ff53d641f67cca5800983ff3476581ac50ea80 diff --git a/qcsrc/server/playerstats.qc b/qcsrc/server/playerstats.qc index 7da57f2c2..6b04eea9d 100644 --- a/qcsrc/server/playerstats.qc +++ b/qcsrc/server/playerstats.qc @@ -3,29 +3,52 @@ string playerstats_last; string events_last; .float playerstats_addedglobalinfo; float playerstats_requested; +.string playerstats_id; void PlayerStats_Init() { string uri; - playerstats_sent = TRUE; - uri = cvar_string("g_playerstats_uri"); + playerstats_db = -1; + playerstats_waitforme = TRUE; + uri = autocvar_g_playerstats_uri; if(uri == "") return; playerstats_db = db_create(); if(playerstats_db >= 0) - playerstats_sent = FALSE; // must wait for it at match end + playerstats_waitforme = FALSE; // must wait for it at match end PlayerStats_AddEvent(PLAYERSTATS_ALIVETIME); - PlayerStats_AddEvent(PLAYERSTATS_KILLS); + PlayerStats_AddEvent(PLAYERSTATS_WINS); + PlayerStats_AddEvent(PLAYERSTATS_MATCHES); + PlayerStats_AddEvent(PLAYERSTATS_JOINS); + PlayerStats_AddEvent(PLAYERSTATS_SCOREBOARD_VALID); + + PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_3); + PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_5); + PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_10); + PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_15); + PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_20); + PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_25); + PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_30); + PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_BOTLIKE); + PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_FIRSTBLOOD); + PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_FIRSTVICTIM); } void PlayerStats_AddPlayer(entity e) { - if(!e.crypto_idfp || playerstats_db < 0) + if(playerstats_db < 0) return; + + if(e.crypto_idfp != "") + e.playerstats_id = strzone(e.crypto_idfp); + else if(clienttype(e) == CLIENTTYPE_BOT) + e.playerstats_id = strzone(sprintf("bot#%d", e.playerid)); + else + e.playerstats_id = strzone(sprintf("player#%d", e.playerid)); string key; - key = sprintf("%s:*", e.crypto_idfp); + key = sprintf("%s:*", e.playerstats_id); string p; p = db_get(playerstats_db, key); @@ -38,7 +61,7 @@ void PlayerStats_AddPlayer(entity e) } else db_put(playerstats_db, key, "#"); - playerstats_last = strzone(e.crypto_idfp); + playerstats_last = strzone(e.playerstats_id); } } @@ -67,12 +90,12 @@ void PlayerStats_AddEvent(string event_id) void PlayerStats_Event(entity e, string event_id, float value) { - if(!e.crypto_idfp || playerstats_db < 0) + if(!e.playerstats_id || playerstats_db < 0) return; string key; float val; - key = sprintf("%s:%s", e.crypto_idfp, event_id); + key = sprintf("%s:%s", e.playerstats_id, event_id); val = stof(db_get(playerstats_db, key)); val += value; db_put(playerstats_db, key, ftos(val)); @@ -81,9 +104,10 @@ void PlayerStats_Event(entity e, string event_id, float value) void PlayerStats_Sent_URI_Get_Callback(float id, float status, string data) { if(playerstats_requested) - playerstats_sent = TRUE; + playerstats_waitforme = TRUE; } +//#NO AUTOCVARS START void PlayerStats_Shutdown() { string p, pn; @@ -96,7 +120,7 @@ void PlayerStats_Shutdown() if(playerstats_db < 0) return; - uri = cvar_string("g_playerstats_uri"); + uri = autocvar_g_playerstats_uri; if(uri != "") { b = buf_create(); @@ -108,6 +132,8 @@ void PlayerStats_Shutdown() bufstr_set(b, i++, sprintf("T %s.%06d", strftime(FALSE, "%s"), floor(random() * 1000000))); bufstr_set(b, i++, sprintf("G %s", GetGametype())); bufstr_set(b, i++, sprintf("M %s", GetMapname())); + bufstr_set(b, i++, sprintf("S %s", cvar_string("hostname"))); + bufstr_set(b, i++, sprintf("C %d", cvar_purechanges_count)); for(p = playerstats_last; (pn = db_get(playerstats_db, sprintf("%s:*", p))) != ""; p = pn) { bufstr_set(b, i++, sprintf("P %s", p)); @@ -118,37 +144,69 @@ void PlayerStats_Shutdown() { float v; v = stof(db_get(playerstats_db, sprintf("%s:%s", p, e))); - bufstr_set(b, i++, sprintf("e %s %f", e, v)); + if(v != 0) + bufstr_set(b, i++, sprintf("e %s %g", e, v)); } } bufstr_set(b, i++, ""); + if(autocvar_g_playerstats_debug) + { + for(i = 0; i < buf_getsize(b); ++i) + print(bufstr_get(b, i), "\n"); + } + if(crypto_uri_postbuf(uri, URI_GET_PLAYERSTATS_SENT, "text/plain", "\n", b, 0)) playerstats_requested = TRUE; else - playerstats_sent = TRUE; // if posting fails, we must continue anyway + playerstats_waitforme = TRUE; // if posting fails, we must continue anyway buf_del(b); } else - playerstats_sent = TRUE; + playerstats_waitforme = TRUE; db_close(playerstats_db); playerstats_db = -1; } +//#NO AUTOCVARS END void PlayerStats_AddGlobalInfo(entity p) { if(playerstats_db < 0) return; - if(!p.crypto_idfp || playerstats_db < 0) + if(!p.playerstats_id || playerstats_db < 0) return; p.playerstats_addedglobalinfo = TRUE; // add global info! if(p.alivetime) PlayerStats_Event(p, PLAYERSTATS_ALIVETIME, time - p.alivetime); + + if(p.alivetime) + PlayerStats_Event(p, PLAYERSTATS_ALIVETIME, time - p.alivetime); - if(p.cvar_cl_allow_uid2name) - db_put(playerstats_db, sprintf("%s:_netname", p.crypto_idfp), p.netname); + if(p.cvar_cl_allow_uid2name == 1 || clienttype(p) == CLIENTTYPE_BOT) + db_put(playerstats_db, sprintf("%s:_netname", p.playerstats_id), p.netname); + + if(p.alivetime > 0) + PlayerStats_Event(p, PLAYERSTATS_JOINS, 1); + + strunzone(p.playerstats_id); + p.playerstats_id = string_null; +} + +void PlayerStats_EndMatch(float finished) +{ + entity p; + FOR_EACH_PLAYER(p) + { + PlayerScore_PlayerStats(p); + PlayerStats_Event(p, PLAYERSTATS_SCOREBOARD_VALID, 1); + if(finished) + { + PlayerStats_Event(p, PLAYERSTATS_WINS, p.winning); + PlayerStats_Event(p, PLAYERSTATS_MATCHES, 1); + } + } }