Commit the new code files to GIT
authorMirceaKitsune <sonichedgehog_hyperblast00@yahoo.com>
Fri, 8 Jul 2011 23:05:57 +0000 (02:05 +0300)
committerMirceaKitsune <sonichedgehog_hyperblast00@yahoo.com>
Fri, 8 Jul 2011 23:05:57 +0000 (02:05 +0300)
data/qcsrc/client/shownames.qc [new file with mode: 0644]
data/qcsrc/client/shownames.qh [new file with mode: 0644]
data/qcsrc/client/teamplay.qh [new file with mode: 0644]

diff --git a/data/qcsrc/client/shownames.qc b/data/qcsrc/client/shownames.qc
new file mode 100644 (file)
index 0000000..eb15a24
--- /dev/null
@@ -0,0 +1,184 @@
+// self.isactive = player is in range and coordinates/status (health and armor) are up to date
+// self.origin = player origin TODO: should maybe move this so it's the origin of the shownames tag already in SSQC for culling?
+// self.healthvalue
+// self.armorvalue
+// self.sameteam = player is on same team as local client
+//
+const float SHOWNAMES_FADESPEED = 4;
+void Draw_ShowNames(entity ent)
+{
+       if(!cvar("hud_shownames"))
+               return;
+
+       if(ent.sv_entnum == player_localentnum && !cvar("chase_active"))
+               return;
+
+       if(ent.sameteam || (!ent.sameteam && cvar("hud_shownames_enemies")))
+       {
+               ent.origin_z += cvar("hud_shownames_offset");
+
+               if(!ent.sameteam)
+               {
+                       /* WIP, why does trace_ent != ent not work as intended here?
+                          if(cvar("hud_shownames_enemies") != 2) // player has to point at enemy if so
+                          {
+                          traceline(view_origin, view_origin + view_forward * MAX_SHOT_DISTANCE, MOVETYPE_FLY, world);
+                          print("trace_endpos: ", vtos(trace_endpos), " view_origin: ", vtos(view_origin), "\n");
+                          if(trace_ent != ent)
+                          return;
+                          }*/
+
+                       traceline(ent.origin, view_origin, 1, ent);
+               }
+
+               vector o, eo;
+               o = project_3d_to_2d(ent.origin);
+               float overlap;
+
+               if(cvar("hud_shownames_antioverlap"))
+               {
+                       // fade tag out if another tag that is closer to you overlaps
+                       entity e;
+                       for(e = world; (e = find(e, classname, "shownames_tag")); )
+                       {
+                               if(e == ent)
+                                       continue;
+                               eo = project_3d_to_2d(e.origin);
+                               if not(eo_z < 0 || eo_x < 0 || eo_y < 0 || eo_x > vid_conwidth || eo_y > vid_conheight)
+                               {
+                                       eo_z = 0;
+                                       if(vlen(('1 0 0' * o_x + '0 1 0' * o_y) - eo) < cvar("hud_shownames_antioverlap_distance") && vlen(ent.origin - view_origin) > vlen(e.origin - view_origin))
+                                       {
+                                               overlap = TRUE;
+                                               break;
+                                       }
+                               }
+                       }
+               }
+
+               if(!ent.sameteam && trace_endpos != view_origin) // out of view, fade out
+                       ent.alpha = max(0, ent.alpha - SHOWNAMES_FADESPEED * frametime);
+               else if(ent.healthvalue < 1) // dead player, fade out slowly
+                       ent.alpha = max(0, ent.alpha - SHOWNAMES_FADESPEED * 0.25 * frametime);
+               else if(overlap) // tag overlap detected, fade out
+                       ent.alpha = max(0, ent.alpha - SHOWNAMES_FADESPEED * frametime);
+               else // fade in
+                       ent.alpha = min(1, ent.alpha + SHOWNAMES_FADESPEED * frametime);
+
+               if(!ent.alpha)
+                       return;
+
+               float dist;
+               dist = vlen(ent.origin - view_origin);
+
+               float a;
+               a = cvar("hud_shownames_alpha");
+               a *= ent.alpha;
+               if(cvar("hud_shownames_maxdistance"))
+               {
+                       if(dist >= cvar("hud_shownames_maxdistance"))
+                               return;
+                       a *= ((cvar("hud_shownames_maxdistance") - cvar("hud_shownames_mindistance")) - max(0, dist - cvar("hud_shownames_mindistance"))) / (cvar("hud_shownames_maxdistance") - cvar("hud_shownames_mindistance"));
+               }
+
+               if(!a)
+                       return;
+
+               float resize;
+               resize = 1;
+               if(cvar("hud_shownames_resize")) // limit resize so its never smaller than 0.5... gets unreadable
+                       resize = 0.5 + 0.5 * ((cvar("hud_shownames_maxdistance") - cvar("hud_shownames_mindistance")) - max(0, dist - cvar("hud_shownames_mindistance"))) / (cvar("hud_shownames_maxdistance") - cvar("hud_shownames_mindistance"));
+
+               // draw the sprite image
+               if not(o_z < 0 || o_x < 0 || o_y < 0 || o_x > vid_conwidth || o_y > vid_conheight)
+               {
+                       o_z = 0;
+
+                       vector myPos, mySize;
+                       mySize = ('1 0 0' * cvar("hud_shownames_aspect") + '0 1 0') * cvar("hud_shownames_fontsize");
+                       myPos = o - '0.5 0 0' * mySize_x - '0 1 0' * mySize_y;
+
+                       // size scaling
+                       mySize_x *= resize;
+                       mySize_y *= resize;
+
+                       myPos_x += 0.5 * (mySize_x / resize - mySize_x);
+                       myPos_y += (mySize_y / resize - mySize_y);
+
+                       vector namepos; // this is where the origin of the string
+                       float namewidth;
+
+                       namepos = myPos;
+                       namewidth = mySize_x;
+
+                       string s;
+                       s = GetPlayerName(ent.sv_entnum-1);
+                       if((cvar("hud_shownames_decolorize") == 1 && teamplay) || cvar("hud_shownames_decolorize") == 2)
+                               s = playername(s, GetPlayerColor(ent.sv_entnum-1));
+
+                       drawfontscale = '1 1 0' * resize;
+                       s = textShortenToWidth(s, namewidth, '1 1 0' * cvar("hud_shownames_fontsize"), stringwidth_colors);
+
+                       if(cvar("hud_shownames_status") && teamplay)
+                       if(ent.sameteam && ent.healthvalue > 0)
+                       {
+                               if(ent.armorvalue)
+                                       s = strcat(s, " (", ftos(ent.healthvalue), "|", ftos(ent.armorvalue), ")");
+                               else
+                                       s = strcat(s, " (", ftos(ent.healthvalue), ")");
+                       }
+
+                       float width;
+                       width = stringwidth(s, TRUE, '1 1 0' * cvar("hud_shownames_fontsize"));
+
+                       if (width != namewidth)
+                               namepos_x += (namewidth - width) / 2;
+                       drawcolorcodedstring(namepos, s, '1 1 0' * cvar("hud_shownames_fontsize"), a, DRAWFLAG_NORMAL);
+                       drawfontscale = '1 1 0';
+               }
+       }
+}
+
+entity shownames_ent[255];
+void Draw_ShowNames_All()
+{
+       float i;
+       for(i = 0; i < maxclients; ++i)
+       {
+               float t;
+               t = GetPlayerColor(i);
+               if(t == COLOR_SPECTATOR)
+                       continue;
+
+               entity e;
+               e = shownames_ent[i];
+               if(!e)
+               {
+                       e = spawn();
+                       e.classname = "shownames_tag";
+                       e.sv_entnum = i+1;
+                       shownames_ent[i] = e;
+               }
+
+               entity entcs;
+               entcs = entcs_receiver[i];
+               if(entcs)
+               {
+                       e.healthvalue = entcs.healthvalue;
+                       e.armorvalue = entcs.armorvalue;
+                       e.sameteam = 1; /* (teamplay && (t == myteam)); */
+               }
+               else
+               {
+                       e.healthvalue = 2342;
+                       e.armorvalue = 0;
+                       e.sameteam = 0;
+               }
+
+               e.origin = getplayerorigin(i);
+               if(e.origin == GETPLAYERORIGIN_ERROR)
+                       continue;
+
+               Draw_ShowNames(e);
+       }
+}
diff --git a/data/qcsrc/client/shownames.qh b/data/qcsrc/client/shownames.qh
new file mode 100644 (file)
index 0000000..11f1e74
--- /dev/null
@@ -0,0 +1,3 @@
+.float healthvalue;
+.float armorvalue;
+.float sameteam;
diff --git a/data/qcsrc/client/teamplay.qh b/data/qcsrc/client/teamplay.qh
new file mode 100644 (file)
index 0000000..8335990
--- /dev/null
@@ -0,0 +1,2 @@
+float teamplay;
+float myteam;