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 float SPRITE_HEALTHBAR_WIDTH = 144;
42 float SPRITE_HEALTHBAR_HEIGHT = 9;
43 float SPRITE_HEALTHBAR_MARGIN = 6;
44 float SPRITE_HEALTHBAR_BORDER = 2;
45 float SPRITE_HEALTHBAR_BORDERALPHA = 1;
46 float SPRITE_HEALTHBAR_HEALTHALPHA = 0.5;
47 float SPRITE_ARROW_SCALE = 1.0;
48 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 "flagcarrier": return _("Flag carrier");
260 case "flagdropped": return _("Dropped flag");
261 case "helpme": return _("Help me!");
262 case "here": return _("Here");
263 case "key-dropped": return _("Dropped key");
264 case "keycarrier-blue": return _("Key carrier");
265 case "keycarrier-finish": return _("Run here");
266 case "keycarrier-friend": return _("Key carrier");
267 case "keycarrier-pink": return _("Key carrier");
268 case "keycarrier-red": return _("Key carrier");
269 case "keycarrier-yellow": return _("Key carrier");
270 case "redbase": return _("Red base");
271 case "waypoint": return _("Waypoint");
272 case "ons-gen-red": return _("Generator");
273 case "ons-gen-blue": return _("Generator");
274 case "ons-gen-shielded": return _("Generator");
275 case "ons-cp-neut": return _("Control point");
276 case "ons-cp-red": return _("Control point");
277 case "ons-cp-blue": return _("Control point");
278 case "ons-cp-atck-neut": return _("Control point");
279 case "ons-cp-atck-red": return _("Control point");
280 case "ons-cp-atck-blue": return _("Control point");
281 case "ons-cp-dfnd-red": return _("Control point");
282 case "ons-cp-dfnd-blue": return _("Control point");
283 case "race-checkpoint": return _("Checkpoint");
284 case "race-finish": return _("Finish");
285 case "race-start": return _("Start");
286 case "race-start-finish": return (race_checkpointtime || race_mycheckpointtime) ? _("Finish") : _("Start");
287 case "nb-ball": return _("Ball");
288 case "ka-ball": return _("Ball");
289 case "ka-ballcarrier": return _("Ball carrier");
290 case "wpn-laser": return _("Laser");
291 case "wpn-shotgun": return _("Shotgun");
292 case "wpn-uzi": return _("Machine Gun");
293 case "wpn-gl": return _("Mortar");
294 case "wpn-electro": return _("Electro");
295 case "wpn-crylink": return _("Crylink");
296 case "wpn-nex": return _("Nex");
297 case "wpn-hagar": return _("Hagar");
298 case "wpn-rl": return _("Rocket Launcher");
299 case "wpn-porto": return _("Port-O-Launch");
300 case "wpn-minstanex": return _("Minstanex");
301 case "wpn-hookgun": return _("Hook");
302 case "wpn-fireball": return _("Fireball");
303 case "wpn-hlac": return _("HLAC");
304 case "wpn-campingrifle": return _("Rifle");
305 case "wpn-minelayer": return _("Mine Layer");
306 case "dom-neut": return _("Control point");
307 case "dom-red": return _("Control point");
308 case "dom-blue": return _("Control point");
309 case "dom-yellow": return _("Control point");
310 case "dom-pink": return _("Control point");
311 case "item-invis": return _("Invisibility");
312 case "item-extralife": return _("Extra life");
313 case "item-speed": return _("Speed");
314 case "item-strength": return _("Strength");
315 case "item-shield": return _("Shield");
316 case "item-fuelregen": return _("Fuel regen");
317 case "item-jetpack": return _("Jet Pack");
318 case "freezetag_frozen": return _("Frozen!");
319 case "tagged-target": return _("Tagged");
320 case "vehicle": return _("Vehicle");
325 vector fixrgbexcess_move(vector rgb, vector src, vector dst)
327 vector yvec = '0.299 0.587 0.114';
328 return rgb + dst * ((src * yvec) / (dst * yvec)) * ((rgb - '1 1 1') * src);
330 vector fixrgbexcess(vector rgb)
334 rgb = fixrgbexcess_move(rgb, '1 0 0', '0 1 1');
337 rgb = fixrgbexcess_move(rgb, '0 1 0', '0 0 1');
343 rgb = fixrgbexcess_move(rgb, '0 0 1', '0 1 0');
350 rgb = fixrgbexcess_move(rgb, '0 1 0', '1 0 1');
353 rgb = fixrgbexcess_move(rgb, '1 0 0', '0 0 1');
359 rgb = fixrgbexcess_move(rgb, '0 0 1', '1 0 0');
366 rgb = fixrgbexcess_move(rgb, '0 0 1', '1 1 0');
369 rgb = fixrgbexcess_move(rgb, '1 0 0', '0 1 0');
375 rgb = fixrgbexcess_move(rgb, '0 1 0', '1 0 0');
383 float waypointsprite_count, waypointsprite_newcount;
384 void Draw_WaypointSprite()
390 self.alpha = pow(bound(0, (self.fadetime - time) / self.lifetime, 1), waypointsprite_timealphaexponent);
394 if(self.hideflags & 2)
395 return; // radar only
397 if(autocvar_cl_hidewaypoints >= 2)
400 if(self.hideflags & 1)
401 if(autocvar_cl_hidewaypoints)
402 return; // fixed waypoint
404 InterpolateOrigin_Do();
406 t = GetPlayerColor(player_localnum) + 1;
413 case SPRITERULE_DEFAULT:
417 spriteimage = self.netname;
422 spriteimage = self.netname;
424 case SPRITERULE_TEAMPLAY:
425 if(t == COLOR_SPECTATOR + 1)
426 spriteimage = self.netname3;
427 else if(self.team == t)
428 spriteimage = self.netname2;
430 spriteimage = self.netname;
433 error("Invalid waypointsprite rule!");
437 if(spriteimage == "")
440 ++waypointsprite_newcount;
443 dist = vlen(self.origin - view_origin);
446 a = self.alpha * autocvar_hud_panel_fg_alpha;
448 if(self.maxdistance > waypointsprite_normdistance)
449 a *= pow(bound(0, (self.maxdistance - dist) / (self.maxdistance - waypointsprite_normdistance), 1), waypointsprite_distancealphaexponent);
450 else if(self.maxdistance > 0)
451 a *= pow(bound(0, (waypointsprite_fadedistance - dist) / (waypointsprite_fadedistance - waypointsprite_normdistance), 1), waypointsprite_distancealphaexponent) * (1 - waypointsprite_minalpha) + waypointsprite_minalpha;
454 rgb = self.teamradar_color;
455 rgb = spritelookupcolor(spriteimage, rgb);
458 self.teamradar_color = '1 0 1';
459 print(sprintf("WARNING: sprite of name %s has no color, using pink so you notice it\n", spriteimage));
462 if(time - floor(time) > 0.5)
464 if(self.helpme && time < self.helpme)
465 a *= SPRITE_HELPME_BLINK;
467 a *= spritelookupblinkvalue(spriteimage);
479 rgb = fixrgbexcess(rgb);
484 o = project_3d_to_2d(self.origin);
486 || o_x < (vid_conwidth * waypointsprite_edgeoffset_left)
487 || o_y < (vid_conheight * waypointsprite_edgeoffset_top)
488 || o_x > (vid_conwidth - (vid_conwidth * waypointsprite_edgeoffset_right))
489 || o_y > (vid_conheight - (vid_conheight * waypointsprite_edgeoffset_bottom)))
491 // scale it to be just in view
495 d = o - '0.5 0 0' * vid_conwidth - '0 0.5 0' * vid_conheight;
496 ang = atan2(-d_x, -d_y);
500 f1 = d_x / vid_conwidth;
501 f2 = d_y / vid_conheight;
503 if(max(f1, -f1) > max(f2, -f2))
508 d = d * ((0.5 - waypointsprite_edgeoffset_right) / f1);
513 d = d * (-(0.5 - waypointsprite_edgeoffset_left) / f1);
521 d = d * ((0.5 - waypointsprite_edgeoffset_bottom) / f2);
526 d = d * (-(0.5 - waypointsprite_edgeoffset_top) / f2);
530 o = d + '0.5 0 0' * vid_conwidth + '0 0.5 0' * vid_conheight;
538 d = o - '0.5 0 0' * vid_conwidth - '0 0.5 0' * vid_conheight;
539 ang = atan2(-d_x, -d_y);
544 float edgedistance_min, crosshairdistance;
545 edgedistance_min = min((o_y - (vid_conheight * waypointsprite_edgeoffset_top)),
546 (o_x - (vid_conwidth * waypointsprite_edgeoffset_left)),
547 (vid_conwidth - (vid_conwidth * waypointsprite_edgeoffset_right)) - o_x,
548 (vid_conheight - (vid_conheight * waypointsprite_edgeoffset_bottom)) - o_y);
551 vidscale = max(vid_conwidth / vid_width, vid_conheight / vid_height);
553 crosshairdistance = sqrt( pow(o_x - vid_conwidth/2, 2) + pow(o_y - vid_conheight/2, 2) );
555 t = waypointsprite_scale * vidscale;
556 a *= waypointsprite_alpha;
559 a = a * (1 - (1 - waypointsprite_distancefadealpha) * (bound(0, dist/waypointsprite_distancefadedistance, 1)));
560 t = t * (1 - (1 - waypointsprite_distancefadescale) * (bound(0, dist/waypointsprite_distancefadedistance, 1)));
562 if (edgedistance_min < waypointsprite_edgefadedistance) {
563 a = a * (1 - (1 - waypointsprite_edgefadealpha) * (1 - bound(0, edgedistance_min/waypointsprite_edgefadedistance, 1)));
564 t = t * (1 - (1 - waypointsprite_edgefadescale) * (1 - bound(0, edgedistance_min/waypointsprite_edgefadedistance, 1)));
566 if(crosshairdistance < waypointsprite_crosshairfadedistance) {
567 a = a * (1 - (1 - waypointsprite_crosshairfadealpha) * (1 - bound(0, crosshairdistance/waypointsprite_crosshairfadedistance, 1)));
568 t = t * (1 - (1 - waypointsprite_crosshairfadescale) * (1 - bound(0, crosshairdistance/waypointsprite_crosshairfadedistance, 1)));
571 if(self.build_finished)
573 if(time < self.build_finished + 0.25)
575 if(time < self.build_started)
576 self.health = self.build_starthealth;
577 else if(time < self.build_finished)
578 self.health = (time - self.build_started) / (self.build_finished - self.build_started) * (1 - self.build_starthealth) + self.build_starthealth;
586 o = drawspritearrow(o, ang, rgb, a, SPRITE_ARROW_SCALE * t);
589 if(autocvar_g_waypointsprite_spam && waypointsprite_count >= autocvar_g_waypointsprite_spam)
592 txt = spritelookuptext(spriteimage);
593 if(self.helpme && time < self.helpme)
594 txt = sprintf(_("%s needing help!"), txt);
595 if(autocvar_g_waypointsprite_uppercase)
596 txt = strtoupper(txt);
598 draw_beginBoldFont();
601 o = drawspritetext(o, ang, (SPRITE_HEALTHBAR_WIDTH + 2 * SPRITE_HEALTHBAR_BORDER) * t, rgb, a, waypointsprite_fontsize * '1 1 0', txt);
604 if(self.build_finished)
609 marg = -(SPRITE_HEALTHBAR_MARGIN + SPRITE_HEALTHBAR_HEIGHT + 2 * SPRITE_HEALTHBAR_BORDER) * t - 0.5 * waypointsprite_fontsize;
611 marg = SPRITE_HEALTHBAR_MARGIN * t + 0.5 * waypointsprite_fontsize;
618 SPRITE_HEALTHBAR_WIDTH * t,
619 SPRITE_HEALTHBAR_HEIGHT * t,
621 SPRITE_HEALTHBAR_BORDER * t,
624 a * SPRITE_HEALTHBAR_BORDERALPHA,
626 a * SPRITE_HEALTHBAR_HEALTHALPHA,
632 o = drawspritetext(o, ang, 0, rgb, a, waypointsprite_fontsize * '1 1 0', txt);
637 void Ent_RemoveWaypointSprite()
640 strunzone(self.netname);
642 strunzone(self.netname2);
644 strunzone(self.netname3);
647 void Ent_WaypointSprite()
649 float sendflags, f, t;
650 sendflags = ReadByte();
653 self.spawntime = time;
655 self.draw2d = Draw_WaypointSprite;
657 InterpolateOrigin_Undo();
664 self.health = t / 191.0;
665 self.build_finished = 0;
669 t = (t - 192) * 256 + ReadByte();
670 self.build_started = servertime;
671 if(self.build_finished)
672 self.build_starthealth = bound(0, self.health, 1);
674 self.build_starthealth = 0;
675 self.build_finished = servertime + t / 32;
681 self.build_finished = 0;
686 // unfortunately, this needs to be exact (for the 3D display)
687 self.origin_x = ReadCoord();
688 self.origin_y = ReadCoord();
689 self.origin_z = ReadCoord();
694 self.team = ReadByte();
695 self.rule = ReadByte();
701 strunzone(self.netname);
702 self.netname = strzone(ReadString());
708 strunzone(self.netname2);
709 self.netname2 = strzone(ReadString());
715 strunzone(self.netname3);
716 self.netname3 = strzone(ReadString());
721 self.lifetime = ReadCoord();
722 self.fadetime = ReadCoord();
723 self.maxdistance = ReadShort();
724 self.hideflags = ReadByte();
730 self.teamradar_icon = (f & 0x7F);
733 self.(teamradar_times[self.teamradar_time_index]) = time;
734 self.teamradar_time_index = mod(self.teamradar_time_index + 1, MAX_TEAMRADAR_TIMES);
736 self.teamradar_color_x = ReadByte() / 255.0;
737 self.teamradar_color_y = ReadByte() / 255.0;
738 self.teamradar_color_z = ReadByte() / 255.0;
739 self.helpme = ReadByte() * 0.1;
741 self.helpme += servertime;
744 InterpolateOrigin_Note();
746 self.entremove = Ent_RemoveWaypointSprite;
749 void WaypointSprite_Load_Frames(string ext)
751 float dh, n, i, o, f;
752 string s, sname, sframes;
753 dh = search_begin(strcat("models/sprites/*_frame*", ext), FALSE, FALSE);
756 float ext_len = strlen(ext);
757 n = search_getsize(dh);
758 for(i = 0; i < n; ++i)
760 s = search_getfilename(dh, i);
761 s = substring(s, 15, strlen(s) - 15 - ext_len); // strip models/sprites/ and extension
763 o = strstrofs(s, "_frame", 0);
764 sname = strcat("/spriteframes/", substring(s, 0, o));
765 sframes = substring(s, o + 6, strlen(s) - o - 6);
766 f = stof(sframes) + 1;
767 db_put(tempdb, sname, ftos(max(f, stof(db_get(tempdb, sname)))));
772 void WaypointSprite_Load()
774 waypointsprite_fadedistance = vlen(mi_scale);
775 waypointsprite_normdistance = autocvar_g_waypointsprite_normdistance;
776 waypointsprite_minscale = autocvar_g_waypointsprite_minscale;
777 waypointsprite_minalpha = autocvar_g_waypointsprite_minalpha;
778 waypointsprite_distancealphaexponent = autocvar_g_waypointsprite_distancealphaexponent;
779 waypointsprite_timealphaexponent = autocvar_g_waypointsprite_timealphaexponent;
780 waypointsprite_scale = autocvar_g_waypointsprite_scale;
781 waypointsprite_fontsize = autocvar_g_waypointsprite_fontsize;
782 waypointsprite_edgefadealpha = autocvar_g_waypointsprite_edgefadealpha;
783 waypointsprite_edgefadescale = autocvar_g_waypointsprite_edgefadescale;
784 waypointsprite_edgefadedistance = autocvar_g_waypointsprite_edgefadedistance;
785 waypointsprite_edgeoffset_bottom = autocvar_g_waypointsprite_edgeoffset_bottom;
786 waypointsprite_edgeoffset_left = autocvar_g_waypointsprite_edgeoffset_left;
787 waypointsprite_edgeoffset_right = autocvar_g_waypointsprite_edgeoffset_right;
788 waypointsprite_edgeoffset_top = autocvar_g_waypointsprite_edgeoffset_top;
789 waypointsprite_crosshairfadealpha = autocvar_g_waypointsprite_crosshairfadealpha;
790 waypointsprite_crosshairfadescale = autocvar_g_waypointsprite_crosshairfadescale;
791 waypointsprite_crosshairfadedistance = autocvar_g_waypointsprite_crosshairfadedistance;
792 waypointsprite_distancefadealpha = autocvar_g_waypointsprite_distancefadealpha;
793 waypointsprite_distancefadescale = autocvar_g_waypointsprite_distancefadescale;
794 waypointsprite_distancefadedistance = waypointsprite_fadedistance * autocvar_g_waypointsprite_distancefadedistancemultiplier;
795 waypointsprite_alpha = autocvar_g_waypointsprite_alpha * (1 - autocvar__menu_alpha);
797 if(!waypointsprite_initialized)
799 WaypointSprite_Load_Frames(".tga");
800 WaypointSprite_Load_Frames(".jpg");
801 waypointsprite_initialized = true;
804 waypointsprite_count = waypointsprite_newcount;
805 waypointsprite_newcount = 0;