r1829 - in branches/nexuiz-2.0/data: . qcsrc/common qcsrc/server

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Sun Aug 20 06:56:28 EDT 2006


Author: div0
Date: 2006-08-20 06:56:27 -0400 (Sun, 20 Aug 2006)
New Revision: 1829

Modified:
   branches/nexuiz-2.0/data/default.cfg
   branches/nexuiz-2.0/data/qcsrc/common/util.qc
   branches/nexuiz-2.0/data/qcsrc/server/cl_physics.qc
   branches/nexuiz-2.0/data/qcsrc/server/cl_player.qc
   branches/nexuiz-2.0/data/qcsrc/server/constants.qh
   branches/nexuiz-2.0/data/qcsrc/server/defs.qh
   branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc
   branches/nexuiz-2.0/data/qcsrc/server/t_teleporters.qc
   branches/nexuiz-2.0/data/qcsrc/server/teamplay.qc
Log:
merged player name display (used for teamplay only by default)


Modified: branches/nexuiz-2.0/data/default.cfg
===================================================================
--- branches/nexuiz-2.0/data/default.cfg	2006-08-18 12:00:39 UTC (rev 1828)
+++ branches/nexuiz-2.0/data/default.cfg	2006-08-20 10:56:27 UTC (rev 1829)
@@ -722,3 +722,5 @@
 seta sv_curl_defaulturl "http://www.nexuiz.com/contentdownload/getmap.php?file="
 
 set sv_motd ""
+
+seta cl_shownames 1 // show player names pointed to (0: never, 1: teamplay only, 2: always)

Modified: branches/nexuiz-2.0/data/qcsrc/common/util.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/common/util.qc	2006-08-18 12:00:39 UTC (rev 1828)
+++ branches/nexuiz-2.0/data/qcsrc/common/util.qc	2006-08-20 10:56:27 UTC (rev 1829)
@@ -173,3 +173,13 @@
 */
 }
 
+float dist_point_line(vector p, vector l0, vector ldir)
+{
+	ldir = normalize(ldir);
+	
+	// remove the component in line direction
+	p = p - (p * ldir) * ldir;
+
+	// vlen of the remaining vector
+	return vlen(p);
+}

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_physics.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_physics.qc	2006-08-18 12:00:39 UTC (rev 1828)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_physics.qc	2006-08-20 10:56:27 UTC (rev 1829)
@@ -94,6 +94,8 @@
 	if (self.deadflag)
 		return;
 
+	UpdateSelectedPlayer();
+
 	if (!self.fixangle)
 	{
 		self.angles_x = 0;

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_player.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_player.qc	2006-08-18 12:00:39 UTC (rev 1828)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_player.qc	2006-08-20 10:56:27 UTC (rev 1829)
@@ -290,6 +290,8 @@
 
 		// become fully visible
 		self.alpha = 1;
+		// clear selected player display
+		ClearSelectedPlayer();
 		// throw a weapon
 		SpawnThrownWeapon (self.origin + (self.mins + self.maxs) * 0.5, self.switchweapon);
 		// print an obituary message
@@ -353,3 +355,146 @@
 	}
 }
 
