r1828 - trunk/data/qcsrc/server
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Fri Aug 18 08:00:40 EDT 2006
Author: div0
Date: 2006-08-18 08:00:39 -0400 (Fri, 18 Aug 2006)
New Revision: 1828
Modified:
trunk/data/qcsrc/server/cl_player.qc
Log:
prevent non-visible players from name display
Modified: trunk/data/qcsrc/server/cl_player.qc
===================================================================
--- trunk/data/qcsrc/server/cl_player.qc 2006-08-17 20:47:55 UTC (rev 1827)
+++ trunk/data/qcsrc/server/cl_player.qc 2006-08-18 12:00:39 UTC (rev 1828)
@@ -360,11 +360,47 @@
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()
{
- centermsg_set(CENTERMSG_POINT, "");
- self.selected_player = world;
- self.selected_player_display_needs_update = FALSE;
+ if(self.selected_player)
+ {
+ centermsg_set(CENTERMSG_POINT, "");
+ self.selected_player = world;
+ self.selected_player_display_needs_update = FALSE;
+ }
}
void UpdateSelectedPlayer()
@@ -372,7 +408,7 @@
entity selected;
float selected_score;
selected = world;
- selected_score = 0;
+ selected_score = 0.95; // 18 degrees
if(clienttype(self) != CLIENTTYPE_REAL)
return;
@@ -383,6 +419,8 @@
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)
{
@@ -390,42 +428,15 @@
}
else
{
- makevectors(self.v_angle); // sets v_forward
-
// 2. if we don't have a cursor trace, find the player which is least
// mis-aimed at
entity p;
- vector so;
- so = self.origin + self.view_ofs;
for(p = find(world, classname, "player"); p; p = find(p, classname, "player"))
{
float c;
- vector d;
- d = p.origin - so;
-
- if(p == self)
- continue;
-
- if(p.deadflag)
- continue;
-
- // misaimed?
- if(dist_point_line(d, '0 0 0', v_forward) > 100) // about 2.5 m
- continue;
-
- // now find the cos of the angle...
- c = normalize(d) * v_forward;
-
- if(c < 0.95) // about 18 degrees
- continue;
-
- if(c > selected_score)
+ c = UpdateSelectedPlayer_canSee(p, selected_score, 100); // 100 = 2.5 meters
+ if(c >= -1)
{
- // oh right... can we even see him?
- traceline(so, p.origin, MOVE_NOMONSTERS, self);
- if(trace_fraction < 1)
- continue;
-
selected = p;
selected_score = c;
}
@@ -439,7 +450,7 @@
else
{
if(time < self.selected_player_display_timeout)
- if(!self.selected_player.deadflag)
+ if(UpdateSelectedPlayer_canSee(self.selected_player, 0.7, 200) >= -1) // 5 meters, 45 degrees
selected = self.selected_player;
}
@@ -474,6 +485,7 @@
}
else
{
+ ClearSelectedPlayer();
self.selected_player = selected;
self.selected_player_time = time;
self.selected_player_count = 0;
@@ -483,10 +495,6 @@
}
else
{
- if(self.selected_player_display_needs_update)
- {
- centermsg_set(CENTERMSG_POINT, "");
- self.selected_player_display_needs_update = FALSE;
- }
+ ClearSelectedPlayer();
}
}
More information about the nexuiz-commits
mailing list