From 128c5c469a6d9f7f70467324beb2cc5d3ad5a710 Mon Sep 17 00:00:00 2001 From: fruitiex Date: Sat, 16 Jan 2010 12:14:20 +0000 Subject: [PATCH] UID system with race/cts rankings support git-svn-id: svn://svn.icculus.org/nexuiz/trunk@8504 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/defaultNexuiz.cfg | 3 ++ data/qcsrc/client/Main.qc | 17 ++++++++ data/qcsrc/server/cl_client.qc | 19 +++++++++ data/qcsrc/server/clientcommands.qc | 9 +++++ data/qcsrc/server/race.qc | 63 +++++++++++++++++++++++++++++ 5 files changed, 111 insertions(+) diff --git a/data/defaultNexuiz.cfg b/data/defaultNexuiz.cfg index 74aee70a4..ef37b17df 100644 --- a/data/defaultNexuiz.cfg +++ b/data/defaultNexuiz.cfg @@ -1768,3 +1768,6 @@ set cl_lerpanim_maxdelta_server 0.1 // must be slower than slowest server contro // FIXME temporary set menu_font_size_snapping_fix 1 + +// player ID +seta _cl_userid "" "player ID (e.g. for tournaments)" diff --git a/data/qcsrc/client/Main.qc b/data/qcsrc/client/Main.qc index dac8ff175..62e5aa284 100644 --- a/data/qcsrc/client/Main.qc +++ b/data/qcsrc/client/Main.qc @@ -135,6 +135,23 @@ void CSQC_Init(void) Announcer_Precache(); Tuba_Precache(); +#ifdef UID + { + // find the user ID + string uid; + registercvar("_cl_userid", "", CVAR_SAVE); + uid = cvar_string("_cl_userid"); + if(strlen(uid) < 16) + { + uid = ""; + for(i = 0; i < 4; ++i) + uid = strcat(uid, substring(ftos(floor(10000 + random() * 10000)), 1, -1)); + } + cvar_set("_cl_userid", uid); + localcmd(strcat("\ncmd uid ", uid, "\n")); + } +#endif + get_mi_min_max_texcoords(1); // try the CLEVER way first minimapname = strcat("gfx/", mi_shortname, "_radar.tga"); shortmapname = mi_shortname; diff --git a/data/qcsrc/server/cl_client.qc b/data/qcsrc/server/cl_client.qc index 3948f071f..528cb0f9a 100644 --- a/data/qcsrc/server/cl_client.qc +++ b/data/qcsrc/server/cl_client.qc @@ -1312,6 +1312,10 @@ Called when a client connects to the server string ColoredTeamName(float t); void DecodeLevelParms (void); //void dom_player_join_team(entity pl); +#ifdef UID +.float uid_kicktime; +.string uid; +#endif void ClientConnect (void) { float t; @@ -1485,6 +1489,12 @@ void ClientConnect (void) else self.hitplotfh = -1; +#ifdef UID + if(clienttype(self) == CLIENTTYPE_REAL) + if not(self.uid) + self.uid_kicktime = time + 60; +#endif + if(g_race || g_cts) { string rr; if(g_cts) @@ -2937,6 +2947,15 @@ void PlayerPostThink (void) self.stat_count -= 1; } +#ifdef UID + if(self.uid_kicktime) + if(time > self.uid_kicktime) + { + bprint("^3", self.netname, "^3 was kicked for missing UID.\n"); + dropclient(self); + return; + } +#endif if(sv_maxidle && frametime) { // WORKAROUND: only use dropclient in server frames (frametime set). Never use it in cl_movement frames (frametime zero). diff --git a/data/qcsrc/server/clientcommands.qc b/data/qcsrc/server/clientcommands.qc index 53e474a3b..305a9f0bf 100644 --- a/data/qcsrc/server/clientcommands.qc +++ b/data/qcsrc/server/clientcommands.qc @@ -221,6 +221,15 @@ void SV_ParseClientCommand(string s) { tokens = tokenize_console(s); } GetCvars(1); +#ifdef UID + } else if (cmd == "uid") { + if not(self.uid) + { + self.uid = strzone(argv(1)); + self.uid_kicktime = 0; + print("Client ", etos(self), " has UID ", self.uid, "\n"); + } +#endif } else if(cmd == "sentcvar") { // new system if(tokens == 2) // undefined cvar: use the default value on the server then { diff --git a/data/qcsrc/server/race.qc b/data/qcsrc/server/race.qc index 0415bccce..7ae473c2f 100644 --- a/data/qcsrc/server/race.qc +++ b/data/qcsrc/server/race.qc @@ -101,6 +101,9 @@ void race_InitSpectator() string rr; float grecordtime[RANKINGS_CNT]; string grecordholder[RANKINGS_CNT]; +#ifdef UID +string grecorduid[RANKINGS_CNT]; +#endif float worst_time; // last ranked time float have_recs; // have we already read the records from the database before? float race_GetTime(float pos) { @@ -114,9 +117,15 @@ float race_GetTime(float pos) { for(i=0;i=0;--i) + if(grecorduid[i] == uid) + return i+1; + for (i=RANKINGS_CNT-1;i>=0;--i) + if(grecordholder[i] == netname) + return i+1; + return 0; +} +#endif + float race_CheckName(string netname) { // Does the name already exist in rankings? In that case, where? (otherwise 0) float i; for (i=RANKINGS_CNT-1;i>=0;--i) @@ -192,6 +214,9 @@ void race_SetTime(entity e, float t) { pos = race_GetPos(t); float prevpos = race_CheckName(e.netname); +#ifdef UID + float prevpos = race_CheckUID(e.uid, e.netname); +#endif if (prevpos && (prevpos < pos || !pos)) { oldrec = race_GetTime(prevpos); @@ -215,23 +240,41 @@ void race_SetTime(entity e, float t) { for (i=prevpos-1;i>pos-1;--i) { db_put(ServerProgsDB, strcat(GetMapname(), rr, "time", ftos(i)), ftos(grecordtime[i-1])); db_put(ServerProgsDB, strcat(GetMapname(), rr, "netname", ftos(i)), grecordholder[i-1]); +#ifdef UID + db_put(ServerProgsDB, strcat(GetMapname(), rr, "uid", ftos(i)), grecorduid[i-1]); +#endif if(i == prevpos-1) { oldrec = grecordtime[i]; oldname = grecordholder[i]; } grecordtime[i] = grecordtime[i-1]; + if (grecordholder[i]) strunzone(grecordholder[i]); grecordholder[i] = strzone(grecordholder[i-1]); +#ifdef UID + if (grecorduid[i]) + strunzone(grecorduid[i]); + grecorduid[i] = strzone(grecorduid[i-1]); +#endif } } else { // player has no ranked record yet for (i=RANKINGS_CNT-1;i>pos-1;--i) { db_put(ServerProgsDB, strcat(GetMapname(), rr, "time", ftos(i)), ftos(grecordtime[i-1])); db_put(ServerProgsDB, strcat(GetMapname(), rr, "netname", ftos(i)), grecordholder[i-1]); +#ifdef UID + db_put(ServerProgsDB, strcat(GetMapname(), rr, "uid", ftos(i)), grecorduid[i-1]); +#endif grecordtime[i] = grecordtime[i-1]; + if (grecordholder[i]) strunzone(grecordholder[i]); grecordholder[i] = strzone(grecordholder[i-1]); +#ifdef UID + if (grecorduid[i]) + strunzone(grecorduid[i]); + grecorduid[i] = strzone(grecorduid[i-1]); +#endif } } @@ -239,19 +282,39 @@ void race_SetTime(entity e, float t) { if (pos == 1) { db_put(ServerProgsDB, strcat(GetMapname(), rr, "time"), ftos(t)); db_put(ServerProgsDB, strcat(GetMapname(), rr, "netname"), e.netname); +#ifdef UID + db_put(ServerProgsDB, strcat(GetMapname(), rr, "uid"), e.uid); +#endif + grecordtime[0] = t; + if (grecordholder[0]) strunzone(grecordholder[0]); grecordholder[0] = strzone(e.netname); +#ifdef UID + if (grecorduid[0]) + strunzone(grecorduid[0]); + grecorduid[0] = strzone(e.uid); +#endif write_recordmarker(e, time - TIME_DECODE(t), TIME_DECODE(t)); race_send_recordtime(MSG_ALL); } else { db_put(ServerProgsDB, strcat(GetMapname(), rr, "time", ftos(pos-1)), ftos(t)); db_put(ServerProgsDB, strcat(GetMapname(), rr, "netname", ftos(pos-1)), e.netname); +#ifdef UID + db_put(ServerProgsDB, strcat(GetMapname(), rr, "uid", ftos(pos-1)), e.uid); +#endif + grecordtime[pos-1] = t; + if (grecordholder[pos-1]) strunzone(grecordholder[pos-1]); grecordholder[pos-1] = strzone(e.netname); +#ifdef UID + if (grecorduid[pos-1]) + strunzone(grecorduid[pos-1]); + grecorduid[pos-1] = strzone(e.uid); +#endif } if (pos == RANKINGS_CNT) -- 2.39.2