r4163 - in trunk/data: . qcsrc/client qcsrc/common qcsrc/server

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Sat Aug 23 13:26:49 EDT 2008


Author: div0
Date: 2008-08-23 13:26:48 -0400 (Sat, 23 Aug 2008)
New Revision: 4163

Modified:
   trunk/data/defaultNexuiz.cfg
   trunk/data/qcsrc/client/sbar.qc
   trunk/data/qcsrc/common/util.qc
   trunk/data/qcsrc/common/util.qh
   trunk/data/qcsrc/server/clientcommands.qc
   trunk/data/qcsrc/server/gamecommand.qc
   trunk/data/qcsrc/server/scores.qc
   trunk/data/qcsrc/server/scores.qh
   trunk/data/qcsrc/server/scores_rules.qc
Log:
make "teamstatus" work again



Modified: trunk/data/defaultNexuiz.cfg
===================================================================
--- trunk/data/defaultNexuiz.cfg	2008-08-23 15:42:16 UTC (rev 4162)
+++ trunk/data/defaultNexuiz.cfg	2008-08-23 17:26:48 UTC (rev 4163)
@@ -865,7 +865,7 @@
 // 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 $*"

Modified: trunk/data/qcsrc/client/sbar.qc
===================================================================
--- trunk/data/qcsrc/client/sbar.qc	2008-08-23 15:42:16 UTC (rev 4162)
+++ trunk/data/qcsrc/client/sbar.qc	2008-08-23 17:26:48 UTC (rev 4163)
@@ -561,29 +561,7 @@
 				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";
 }

Modified: trunk/data/qcsrc/common/util.qc
===================================================================
--- trunk/data/qcsrc/common/util.qc	2008-08-23 15:42:16 UTC (rev 4162)
+++ trunk/data/qcsrc/common/util.qc	2008-08-23 17:26:48 UTC (rev 4163)
@@ -436,3 +436,35 @@
 	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;
+}

Modified: trunk/data/qcsrc/common/util.qh
===================================================================
--- trunk/data/qcsrc/common/util.qh	2008-08-23 15:42:16 UTC (rev 4162)
+++ trunk/data/qcsrc/common/util.qh	2008-08-23 17:26:48 UTC (rev 4163)
@@ -58,3 +58,4 @@
 
 string GametypeNameFromType(float g);
 string mmsss(float t);
+string ScoreString(float vflags, float value);

Modified: trunk/data/qcsrc/server/clientcommands.qc
===================================================================
--- trunk/data/qcsrc/server/clientcommands.qc	2008-08-23 15:42:16 UTC (rev 4162)
+++ trunk/data/qcsrc/server/clientcommands.qc	2008-08-23 17:26:48 UTC (rev 4163)
@@ -347,6 +347,8 @@
 		if(cvar("sv_timeout")) {
 			evaluateResumeGame();
 		}
+	} else if(argv(0) == "teamstatus") {
+		Score_NicePrint(self);
 	} else {
 		//if(ctf_clientcommand())
 		//	return;

Modified: trunk/data/qcsrc/server/gamecommand.qc
===================================================================
--- trunk/data/qcsrc/server/gamecommand.qc	2008-08-23 15:42:16 UTC (rev 4162)
+++ trunk/data/qcsrc/server/gamecommand.qc	2008-08-23 17:26:48 UTC (rev 4163)
@@ -202,13 +202,15 @@
 			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");

Modified: trunk/data/qcsrc/server/scores.qc
===================================================================
--- trunk/data/qcsrc/server/scores.qc	2008-08-23 15:42:16 UTC (rev 4162)
+++ trunk/data/qcsrc/server/scores.qc	2008-08-23 17:26:48 UTC (rev 4163)
@@ -436,41 +436,6 @@
 	}
 }
 
-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 @@
 		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 @@
 		plist = p;
 	}
 	// Now plist points to the whole list.
+	
+	pfirst = plast = world;
 
 	i = 0;
 	while(plist)
@@ -646,9 +617,14 @@
 		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 @@
 		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;
+	}
+}
+

Modified: trunk/data/qcsrc/server/scores.qh
===================================================================
--- trunk/data/qcsrc/server/scores.qh	2008-08-23 15:42:16 UTC (rev 4162)
+++ trunk/data/qcsrc/server/scores.qh	2008-08-23 17:26:48 UTC (rev 4163)
@@ -84,9 +84,9 @@
 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 @@
 /**
  * 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);

Modified: trunk/data/qcsrc/server/scores_rules.qc
===================================================================
--- trunk/data/qcsrc/server/scores_rules.qc	2008-08-23 15:42:16 UTC (rev 4162)
+++ trunk/data/qcsrc/server/scores_rules.qc	2008-08-23 17:26:48 UTC (rev 4163)
@@ -149,8 +149,6 @@
 	}
 	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




More information about the nexuiz-commits mailing list