1 float waypointsprite_initialized;
2 float waypointsprite_fadedistance;
3 float waypointsprite_normdistance;
4 float waypointsprite_minscale;
5 float waypointsprite_minalpha;
6 float waypointsprite_distancealphaexponent;
7 float waypointsprite_timealphaexponent;
8 float waypointsprite_scale;
9 float waypointsprite_fontsize;
10 float waypointsprite_edgefadealpha;
11 float waypointsprite_edgefadescale;
12 float waypointsprite_edgefadedistance;
13 float waypointsprite_edgeoffset_bottom;
14 float waypointsprite_edgeoffset_left;
15 float waypointsprite_edgeoffset_right;
16 float waypointsprite_edgeoffset_top;
17 float waypointsprite_crosshairfadealpha;
18 float waypointsprite_crosshairfadescale;
19 float waypointsprite_crosshairfadedistance;
20 float waypointsprite_distancefadealpha;
21 float waypointsprite_distancefadescale;
22 float waypointsprite_distancefadedistance;
23 float waypointsprite_alpha;
27 .string netname; // primary picture
28 .string netname2; // secondary picture
29 .string netname3; // tertiary picture
30 .float team; // team that gets netname2
38 .float build_starthealth;
39 .float build_finished;
41 const float SPRITE_HEALTHBAR_WIDTH = 144;
42 const float SPRITE_HEALTHBAR_HEIGHT = 9;
43 const float SPRITE_HEALTHBAR_MARGIN = 6;
44 const float SPRITE_HEALTHBAR_BORDER = 2;
45 const float SPRITE_HEALTHBAR_BORDERALPHA = 1;
46 const float SPRITE_HEALTHBAR_HEALTHALPHA = 0.5;
47 const float SPRITE_ARROW_SCALE = 1.0;
48 const float SPRITE_HELPME_BLINK = 2;
50 void drawrotpic(vector org, float rot, string pic, vector sz, vector hotspot, vector rgb, float a, float f)
52 vector v1, v2, v3, v4;
54 hotspot = -1 * hotspot;
56 // hotspot-relative coordinates of the corners
58 v2 = hotspot + '1 0 0' * sz_x;
59 v3 = hotspot + '1 0 0' * sz_x + '0 1 0' * sz_y;
60 v4 = hotspot + '0 1 0' * sz_y;
62 // rotate them, and make them absolute
63 rot = -rot; // rotate by the opposite angle, as our coordinate system is reversed
64 v1 = rotate(v1, rot) + org;
65 v2 = rotate(v2, rot) + org;
66 v3 = rotate(v3, rot) + org;
67 v4 = rotate(v4, rot) + org;
70 R_BeginPolygon(pic, f);
71 R_PolygonVertex(v1, '0 0 0', rgb, a);
72 R_PolygonVertex(v2, '1 0 0', rgb, a);
73 R_PolygonVertex(v3, '1 1 0', rgb, a);
74 R_PolygonVertex(v4, '0 1 0', rgb, a);
78 void drawquad(vector o, vector ri, vector up, string pic, vector rgb, float a, float f)
80 R_BeginPolygon(pic, f);
81 R_PolygonVertex(o, '0 0 0', rgb, a);
82 R_PolygonVertex(o + ri, '1 0 0', rgb, a);
83 R_PolygonVertex(o + up + ri, '1 1 0', rgb, a);
84 R_PolygonVertex(o + up, '0 1 0', rgb, a);
88 void drawhealthbar(vector org, float rot, float h, vector sz, vector hotspot, float width, float height, float margin, float border, float align, vector rgb, float a, vector hrgb, float ha, float f)
91 float owidth; // outer width
93 hotspot = -1 * hotspot;
95 // hotspot-relative coordinates of the healthbar corners
100 rot = -rot; // rotate by the opposite angle, as our coordinate system is reversed
101 o = rotate(o, rot) + org;
102 ri = rotate(ri, rot);
103 up = rotate(up, rot);
105 owidth = width + 2 * border;
106 o = o - up * (margin + border + height) + ri * (sz_x - owidth) * 0.5;
108 drawquad(o - up * border, ri * owidth, up * border, "", rgb, a, f);
109 drawquad(o + up * height, ri * owidth, up * border, "", rgb, a, f);
110 drawquad(o, ri * border, up * height, "", rgb, a, f);
111 drawquad(o + ri * (owidth - border), ri * border, up * height, "", rgb, a, f);
112 drawquad(o + ri * (border + align * ((1 - h) * width)), ri * width * h, up * height, "", hrgb, ha, f);
115 // returns location of sprite text
116 vector drawspritearrow(vector o, float ang, vector rgb, float a, float t)
119 float BORDER; BORDER = 1.5 * t;
120 float TSIZE; TSIZE = 8 * t;
121 float RLENGTH; RLENGTH = 8 * t;
122 float RWIDTH; RWIDTH = 4 * t;
123 float MLENGTH; MLENGTH = 4 * t;
125 R_BeginPolygon("", DRAWFLAG_NORMAL);
126 R_PolygonVertex(o + rotate(eX * -(TSIZE + BORDER * (1 + SQRT2)) + eY * (TSIZE + BORDER), ang), '0 0 0', '0 0 0', a);
127 R_PolygonVertex(o + rotate(eX * (TSIZE + BORDER * (1 + SQRT2)) + eY * (TSIZE + BORDER), ang), '0 0 0', '0 0 0', a);
128 R_PolygonVertex(o + rotate(eY * -( BORDER * SQRT2), ang), '0 0 0', '0 0 0', a);
130 R_BeginPolygon("", DRAWFLAG_NORMAL);
131 R_PolygonVertex(o + rotate(eX * -(RWIDTH + BORDER) + eY * (TSIZE + BORDER), ang), '0 0 0', '0 0 0', a);
132 R_PolygonVertex(o + rotate(eX * -(RWIDTH + BORDER) + eY * (TSIZE + RLENGTH + BORDER), ang), '0 0 0', '0 0 0', a);
133 R_PolygonVertex(o + rotate(eX * (RWIDTH + BORDER) + eY * (TSIZE + RLENGTH + BORDER), ang), '0 0 0', '0 0 0', a);
134 R_PolygonVertex(o + rotate(eX * (RWIDTH + BORDER) + eY * (TSIZE + BORDER), ang), '0 0 0', '0 0 0', a);
137 R_BeginPolygon("", DRAWFLAG_ADDITIVE);
138 R_PolygonVertex(o + rotate(eX * -TSIZE + eY * TSIZE, ang), '0 0 0', rgb, a);
139 R_PolygonVertex(o + rotate(eX * TSIZE + eY * TSIZE, ang), '0 0 0', rgb, a);
140 R_PolygonVertex(o + rotate('0 0 0', ang), '0 0 0', rgb, a);
142 R_BeginPolygon("", DRAWFLAG_ADDITIVE);
143 R_PolygonVertex(o + rotate(eX * -RWIDTH + eY * TSIZE, ang), '0 0 0', rgb, a);
144 R_PolygonVertex(o + rotate(eX * -RWIDTH + eY * (TSIZE + RLENGTH), ang), '0 0 0', rgb, a);
145 R_PolygonVertex(o + rotate(eX * RWIDTH + eY * (TSIZE + RLENGTH), ang), '0 0 0', rgb, a);
146 R_PolygonVertex(o + rotate(eX * RWIDTH + eY * TSIZE, ang), '0 0 0', rgb, a);
150 o + rotate(eY * (TSIZE + RLENGTH + MLENGTH), ang);
153 // returns location of sprite healthbar
154 vector drawspritetext(vector o, float ang, float minwidth, vector rgb, float a, vector fontsize, string s)
158 float aspect, sa, ca;
160 sw = stringwidth(s, FALSE, fontsize);
167 // how do corners work?
168 aspect = vid_conwidth / vid_conheight;
170 ca = cos(ang) * aspect;
171 if(fabs(sa) > fabs(ca))
174 algny = 0.5 - 0.5 * ca / fabs(sa);
178 algnx = 0.5 - 0.5 * sa / fabs(ca);
186 // we want to be onscreen
191 if(o_x > vid_conwidth - w)
192 o_x = vid_conwidth - w;
193 if(o_y > vid_conheight - h)
194 o_x = vid_conheight - h;
196 o_x += 0.5 * (w - sw);
198 drawstring(o, s, fontsize, rgb, a, DRAWFLAG_NORMAL);
206 float spritelookupblinkvalue(string s)
210 case "ons-cp-atck-neut": return 2;
211 case "ons-cp-atck-red": return 2;
212 case "ons-cp-atck-blue": return 2;
213 case "ons-cp-dfnd-red": return 0.5;
214 case "ons-cp-dfnd-blue": return 0.5;
215 case "item-invis": return 2;
216 case "item-extralife": return 2;
217 case "item-speed": return 2;
218 case "item-strength": return 2;
219 case "item-shield": return 2;
220 case "item-fuelregen": return 2;
221 case "item-jetpack": return 2;
222 case "tagged-target": return 2;
226 vector spritelookupcolor(string s, vector def)
230 case "keycarrier-friend": return '0 1 0';
231 case "wpn-laser": return '1 0.5 0.5';
232 case "wpn-shotgun": return '0.5 0.25 0';
233 case "wpn-uzi": return '1 1 0';
234 case "wpn-gl": return '1 0 0';
235 case "wpn-electro": return '0 0.5 1';
236 case "wpn-crylink": return '1 0.5 1';
237 case "wpn-nex": return '0.5 1 1';
238 case "wpn-hagar": return '1 1 0.5';
239 case "wpn-rl": return '1 1 0';
240 case "wpn-porto": return '0.5 0.5 0.5';
241 case "wpn-minstanex": return '0.5 1 1';
242 case "wpn-hookgun": return '0 0.5 0';
243 case "wpn-fireball": return '1 0.5 0';
244 case "wpn-hlac": return '0 1 0';
245 case "wpn-campingrifle": return '0.5 1 0';
246 case "wpn-minelayer": return '0.75 1 0';
250 string spritelookuptext(string s)
254 case "as-push": return _("Push");
255 case "as-destroy": return _("Destroy");
256 case "as-defend": return _("Defend");
257 case "bluebase": return _("Blue base");
258 case "danger": return _("DANGER");
259 case "enemyflagcarrier": return _("Enemy carrier");
260 case "flagcarrier": return _("Flag carrier");
261 case "flagdropped": return _("Dropped flag");
262 case "helpme": return _("Help me!");
263 case "here": return _("Here");
264 case "key-dropped": return _("Dropped key");
265 case "keycarrier-blue": return _("Key carrier");
266 case "keycarrier-finish": return _("Run here");
267 case "keycarrier-friend": return _("Key carrier");
268 case "keycarrier-pink": return _("Key carrier");
269 case "keycarrier-red": return _("Key carrier");
270 case "keycarrier-yellow": return _("Key carrier");
271 case "redbase": return _("Red base");
272 case "waypoint": return _("Waypoint");
273 case "ons-gen-red": return _("Generator");
274 case "ons-gen-blue": return _("Generator");
275 case "ons-gen-shielded": return _("Generator");
276 case "ons-cp-neut": return _("Control point");
277 case "ons-cp-red": return _("Control point");
278 case "ons-cp-blue": return _("Control point");
279 case "ons-cp-atck-neut": return _("Control point");
280 case "ons-cp-atck-red": return _("Control point");
281 case "ons-cp-atck-blue": return _("Control point");
282 case "ons-cp-dfnd-red": return _("Control point");
283 case "ons-cp-dfnd-blue": return _("Control point");
284 case "race-checkpoint": return _("Checkpoint");
285 case "race-finish": return _("Finish");
286 case "race-start": return _("Start");
287 case "race-start-finish": return (race_checkpointtime || race_mycheckpointtime) ? _("Finish") : _("Start");
288 case "nb-ball": return _("Ball");
289 case "ka-ball": return _("Ball");
290 case "ka-ballcarrier": return _("Ball carrier");
291 case "wpn-laser": return _("Laser");
292 case "wpn-shotgun": return _("Shotgun");
293 case "wpn-uzi": return _("Machine Gun");
294 case "wpn-gl": return _("Mortar");
295 case "wpn-electro": return _("Electro");
296 case "wpn-crylink": return _("Crylink");
297 case "wpn-nex": return _("Nex");
298 case "wpn-hagar": return _("Hagar");
299 case "wpn-rl": return _("Rocket Launcher");
300 case "wpn-porto": return _("Port-O-Launch");
301 case "wpn-minstanex": return _("Minstanex");
302 case "wpn-hookgun": return _("Hook");
303 case "wpn-fireball": return _("Fireball");
304 case "wpn-hlac": return _("HLAC");
305 case "wpn-campingrifle": return _("Rifle");
306 case "wpn-minelayer": return _("Mine Layer");
307 case "dom-neut": return _("Control point");
308 case "dom-red": return _("Control point");
309 case "dom-blue": return _("Control point");
310 case "dom-yellow": return _("Control point");
311 case "dom-pink": return _("Control point");
312 case "item-invis": return _("Invisibility");
313 case "item-extralife": return _("Extra life");
314 case "item-speed": return _("Speed");
315 case "item-strength": return _("Strength");
316 case "item-shield": return _("Shield");
317 case "item-fuelregen": return _("Fuel regen");
318 case "item-jetpack": return _("Jet Pack");
319 case "freezetag_frozen": return _("Frozen!");
320 case "tagged-target": return _("Tagged");
321 case "vehicle": return _("Vehicle");
322 case "intruder": return _("Intruder!");
327 vector fixrgbexcess_move(vector rgb, vector src, vector dst)
329 vector yvec = '0.299 0.587 0.114';
330 return rgb + dst * ((src * yvec) / (dst * yvec)) * ((rgb - '1 1 1') * src);
332 vector fixrgbexcess(vector rgb)
336 rgb = fixrgbexcess_move(rgb, '1 0 0', '0 1 1');
339 rgb = fixrgbexcess_move(rgb, '0 1 0', '0 0 1');
345 rgb = fixrgbexcess_move(rgb, '0 0 1', '0 1 0');
352 rgb = fixrgbexcess_move(rgb, '0 1 0', '1 0 1');
355 rgb = fixrgbexcess_move(rgb, '1 0 0', '0 0 1');
361 rgb = fixrgbexcess_move(rgb, '0 0 1', '1 0 0');
368 rgb = fixrgbexcess_move(rgb, '0 0 1', '1 1 0');
371 rgb = fixrgbexcess_move(rgb, '1 0 0', '0 1 0');
377 rgb = fixrgbexcess_move(rgb, '0 1 0', '1 0 0');
385 float waypointsprite_count, waypointsprite_newcount;
386 void Draw_WaypointSprite()
392 self.alpha = pow(bound(0, (self.fadetime - time) / self.lifetime, 1), waypointsprite_timealphaexponent);
396 if(self.hideflags & 2)
397 return; // radar only
399 if(autocvar_cl_hidewaypoints >= 2)
402 if(self.hideflags & 1)
403 if(autocvar_cl_hidewaypoints)
404 return; // fixed waypoint
406 InterpolateOrigin_Do();
408 t = GetPlayerColor(player_localnum) + 1;
415 case SPRITERULE_DEFAULT:
419 spriteimage = self.netname;
424 spriteimage = self.netname;
426 case SPRITERULE_TEAMPLAY:
427 if(t == NUM_SPECTATOR + 1)
428 spriteimage = self.netname3;
429 else if(self.team == t)
430 spriteimage = self.netname2;
432 spriteimage = self.netname;
435 error("Invalid waypointsprite rule!");
439 if(spriteimage == "")
442 ++waypointsprite_newcount;
445 dist = vlen(self.origin - view_origin);
448 a = self.alpha * autocvar_hud_panel_fg_alpha;
450 if(self.maxdistance > waypointsprite_normdistance)
451 a *= pow(bound(0, (self.maxdistance - dist) / (self.maxdistance - waypointsprite_normdistance), 1), waypointsprite_distancealphaexponent);
452 else if(self.maxdistance > 0)
453 a *= pow(bound(0, (waypointsprite_fadedistance - dist) / (waypointsprite_fadedistance - waypointsprite_normdistance), 1), waypointsprite_distancealphaexponent) * (1 - waypointsprite_minalpha) + waypointsprite_minalpha;
456 rgb = self.teamradar_color;
457 rgb = spritelookupcolor(spriteimage, rgb);
460 self.teamradar_color = '1 0 1';
461 print(sprintf("WARNING: sprite of name %s has no color, using pink so you notice it\n", spriteimage));
464 if(time - floor(time) > 0.5)
466 if(self.helpme && time < self.helpme)
467 a *= SPRITE_HELPME_BLINK;
469 a *= spritelookupblinkvalue(spriteimage);
481 rgb = fixrgbexcess(rgb);
486 o = project_3d_to_2d(self.origin);
488 || o_x < (vid_conwidth * waypointsprite_edgeoffset_left)
489 || o_y < (vid_conheight * waypointsprite_edgeoffset_top)
490 || o_x > (vid_conwidth - (vid_conwidth * waypointsprite_edgeoffset_right))
491 || o_y > (vid_conheight - (vid_conheight * waypointsprite_edgeoffset_bottom)))
493 // scale it to be just in view
497 d = o - '0.5 0 0' * vid_conwidth - '0 0.5 0' * vid_conheight;
498 ang = atan2(-d_x, -d_y);
502 f1 = d_x / vid_conwidth;
503 f2 = d_y / vid_conheight;
505 if(max(f1, -f1) > max(f2, -f2))
510 d = d * ((0.5 - waypointsprite_edgeoffset_right) / f1);
515 d = d * (-(0.5 - waypointsprite_edgeoffset_left) / f1);
523 d = d * ((0.5 - waypointsprite_edgeoffset_bottom) / f2);
528 d = d * (-(0.5 - waypointsprite_edgeoffset_top) / f2);
532 o = d + '0.5 0 0' * vid_conwidth + '0 0.5 0' * vid_conheight;
540 d = o - '0.5 0 0' * vid_conwidth - '0 0.5 0' * vid_conheight;
541 ang = atan2(-d_x, -d_y);
546 float edgedistance_min, crosshairdistance;
547 edgedistance_min = min((o_y - (vid_conheight * waypointsprite_edgeoffset_top)),
548 (o_x - (vid_conwidth * waypointsprite_edgeoffset_left)),
549 (vid_conwidth - (vid_conwidth * waypointsprite_edgeoffset_right)) - o_x,
550 (vid_conheight - (vid_conheight * waypointsprite_edgeoffset_bottom)) - o_y);
553 vidscale = max(vid_conwidth / vid_width, vid_conheight / vid_height);
555 crosshairdistance = sqrt( pow(o_x - vid_conwidth/2, 2) + pow(o_y - vid_conheight/2, 2) );
557 t = waypointsprite_scale * vidscale;
558 a *= waypointsprite_alpha;
561 a = a * (1 - (1 - waypointsprite_distancefadealpha) * (bound(0, dist/waypointsprite_distancefadedistance, 1)));
562 t = t * (1 - (1 - waypointsprite_distancefadescale) * (bound(0, dist/waypointsprite_distancefadedistance, 1)));
564 if (edgedistance_min < waypointsprite_edgefadedistance) {
565 a = a * (1 - (1 - waypointsprite_edgefadealpha) * (1 - bound(0, edgedistance_min/waypointsprite_edgefadedistance, 1)));
566 t = t * (1 - (1 - waypointsprite_edgefadescale) * (1 - bound(0, edgedistance_min/waypointsprite_edgefadedistance, 1)));
568 if(crosshairdistance < waypointsprite_crosshairfadedistance) {
569 a = a * (1 - (1 - waypointsprite_crosshairfadealpha) * (1 - bound(0, crosshairdistance/waypointsprite_crosshairfadedistance, 1)));
570 t = t * (1 - (1 - waypointsprite_crosshairfadescale) * (1 - bound(0, crosshairdistance/waypointsprite_crosshairfadedistance, 1)));
573 if(self.build_finished)
575 if(time < self.build_finished + 0.25)
577 if(time < self.build_started)
578 self.health = self.build_starthealth;
579 else if(time < self.build_finished)
580 self.health = (time - self.build_started) / (self.build_finished - self.build_started) * (1 - self.build_starthealth) + self.build_starthealth;
588 o = drawspritearrow(o, ang, rgb, a, SPRITE_ARROW_SCALE * t);
591 if(autocvar_g_waypointsprite_spam && waypointsprite_count >= autocvar_g_waypointsprite_spam)
594 txt = spritelookuptext(spriteimage);
595 if(self.helpme && time < self.helpme)
596 txt = sprintf(_("%s needing help!"), txt);
597 if(autocvar_g_waypointsprite_uppercase)
598 txt = strtoupper(txt);
600 draw_beginBoldFont();
603 o = drawspritetext(o, ang, (SPRITE_HEALTHBAR_WIDTH + 2 * SPRITE_HEALTHBAR_BORDER) * t, rgb, a, waypointsprite_fontsize * '1 1 0', txt);
606 if(self.build_finished)
611 marg = -(SPRITE_HEALTHBAR_MARGIN + SPRITE_HEALTHBAR_HEIGHT + 2 * SPRITE_HEALTHBAR_BORDER) * t - 0.5 * waypointsprite_fontsize;
613 marg = SPRITE_HEALTHBAR_MARGIN * t + 0.5 * waypointsprite_fontsize;
620 SPRITE_HEALTHBAR_WIDTH * t,
621 SPRITE_HEALTHBAR_HEIGHT * t,
623 SPRITE_HEALTHBAR_BORDER * t,
626 a * SPRITE_HEALTHBAR_BORDERALPHA,
628 a * SPRITE_HEALTHBAR_HEALTHALPHA,
634 o = drawspritetext(o, ang, 0, rgb, a, waypointsprite_fontsize * '1 1 0', txt);
639 void Ent_RemoveWaypointSprite()
642 strunzone(self.netname);
644 strunzone(self.netname2);
646 strunzone(self.netname3);
649 void Ent_WaypointSprite()
651 float sendflags, f, t;
652 sendflags = ReadByte();
655 self.spawntime = time;
657 self.draw2d = Draw_WaypointSprite;
659 InterpolateOrigin_Undo();
660 self.iflags |= IFLAG_ORIGIN;
667 self.health = t / 191.0;
668 self.build_finished = 0;
672 t = (t - 192) * 256 + ReadByte();
673 self.build_started = servertime;
674 if(self.build_finished)
675 self.build_starthealth = bound(0, self.health, 1);
677 self.build_starthealth = 0;
678 self.build_finished = servertime + t / 32;
684 self.build_finished = 0;
689 // unfortunately, this needs to be exact (for the 3D display)
690 self.origin_x = ReadCoord();
691 self.origin_y = ReadCoord();
692 self.origin_z = ReadCoord();
693 setorigin(self, self.origin);
698 self.team = ReadByte();
699 self.rule = ReadByte();
705 strunzone(self.netname);
706 self.netname = strzone(ReadString());
712 strunzone(self.netname2);
713 self.netname2 = strzone(ReadString());
719 strunzone(self.netname3);
720 self.netname3 = strzone(ReadString());
725 self.lifetime = ReadCoord();
726 self.fadetime = ReadCoord();
727 self.maxdistance = ReadShort();
728 self.hideflags = ReadByte();
734 self.teamradar_icon = (f & 0x7F);
737 self.(teamradar_times[self.teamradar_time_index]) = time;
738 self.teamradar_time_index = mod(self.teamradar_time_index + 1, MAX_TEAMRADAR_TIMES);
740 self.teamradar_color_x = ReadByte() / 255.0;
741 self.teamradar_color_y = ReadByte() / 255.0;
742 self.teamradar_color_z = ReadByte() / 255.0;
743 self.helpme = ReadByte() * 0.1;
745 self.helpme += servertime;
748 InterpolateOrigin_Note();
750 self.entremove = Ent_RemoveWaypointSprite;
753 void WaypointSprite_Load_Frames(string ext)
755 float dh, n, i, o, f;
756 string s, sname, sframes;
757 dh = search_begin(strcat("models/sprites/*_frame*", ext), FALSE, FALSE);
760 float ext_len = strlen(ext);
761 n = search_getsize(dh);
762 for(i = 0; i < n; ++i)
764 s = search_getfilename(dh, i);
765 s = substring(s, 15, strlen(s) - 15 - ext_len); // strip models/sprites/ and extension
767 o = strstrofs(s, "_frame", 0);
768 sname = strcat("/spriteframes/", substring(s, 0, o));
769 sframes = substring(s, o + 6, strlen(s) - o - 6);
770 f = stof(sframes) + 1;
771 db_put(tempdb, sname, ftos(max(f, stof(db_get(tempdb, sname)))));
776 void WaypointSprite_Load()
778 waypointsprite_fadedistance = vlen(mi_scale);
779 waypointsprite_normdistance = autocvar_g_waypointsprite_normdistance;
780 waypointsprite_minscale = autocvar_g_waypointsprite_minscale;
781 waypointsprite_minalpha = autocvar_g_waypointsprite_minalpha;
782 waypointsprite_distancealphaexponent = autocvar_g_waypointsprite_distancealphaexponent;
783 waypointsprite_timealphaexponent = autocvar_g_waypointsprite_timealphaexponent;
784 waypointsprite_scale = autocvar_g_waypointsprite_scale;
785 waypointsprite_fontsize = autocvar_g_waypointsprite_fontsize;
786 waypointsprite_edgefadealpha = autocvar_g_waypointsprite_edgefadealpha;
787 waypointsprite_edgefadescale = autocvar_g_waypointsprite_edgefadescale;
788 waypointsprite_edgefadedistance = autocvar_g_waypointsprite_edgefadedistance;
789 waypointsprite_edgeoffset_bottom = autocvar_g_waypointsprite_edgeoffset_bottom;
790 waypointsprite_edgeoffset_left = autocvar_g_waypointsprite_edgeoffset_left;
791 waypointsprite_edgeoffset_right = autocvar_g_waypointsprite_edgeoffset_right;
792 waypointsprite_edgeoffset_top = autocvar_g_waypointsprite_edgeoffset_top;
793 waypointsprite_crosshairfadealpha = autocvar_g_waypointsprite_crosshairfadealpha;
794 waypointsprite_crosshairfadescale = autocvar_g_waypointsprite_crosshairfadescale;
795 waypointsprite_crosshairfadedistance = autocvar_g_waypointsprite_crosshairfadedistance;
796 waypointsprite_distancefadealpha = autocvar_g_waypointsprite_distancefadealpha;
797 waypointsprite_distancefadescale = autocvar_g_waypointsprite_distancefadescale;
798 waypointsprite_distancefadedistance = waypointsprite_fadedistance * autocvar_g_waypointsprite_distancefadedistancemultiplier;
799 waypointsprite_alpha = autocvar_g_waypointsprite_alpha * (1 - autocvar__menu_alpha);
801 if(!waypointsprite_initialized)
803 WaypointSprite_Load_Frames(".tga");
804 WaypointSprite_Load_Frames(".jpg");
805 waypointsprite_initialized = true;
808 waypointsprite_count = waypointsprite_newcount;
809 waypointsprite_newcount = 0;