+float UpdateSelectedPlayer_countvalue(float v)
+{
+	return max(0, (v - 1.0) / 0.5);
+}
+
+// returns: -2 if no hit, otherwise cos of the angle
+// uses the global v_angle
+float UpdateSelectedPlayer_canSee(entity p, float mincosangle, float maxdist)
+{
+	vector so, d;
+	float c;
+
+	if(p == self)
+		return -2;
+
+	if(p.deadflag)
+		return -2;
+
+	so = self.origin + self.view_ofs;
+	d = p.origin - so;
+
+	// misaimed?
+	if(dist_point_line(d, '0 0 0', v_forward) > maxdist)
+		return -2;
+
+	// now find the cos of the angle...
+	c = normalize(d) * v_forward;
+
+	if(c <= mincosangle)
+		return -2;
+
+	traceline(so, p.origin, MOVE_NOMONSTERS, self);
+	if(trace_fraction < 1)
+		return -2;
+
+	return c;
+}
+
+void ClearSelectedPlayer()
+{
+	if(self.selected_player)
+	{
+		centerprint_expire(self, CENTERPRIO_POINT);
+		self.selected_player = world;
+		self.selected_player_display_needs_update = FALSE;
+	}
+}
+
+void UpdateSelectedPlayer()
+{
+	entity selected;
+	float selected_score;
+	selected = world;
+	selected_score = 0.95; // 18 degrees
+
+	if(clienttype(self) != CLIENTTYPE_REAL)
+		return;
+
+	if(self.cvar_cl_shownames == 0)
+		return;
+
+	if(self.cvar_cl_shownames == 1 && !teams_matter)
+		return;
+
+	makevectors(self.v_angle); // sets v_forward
+
+	// 1. cursor trace is always right
+	if(self.cursor_trace_ent && self.cursor_trace_ent.classname == "player" && !self.cursor_trace_ent.deadflag)
+	{
+		selected = self.cursor_trace_ent;
+	}
+	else
+	{
+		// 2. if we don't have a cursor trace, find the player which is least
+		//    mis-aimed at
+		entity p;
+		for(p = find(world, classname, "player"); p; p = find(p, classname, "player"))
+		{
+			float c;
+			c = UpdateSelectedPlayer_canSee(p, selected_score, 100); // 100 = 2.5 meters
+			if(c >= -1)
+			{
+				selected = p;
+				selected_score = c;
+			}
+		}
+	}
+
+	if(selected)
+	{
+		self.selected_player_display_timeout = time + self.cvar_scr_centertime;
+	}
+	else
+	{
+		if(time < self.selected_player_display_timeout)
+			if(UpdateSelectedPlayer_canSee(self.selected_player, 0.7, 200) >= -1) // 5 meters, 45 degrees
+				selected = self.selected_player;
+	}
+
+	if(selected)
+	{
+		if(selected == self.selected_player)
+		{
+			float save;
+			save = UpdateSelectedPlayer_countvalue(self.selected_player_count);
+			self.selected_player_count = self.selected_player_count + frametime;
+			if(save != UpdateSelectedPlayer_countvalue(self.selected_player_count))
+			{
+				string namestr, healthstr;
+				if(teams_matter)
+				{
+					namestr = decolorize(selected.netname);
+					healthstr = ftos(floor(selected.health));
+					if(self.team == selected.team)
+					{
+						namestr = strcat(Team_ColorCode(selected.team), namestr, " (", healthstr, "%)");
+						self.selected_player_display_needs_update = TRUE;
+					}
+					else
+						namestr = strcat(Team_ColorCode(selected.team), namestr);
+				}
+				else
+				{
+					namestr = selected.netname;
+				}
+				centerprint_atprio(self, CENTERPRIO_POINT, namestr);
+			}
+		}
+		else
+		{
+			ClearSelectedPlayer();
+			self.selected_player = selected;
+			self.selected_player_time = time;
+			self.selected_player_count = 0;
+			self.selected_player_display_needs_update = FALSE;
+			// dprint("Selected: ", selected.netname, "\n");
+		}
+	}
+	else
+	{
+		ClearSelectedPlayer();
+	}
+}

Modified: branches/nexuiz-2.0/data/qcsrc/server/constants.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/constants.qh	2006-08-18 12:00:39 UTC (rev 1828)
+++ branches/nexuiz-2.0/data/qcsrc/server/constants.qh	2006-08-20 10:56:27 UTC (rev 1829)
@@ -210,3 +210,8 @@
 float FLAG_DROPPED = 3;
 
 float MAX_SHOT_DISTANCE = 32768;
+
+float COLOR_TEAM1	= 5;  // red
+float COLOR_TEAM2	= 14; // blue
+float COLOR_TEAM3	= 10; // pink
+float COLOR_TEAM4	= 13; // yellow

Modified: branches/nexuiz-2.0/data/qcsrc/server/defs.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/defs.qh	2006-08-18 12:00:39 UTC (rev 1828)
+++ branches/nexuiz-2.0/data/qcsrc/server/defs.qh	2006-08-20 10:56:27 UTC (rev 1829)
@@ -154,7 +154,7 @@
 void(entity client, string s)	stuffcmd = #21;
 void(entity client, string s)	sprint = #24;
 vector(entity e, float sped)	aim = #44;
-void(entity client, string s)	centerprint = #73;
+void(entity client, string s)	centerprint_builtin = #73;
 void(entity e)			setspawnparms = #78;
 void(float to, float f)		WriteByte = #52;
 void(float to, float f)		WriteChar = #53;
@@ -256,6 +256,8 @@
 .float() customizeentityforclient;
 .float cvar_cl_playerdetailreduction;
 .float cvar_cl_nogibs;
+.float cvar_scr_centertime;
+.float cvar_cl_shownames;
 
 #ifdef ALLOW_VARIABLE_LOD
 .float modelindex_lod0;
@@ -283,3 +285,15 @@
 float W_AmmoItemCode(float wpn);
 float W_ItemCode(float wpn);
 string W_Name(float weaponid);
+
+void UpdateSelectedPlayer();
+void ClearSelectedPlayer();
+.entity selected_player;
+.float selected_player_time; // when this player has been selected
+.float selected_player_count; // how long this player has been directly pointed to
+.float selected_player_display_needs_update; // are regular updates necessary? (health)
+.float selected_player_display_timeout; // when the selection will time out
+
+void centerprint_atprio(entity e, float prio, string s);
+void centerprint_expire(entity e, float prio);
+void centerprint(entity e, string s);

