From e518198b2c63fd7b24852421a1d74d41c3e42e63 Mon Sep 17 00:00:00 2001 From: div0 Date: Sat, 23 Aug 2008 17:26:48 +0000 Subject: [PATCH] make "teamstatus" work again git-svn-id: svn://svn.icculus.org/nexuiz/trunk@4163 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/defaultNexuiz.cfg | 2 +- data/qcsrc/client/sbar.qc | 24 +--- data/qcsrc/common/util.qc | 32 +++++ data/qcsrc/common/util.qh | 1 + data/qcsrc/server/clientcommands.qc | 2 + data/qcsrc/server/gamecommand.qc | 6 +- data/qcsrc/server/scores.qc | 191 ++++++++++++++++++++++------ data/qcsrc/server/scores.qh | 7 +- data/qcsrc/server/scores_rules.qc | 2 - 9 files changed, 195 insertions(+), 72 deletions(-) diff --git a/data/defaultNexuiz.cfg b/data/defaultNexuiz.cfg index 1ff8e5e4a..599b3cb1b 100644 --- a/data/defaultNexuiz.cfg +++ b/data/defaultNexuiz.cfg @@ -865,7 +865,7 @@ seta cl_hidewaypoints 0 // command extension alias qc_cmd "sv_cmd $*" // menu QC will override this to menu_cmd alias adminmsg "sv_cmd adminmsg $*" -alias teamstatus "sv_cmd teamstatus" +alias teamstatus "cmd teamstatus; sv_cmd teamstatus" // yes, it is broken on listen servers that way, but well, who cares :P alias printstats "sv_cmd printstats" // print status on demand alias g_maplist_add "qc_cmd maplist add $*" alias g_maplist_remove "qc_cmd maplist remove $*" diff --git a/data/qcsrc/client/sbar.qc b/data/qcsrc/client/sbar.qc index babdd9360..644b30f27 100644 --- a/data/qcsrc/client/sbar.qc +++ b/data/qcsrc/client/sbar.qc @@ -561,29 +561,7 @@ string Sbar_GetField(entity pl, float field) sbar_field_rgb = '0 1 1'; else sbar_field_rgb = '1 1 1'; - if(!tmp) - if(f & (SFL_HIDE_ZERO | SFL_RANK | SFL_TIME)) - return ""; - if(f & SFL_RANK) - { - str = ftos(floor(tmp + 0.5)); - num = strlen(str); - if((num >= 2) && (substring(str, num - 2, 1) == "1")) - return strcat(str, "th"); - else if(substring(str, num - 1, 1) == "1") - return strcat(str, "st"); - else if(substring(str, num - 1, 1) == "2") - return strcat(str, "nd"); - else if(substring(str, num - 1, 1) == "3") - return strcat(str, "rd"); - else - return strcat(str, "th"); - } - else if(f & SFL_TIME) - { - return mmsss(tmp); - } - return ftos(tmp); + return ScoreString(f, tmp); } //return "error"; } diff --git a/data/qcsrc/common/util.qc b/data/qcsrc/common/util.qc index 2f7436f56..dbce6cb46 100644 --- a/data/qcsrc/common/util.qc +++ b/data/qcsrc/common/util.qc @@ -436,3 +436,35 @@ string mmsss(float tenths) s = ftos(1000 + tenths); return strcat(ftos(minutes), ":", substring(s, 1, 2), ".", substring(s, 3, 1)); } + +string ScoreString(float vflags, float value) +{ + string valstr; + float l; + + value = floor(value + 0.5); // round + + if((value == 0) && (vflags & (SFL_HIDE_ZERO | SFL_RANK | SFL_TIME))) + valstr = ""; + else if(vflags & SFL_RANK) + { + valstr = ftos(value); + l = strlen(valstr); + if((l >= 2) && (substring(valstr, l - 2, 1) == "1")) + valstr = strcat(valstr, "th"); + else if(substring(valstr, l - 1, 1) == "1") + valstr = strcat(valstr, "st"); + else if(substring(valstr, l - 1, 1) == "2") + valstr = strcat(valstr, "nd"); + else if(substring(valstr, l - 1, 1) == "3") + valstr = strcat(valstr, "rd"); + else + valstr = strcat(valstr, "th"); + } + else if(vflags & SFL_TIME) + valstr = mmsss(value); + else + valstr = ftos(value); + + return valstr; +} diff --git a/data/qcsrc/common/util.qh b/data/qcsrc/common/util.qh index 859757619..7362e8e78 100644 --- a/data/qcsrc/common/util.qh +++ b/data/qcsrc/common/util.qh @@ -58,3 +58,4 @@ float mod(float a, float b) { return a - (floor(a / b) * b); } string GametypeNameFromType(float g); string mmsss(float t); +string ScoreString(float vflags, float value); diff --git a/data/qcsrc/server/clientcommands.qc b/data/qcsrc/server/clientcommands.qc index a7fc0a47d..62237bcde 100644 --- a/data/qcsrc/server/clientcommands.qc +++ b/data/qcsrc/server/clientcommands.qc @@ -347,6 +347,8 @@ void SV_ParseClientCommand(string s) { if(cvar("sv_timeout")) { evaluateResumeGame(); } + } else if(argv(0) == "teamstatus") { + Score_NicePrint(self); } else { //if(ctf_clientcommand()) // return; diff --git a/data/qcsrc/server/gamecommand.qc b/data/qcsrc/server/gamecommand.qc index 29496af7a..b9b9968d0 100644 --- a/data/qcsrc/server/gamecommand.qc +++ b/data/qcsrc/server/gamecommand.qc @@ -202,13 +202,15 @@ void GameCommand(string command) print("Client not found\n"); return; } - if (argv(0) == "sdp") + if (argv(0) == "teamstatus") { - Score_DebugPrint(); + Score_NicePrint(world); + return; } if (argv(0) == "allready") { ReadyRestart(); + return; } print("Invalid command. For a list of supported commands, try sv_cmd help.\n"); diff --git a/data/qcsrc/server/scores.qc b/data/qcsrc/server/scores.qc index 1c6d8ca70..badaea75b 100644 --- a/data/qcsrc/server/scores.qc +++ b/data/qcsrc/server/scores.qc @@ -436,41 +436,6 @@ void WinningConditionHelper() } } -void Score_DebugPrint() -{ - entity p, sk; - float i, t; - - print("netname"); - for(i = 0; i < MAX_SCORE; ++i) - print(":", scores_label[i]); - print("\n"); - FOR_EACH_PLAYER(p) - { - sk = p.scorekeeper; - print(p.netname); - for(i = 0; i < MAX_SCORE; ++i) - print(":", ftos(sk.(scores[i]))); - print("\n"); - } - - print("teamname"); - for(i = 0; i < MAX_TEAMSCORE; ++i) - print(":", teamscores_label[i]); - print("\n"); - for(t = 0; t < 16; ++t) - { - sk = teamscorekeepers[t]; - if(sk) - { - print(ftos(t)); - for(i = 0; i < MAX_TEAMSCORE; ++i) - print(":", ftos(sk.(teamscores[i]))); - print("\n"); - } - } -} - string GetScoreLogLabel(string label, float fl) { if(fl & SFL_LOWER_IS_BETTER) @@ -600,17 +565,21 @@ float PlayerTeamScore_Compare(entity p1, entity p2) if(p1.team != p2.team) { entity t1, t2; - t1 = teamscorekeepers[p1.team]; - t2 = teamscorekeepers[p2.team]; - return TeamScore_Compare(t1, t2); + float r; + t1 = teamscorekeepers[p1.team - 1]; + t2 = teamscorekeepers[p2.team - 1]; + r = TeamScore_Compare(t1, t2); + if(r == 0) // ensure a deterministic order + r = p1.team - p2.team; + return r; } return PlayerScore_Compare(p1.scorekeeper, p2.scorekeeper); } -float PlayerScore_Sort(.float field) +entity PlayerScore_Sort(.float field) { - entity p, plist, pprev, pbest, pbestprev; + entity p, plist, pprev, pbest, pbestprev, pfirst, plast; float i; plist = world; @@ -623,6 +592,8 @@ float PlayerScore_Sort(.float field) plist = p; } // Now plist points to the whole list. + + pfirst = plast = world; i = 0; while(plist) @@ -646,9 +617,14 @@ float PlayerScore_Sort(.float field) pbest.chain = world; pbest.field = ++i; + if not(pfirst) + pfirst = pbest; + if(plast) + plast.chain = pbest; + plast = pbest; } - return i; + return pfirst; } float TeamScore_GetCompareValue(float t) @@ -670,3 +646,136 @@ float TeamScore_GetCompareValue(float t) s = -s; return s; } + +#define NAMEWIDTH 22 +#define SCORESWIDTH 58 +// TODO put this somewhere in common? +string Score_NicePrint_ItemColor(float vflags) +{ + if(vflags & SFL_SORT_PRIO_PRIMARY) + return "^3"; + else if(vflags & SFL_SORT_PRIO_SECONDARY) + return "^5"; + else + return "^7"; +} + +void Score_NicePrint_Team(entity to, float t, float w) +{ + string s, s2; + float i; + entity sk; + float fl, sc; + s = ""; + + sk = teamscorekeepers[t - 1]; + if(sk) + { + s = strcat(s, ColoredTeamName(t)); + for(i = 0; i < MAX_TEAMSCORE; ++i) + if(teamscores_label[i] != "") + { + fl = teamscores_flags[i]; + sc = sk.(teamscores[i]); + s = strcat(s, " ", Score_NicePrint_ItemColor(fl), ScoreString(fl, sc)); + } + } + else + s = "Scores:"; + + s = strcat(s, strpad(max(0, NAMEWIDTH - strlennocol(s)), "")); + + for(i = 0; i < MAX_SCORE; ++i) + if(scores_label[i] != "") + { + fl = scores_flags[i]; + s2 = scores_label[i]; + s = strcat(s, " ", Score_NicePrint_ItemColor(fl), strpad(-w, substring(s2, 0, w))); + } + + print_to(to, s); +} + +void Score_NicePrint_Player(entity to, entity p, float w) +{ + string s; + float i; + entity sk; + float fl, sc; + s = " "; + + sk = p.scorekeeper; + + s = strcat(s, p.netname); + for(;;) + { + i = strlennocol(s) - NAMEWIDTH; + if(i > 0) + s = substring(s, 0, strlen(s) - i); + else + { + s = strcat(s, strpad(i, "")); + break; + } + } + + for(i = 0; i < MAX_SCORE; ++i) + if(scores_label[i] != "") + { + fl = scores_flags[i]; + sc = sk.(scores[i]); + s = strcat(s, " ", Score_NicePrint_ItemColor(fl), strpad(-w, ScoreString(fl, sc))); + } + + print_to(to, s); +} + +void Score_NicePrint_Spectators(entity to) +{ + print_to(to, "Spectators:"); +} + +void Score_NicePrint_Spectator(entity to, entity p) +{ + print_to(to, strcat(" ", p.netname)); +} + +.float score_dummyfield; +void Score_NicePrint(entity to) +{ + entity p; + float t, i; + float w; + + t = 0; + for(i = 0; i < MAX_SCORE; ++i) + if(scores_label[i] != "") + ++t; + w = bound(6, floor(SCORESWIDTH / t - 1), 9); + + p = PlayerScore_Sort(score_dummyfield); + t = -1; + + if(!teamscores_entities_count) + Score_NicePrint_Team(to, t, w); + while(p) + { + if(teamscores_entities_count) + if(t != p.team) + Score_NicePrint_Team(to, p.team, w); + Score_NicePrint_Player(to, p, w); + t = p.team; + p = p.chain; + } + + t = 0; + FOR_EACH_CLIENT(p) + if(p.classname != "player") + { + if not(t) + Score_NicePrint_Spectators(to); + Score_NicePrint_Spectator(to, p); + t = 1; + } +} + diff --git a/data/qcsrc/server/scores.qh b/data/qcsrc/server/scores.qh index afa2e35ce..eeb8a457c 100644 --- a/data/qcsrc/server/scores.qh +++ b/data/qcsrc/server/scores.qh @@ -84,9 +84,9 @@ void ScoreInfo_Write(float targ); void Score_ClearAll(); /** - * Prints the scores (ugly!) to the console. + * Prints the scores to the console of a player. */ -void Score_DebugPrint(); +void Score_NicePrint(entity to); /** * Sets the following results for the current scores entities. @@ -117,5 +117,6 @@ string GetTeamScoreString(float tm, float shortString); /** * Sorts the players and stores their place in the given field, starting with * 1. Non-players get 0 written into that field. + * Returns the beginning of a sorted chain of the non-spectators. */ -float PlayerScore_Sort(.float field); +entity PlayerScore_Sort(.float field); diff --git a/data/qcsrc/server/scores_rules.qc b/data/qcsrc/server/scores_rules.qc index c40b2f468..f8f396cf9 100644 --- a/data/qcsrc/server/scores_rules.qc +++ b/data/qcsrc/server/scores_rules.qc @@ -149,8 +149,6 @@ void ScoreRules_race() } else if(g_race_qualifying) { - ScoreInfo_SetLabel_TeamScore( ST_RACE_LAPS, "laps", 0); - ScoreInfo_SetLabel_PlayerScore(SP_RACE_LAPS, "laps", 0); ScoreInfo_SetLabel_PlayerScore(SP_RACE_FASTEST, "fastest", SFL_SORT_PRIO_PRIMARY | SFL_LOWER_IS_BETTER | SFL_TIME); } else -- 2.39.2