Modified: branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc	2006-08-18 12:00:39 UTC (rev 1828)
+++ branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc	2006-08-20 10:56:27 UTC (rev 1829)
@@ -393,6 +393,8 @@
 {
 	GetCvars_handleFloat(f, cvar_cl_playerdetailreduction, "cl_playerdetailreduction");
 	GetCvars_handleFloat(f, cvar_cl_nogibs, "cl_nogibs");
+	GetCvars_handleFloat(f, cvar_scr_centertime, "scr_centertime");
+	GetCvars_handleFloat(f, cvar_cl_shownames, "cl_shownames");
 }
 
 float fexists(string f)
@@ -474,3 +476,96 @@
 		error(strcat("There were ", ftos(f), " frags left. BAD!"));
 }
 
+string Team_ColorCode(float teamid)
+{
+	if(teamid == COLOR_TEAM1)
+		return "^1";
+	else if(teamid == COLOR_TEAM2)
+		return "^4";
+	else if(teamid == COLOR_TEAM3)
+		return "^6";
+	else if(teamid == COLOR_TEAM4)
+		return "^3";
+	else
+		return "^7";
+}
+
+string decolorize(string s)
+{
+	string out;
+	out = "";
+	while(s != "")
+	{
+		float n;
+		string ch1, ch2;
+		n = 1;
+		ch1 = substring(s, 0, 1);
+		ch2 = substring(s, 1, 2);
+		if(ch1 == "^")
+		{
+			n = 2;
+			if(ch2 == "^")
+				out = strcat(out, "^");
+			else if(ch2 == "0")
+				out = strcat(out);
+			else if(ch2 == "1")
+				out = strcat(out);
+			else if(ch2 == "2")
+				out = strcat(out);
+			else if(ch2 == "3")
+				out = strcat(out);
+			else if(ch2 == "4")
+				out = strcat(out);
+			else if(ch2 == "5")
+				out = strcat(out);
+			else if(ch2 == "6")
+				out = strcat(out);
+			else if(ch2 == "7")
+				out = strcat(out);
+			else if(ch2 == "8")
+				out = strcat(out);
+			else if(ch2 == "9")
+				out = strcat(out);
+			else
+			{
+				n = 1;
+				out = strcat(out, "^");
+			}
+			s = substring(s, n, strlen(s) - n);
+		}
+		else
+		{
+			s = substring(s, 1, strlen(s) - 1);
+			out = strcat(out, ch1);
+		}
+	}
+	return out;
+}
+
+#define CENTERPRIO_POINT 1
+#define CENTERPRIO_NORMAL 5
+.float centerprint_priority;
+.float centerprint_expires;
+void centerprint_atprio(entity e, float prio, string s)
+{
+	if(time > e.centerprint_expires)
+		e.centerprint_priority = 0;
+	if(prio >= e.centerprint_priority)
+	{
+		e.centerprint_priority = prio;
+		e.centerprint_expires = time + e.cvar_scr_centertime;
+		centerprint_builtin(e, s);
+	}
+}
+void centerprint_expire(entity e, float prio)
+{
+	if(prio == e.centerprint_priority)
+	{
+		e.centerprint_priority = 0;
+		centerprint_builtin(e, "");
+	}
+}
+void centerprint(entity e, string s)
+{
+	centerprint_atprio(e, CENTERPRIO_NORMAL, s);
+}

Modified: branches/nexuiz-2.0/data/qcsrc/server/t_teleporters.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/t_teleporters.qc	2006-08-18 12:00:39 UTC (rev 1828)
+++ branches/nexuiz-2.0/data/qcsrc/server/t_teleporters.qc	2006-08-20 10:56:27 UTC (rev 1829)
@@ -88,6 +88,15 @@
 	other.oldvelocity = other.velocity;
 	// reset tracking of who pushed you into a hazard (for kill credit)
 	other.pushltime = 0;
+
+	// stop player name display
+	{
+		entity oldself;
+		oldself = self;
+		self = other;
+		ClearSelectedPlayer();
+		self = oldself;
+	}
 }
 
 void info_teleport_destination (void)

Modified: branches/nexuiz-2.0/data/qcsrc/server/teamplay.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/teamplay.qc	2006-08-18 12:00:39 UTC (rev 1828)
+++ branches/nexuiz-2.0/data/qcsrc/server/teamplay.qc	2006-08-20 10:56:27 UTC (rev 1829)
@@ -1,9 +1,3 @@
-float COLOR_TEAM1	= 5;  // red
-float COLOR_TEAM2	= 14; // blue
-float COLOR_TEAM3	= 10; // pink
-float COLOR_TEAM4	= 13; // yellow
-
-
 float GAME_DEATHMATCH		= 1;
 float GAME_TEAM_DEATHMATCH	= 2;
 float GAME_DOMINATION		= 3;




More information about the nexuiz-commits mailing list