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_health_mega": return 2;
216 case "item_armor_large": return 2;
217 case "item-invis": return 2;
218 case "item-extralife": return 2;
219 case "item-speed": return 2;
220 case "item-strength": return 2;
221 case "item-shield": return 2;
222 case "item-fuelregen": return 2;
223 case "item-jetpack": return 2;
224 case "wpn-fireball": return 2; // superweapon
225 case "wpn-minstanex": return 2; // superweapon
226 case "wpn-porto": return 2; // superweapon
227 case "tagged-target": return 2;
231 vector spritelookupcolor(string s, vector def)
235 case "keycarrier-friend": return '0 1 0';
236 case "wpn-laser": return '1 0.5 0.5';
237 case "wpn-shotgun": return '0.5 0.25 0';
238 case "wpn-uzi": return '1 1 0';
239 case "wpn-gl": return '1 0 0';
240 case "wpn-electro": return '0 0.5 1';
241 case "wpn-crylink": return '1 0.5 1';
242 case "wpn-nex": return '0.5 1 1';
243 case "wpn-hagar": return '1 1 0.5';
244 case "wpn-rl": return '1 1 0';
245 case "wpn-porto": return '0.5 0.5 0.5';
246 case "wpn-minstanex": return '0.5 1 1';
247 case "wpn-hookgun": return '0 0.5 0';
248 case "wpn-fireball": return '1 0.5 0';
249 case "wpn-hlac": return '0 1 0';
250 case "wpn-campingrifle": return '0.5 1 0';
251 case "wpn-minelayer": return '0.75 1 0';
255 string spritelookuptext(string s)
259 case "as-push": return _("Push");
260 case "as-destroy": return _("Destroy");
261 case "as-defend": return _("Defend");
262 case "bluebase": return _("Blue base");
263 case "danger": return _("DANGER");
264 case "enemyflagcarrier": return _("Enemy carrier");
265 case "flagcarrier": return _("Flag carrier");
266 case "flagdropped": return _("Dropped flag");
267 case "helpme": return _("Help me!");
268 case "here": return _("Here");
269 case "key-dropped": return _("Dropped key");
270 case "keycarrier-blue": return _("Key carrier");
271 case "keycarrier-finish": return _("Run here");
272 case "keycarrier-friend": return _("Key carrier");
273 case "keycarrier-pink": return _("Key carrier");
274 case "keycarrier-red": return _("Key carrier");
275 case "keycarrier-yellow": return _("Key carrier");
276 case "redbase": return _("Red base");
277 case "waypoint": return _("Waypoint");
278 case "ons-gen-red": return _("Generator");
279 case "ons-gen-blue": return _("Generator");
280 case "ons-gen-shielded": return _("Generator");
281 case "ons-cp-neut": return _("Control point");
282 case "ons-cp-red": return _("Control point");
283 case "ons-cp-blue": return _("Control point");
284 case "ons-cp-atck-neut": return _("Control point");
285 case "ons-cp-atck-red": return _("Control point");
286 case "ons-cp-atck-blue": return _("Control point");
287 case "ons-cp-dfnd-red": return _("Control point");
288 case "ons-cp-dfnd-blue": return _("Control point");
289 case "race-checkpoint": return _("Checkpoint");
290 case "race-finish": return _("Finish");
291 case "race-start": return _("Start");
292 case "race-start-finish": return (race_checkpointtime || race_mycheckpointtime) ? _("Finish") : _("Start");
293 case "nb-ball": return _("Ball");
294 case "ka-ball": return _("Ball");
295 case "ka-ballcarrier": return _("Ball carrier");
296 case "wpn-laser": return _("Laser");
297 case "wpn-shotgun": return _("Shotgun");
298 case "wpn-uzi": return _("Machine Gun");
299 case "wpn-gl": return _("Mortar");
300 case "wpn-electro": return _("Electro");
301 case "wpn-crylink": return _("Crylink");
302 case "wpn-nex": return _("Nex");
303 case "wpn-hagar": return _("Hagar");
304 case "wpn-rl": return _("Rocket Launcher");
305 case "wpn-porto": return _("Port-O-Launch");
306 case "wpn-minstanex": return _("Minstanex");
307 case "wpn-hookgun": return _("Hook");
308 case "wpn-fireball": return _("Fireball");
309 case "wpn-hlac": return _("HLAC");
310 case "wpn-campingrifle": return _("Rifle");
311 case "wpn-minelayer": return _("Mine Layer");
312 case "dom-neut": return _("Control point");
313 case "dom-red": return _("Control point");
314 case "dom-blue": return _("Control point");
315 case "dom-yellow": return _("Control point");
316 case "dom-pink": return _("Control point");
317 case "item_health_mega": return _("Mega health");
318 case "item_armor_large": return _("Large armor");
319 case "item-invis": return _("Invisibility");
320 case "item-extralife": return _("Extra life");
321 case "item-speed": return _("Speed");
322 case "item-strength": return _("Strength");
323 case "item-shield": return _("Shield");
324 case "item-fuelregen": return _("Fuel regenerator");
325 case "item-jetpack": return _("Jet pack");
326 case "freezetag_frozen": return _("Frozen!");
327 case "tagged-target": return _("Tagged");
328 case "vehicle": return _("Vehicle");
333 vector fixrgbexcess_move(vector rgb, vector src, vector dst)
335 vector yvec = '0.299 0.587 0.114';
336 return rgb + dst * ((src * yvec) / (dst * yvec)) * ((rgb - '1 1 1') * src);
338 vector fixrgbexcess(vector rgb)
342 rgb = fixrgbexcess_move(rgb, '1 0 0', '0 1 1');
345 rgb = fixrgbexcess_move(rgb, '0 1 0', '0 0 1');
351 rgb = fixrgbexcess_move(rgb, '0 0 1', '0 1 0');
358 rgb = fixrgbexcess_move(rgb, '0 1 0', '1 0 1');
361 rgb = fixrgbexcess_move(rgb, '1 0 0', '0 0 1');
367 rgb = fixrgbexcess_move(rgb, '0 0 1', '1 0 0');
374 rgb = fixrgbexcess_move(rgb, '0 0 1', '1 1 0');
377 rgb = fixrgbexcess_move(rgb, '1 0 0', '0 1 0');
383 rgb = fixrgbexcess_move(rgb, '0 1 0', '1 0 0');
391 float waypointsprite_count, waypointsprite_newcount;
392 void Draw_WaypointSprite()
398 self.alpha = pow(bound(0, (self.fadetime - time) / self.lifetime, 1), waypointsprite_timealphaexponent);
402 if(self.hideflags & 2)
403 return; // radar only
405 if(autocvar_cl_hidewaypoints >= 2)
408 if(self.hideflags & 1)
409 if(autocvar_cl_hidewaypoints)
410 return; // fixed waypoint
412 InterpolateOrigin_Do();
414 t = GetPlayerColor(player_localnum) + 1;
421 case SPRITERULE_SPECTATOR:
422 if not(autocvar_g_waypointsprite_itemstime == 1 && t == COLOR_SPECTATOR + 1
423 || autocvar_g_waypointsprite_itemstime == 2 && (t == COLOR_SPECTATOR + 1 || warmup_stage))
425 spriteimage = self.netname;
427 case SPRITERULE_DEFAULT:
431 spriteimage = self.netname;
436 spriteimage = self.netname;
438 case SPRITERULE_TEAMPLAY:
439 if(t == COLOR_SPECTATOR + 1)
440 spriteimage = self.netname3;
441 else if(self.team == t)
442 spriteimage = self.netname2;
444 spriteimage = self.netname;
447 error("Invalid waypointsprite rule!");
451 if(spriteimage == "")
454 ++waypointsprite_newcount;
457 dist = vlen(self.origin - view_origin);
460 a = self.alpha * autocvar_hud_panel_fg_alpha;
462 if(self.maxdistance > waypointsprite_normdistance)
463 a *= pow(bound(0, (self.maxdistance - dist) / (self.maxdistance - waypointsprite_normdistance), 1), waypointsprite_distancealphaexponent);
464 else if(self.maxdistance > 0)
465 a *= pow(bound(0, (waypointsprite_fadedistance - dist) / (waypointsprite_fadedistance - waypointsprite_normdistance), 1), waypointsprite_distancealphaexponent) * (1 - waypointsprite_minalpha) + waypointsprite_minalpha;
468 rgb = self.teamradar_color;
469 rgb = spritelookupcolor(spriteimage, rgb);
472 self.teamradar_color = '1 0 1';
473 print(sprintf("WARNING: sprite of name %s has no color, using pink so you notice it\n", spriteimage));
476 if(time - floor(time) > 0.5)
478 if(self.helpme && time < self.helpme)
479 a *= SPRITE_HELPME_BLINK;
481 a *= spritelookupblinkvalue(spriteimage);
493 rgb = fixrgbexcess(rgb);
498 o = project_3d_to_2d(self.origin);
500 || o_x < (vid_conwidth * waypointsprite_edgeoffset_left)
501 || o_y < (vid_conheight * waypointsprite_edgeoffset_top)
502 || o_x > (vid_conwidth - (vid_conwidth * waypointsprite_edgeoffset_right))
503 || o_y > (vid_conheight - (vid_conheight * waypointsprite_edgeoffset_bottom)))
505 // scale it to be just in view
509 d = o - '0.5 0 0' * vid_conwidth - '0 0.5 0' * vid_conheight;
510 ang = atan2(-d_x, -d_y);
514 f1 = d_x / vid_conwidth;
515 f2 = d_y / vid_conheight;
517 if(max(f1, -f1) > max(f2, -f2))
522 d = d * ((0.5 - waypointsprite_edgeoffset_right) / f1);
527 d = d * (-(0.5 - waypointsprite_edgeoffset_left) / f1);
535 d = d * ((0.5 - waypointsprite_edgeoffset_bottom) / f2);
540 d = d * (-(0.5 - waypointsprite_edgeoffset_top) / f2);
544 o = d + '0.5 0 0' * vid_conwidth + '0 0.5 0' * vid_conheight;
552 d = o - '0.5 0 0' * vid_conwidth - '0 0.5 0' * vid_conheight;
553 ang = atan2(-d_x, -d_y);
558 float edgedistance_min, crosshairdistance;
559 edgedistance_min = min((o_y - (vid_conheight * waypointsprite_edgeoffset_top)),
560 (o_x - (vid_conwidth * waypointsprite_edgeoffset_left)),
561 (vid_conwidth - (vid_conwidth * waypointsprite_edgeoffset_right)) - o_x,
562 (vid_conheight - (vid_conheight * waypointsprite_edgeoffset_bottom)) - o_y);
565 vidscale = max(vid_conwidth / vid_width, vid_conheight / vid_height);
567 crosshairdistance = sqrt( pow(o_x - vid_conwidth/2, 2) + pow(o_y - vid_conheight/2, 2) );
569 t = waypointsprite_scale * vidscale;
570 a *= waypointsprite_alpha;
573 a = a * (1 - (1 - waypointsprite_distancefadealpha) * (bound(0, dist/waypointsprite_distancefadedistance, 1)));
574 t = t * (1 - (1 - waypointsprite_distancefadescale) * (bound(0, dist/waypointsprite_distancefadedistance, 1)));
576 if (edgedistance_min < waypointsprite_edgefadedistance) {
577 a = a * (1 - (1 - waypointsprite_edgefadealpha) * (1 - bound(0, edgedistance_min/waypointsprite_edgefadedistance, 1)));
578 t = t * (1 - (1 - waypointsprite_edgefadescale) * (1 - bound(0, edgedistance_min/waypointsprite_edgefadedistance, 1)));
580 if(crosshairdistance < waypointsprite_crosshairfadedistance) {
581 a = a * (1 - (1 - waypointsprite_crosshairfadealpha) * (1 - bound(0, crosshairdistance/waypointsprite_crosshairfadedistance, 1)));
582 t = t * (1 - (1 - waypointsprite_crosshairfadescale) * (1 - bound(0, crosshairdistance/waypointsprite_crosshairfadedistance, 1)));
585 if(self.build_finished)
587 if(time < self.build_finished + 0.25)
589 if(time < self.build_started)
590 self.health = self.build_starthealth;
591 else if(time < self.build_finished)
592 self.health = (time - self.build_started) / (self.build_finished - self.build_started) * (1 - self.build_starthealth) + self.build_starthealth;
600 o = drawspritearrow(o, ang, rgb, a, SPRITE_ARROW_SCALE * t);
603 if(autocvar_g_waypointsprite_spam && waypointsprite_count >= autocvar_g_waypointsprite_spam)
606 txt = spritelookuptext(spriteimage);
607 if(self.helpme && time < self.helpme)
608 txt = sprintf(_("%s needing help!"), txt);
609 if(autocvar_g_waypointsprite_uppercase)
610 txt = strtoupper(txt);
612 draw_beginBoldFont();
615 o = drawspritetext(o, ang, (SPRITE_HEALTHBAR_WIDTH + 2 * SPRITE_HEALTHBAR_BORDER) * t, rgb, a, waypointsprite_fontsize * '1 1 0', txt);
618 if(self.build_finished)
623 marg = -(SPRITE_HEALTHBAR_MARGIN + SPRITE_HEALTHBAR_HEIGHT + 2 * SPRITE_HEALTHBAR_BORDER) * t - 0.5 * waypointsprite_fontsize;
625 marg = SPRITE_HEALTHBAR_MARGIN * t + 0.5 * waypointsprite_fontsize;
632 SPRITE_HEALTHBAR_WIDTH * t,
633 SPRITE_HEALTHBAR_HEIGHT * t,
635 SPRITE_HEALTHBAR_BORDER * t,
638 a * SPRITE_HEALTHBAR_BORDERALPHA,
640 a * SPRITE_HEALTHBAR_HEALTHALPHA,
646 o = drawspritetext(o, ang, 0, rgb, a, waypointsprite_fontsize * '1 1 0', txt);
651 void Ent_RemoveWaypointSprite()
654 strunzone(self.netname);
656 strunzone(self.netname2);
658 strunzone(self.netname3);
661 void Ent_WaypointSprite()
663 float sendflags, f, t;
664 sendflags = ReadByte();
667 self.spawntime = time;
669 self.draw2d = Draw_WaypointSprite;
671 InterpolateOrigin_Undo();
678 self.health = t / 191.0;
679 self.build_finished = 0;
683 t = (t - 192) * 256 + ReadByte();
684 self.build_started = servertime;
685 if(self.build_finished)
686 self.build_starthealth = bound(0, self.health, 1);
688 self.build_starthealth = 0;
689 self.build_finished = servertime + t / 32;
695 self.build_finished = 0;
700 // unfortunately, this needs to be exact (for the 3D display)
701 self.origin_x = ReadCoord();
702 self.origin_y = ReadCoord();
703 self.origin_z = ReadCoord();
708 self.team = ReadByte();
709 self.rule = ReadByte();
715 strunzone(self.netname);
716 self.netname = strzone(ReadString());
722 strunzone(self.netname2);
723 self.netname2 = strzone(ReadString());
729 strunzone(self.netname3);
730 self.netname3 = strzone(ReadString());
735 self.lifetime = ReadCoord();
736 self.fadetime = ReadCoord();
737 self.maxdistance = ReadShort();
738 self.hideflags = ReadByte();
744 self.teamradar_icon = (f & 0x7F);
747 self.(teamradar_times[self.teamradar_time_index]) = time;
748 self.teamradar_time_index = mod(self.teamradar_time_index + 1, MAX_TEAMRADAR_TIMES);
750 self.teamradar_color_x = ReadByte() / 255.0;
751 self.teamradar_color_y = ReadByte() / 255.0;
752 self.teamradar_color_z = ReadByte() / 255.0;
753 self.helpme = ReadByte() * 0.1;
755 self.helpme += servertime;
758 InterpolateOrigin_Note();
760 self.entremove = Ent_RemoveWaypointSprite;
763 void WaypointSprite_Load_Frames(string ext)
765 float dh, n, i, o, f;
766 string s, sname, sframes;
767 dh = search_begin(strcat("models/sprites/*_frame*", ext), FALSE, FALSE);
770 float ext_len = strlen(ext);
771 n = search_getsize(dh);
772 for(i = 0; i < n; ++i)
774 s = search_getfilename(dh, i);
775 s = substring(s, 15, strlen(s) - 15 - ext_len); // strip models/sprites/ and extension
777 o = strstrofs(s, "_frame", 0);
778 sname = strcat("/spriteframes/", substring(s, 0, o));
779 sframes = substring(s, o + 6, strlen(s) - o - 6);
780 f = stof(sframes) + 1;
781 db_put(tempdb, sname, ftos(max(f, stof(db_get(tempdb, sname)))));
786 void WaypointSprite_Load()
788 waypointsprite_fadedistance = vlen(mi_scale);
789 waypointsprite_normdistance = autocvar_g_waypointsprite_normdistance;
790 waypointsprite_minscale = autocvar_g_waypointsprite_minscale;
791 waypointsprite_minalpha = autocvar_g_waypointsprite_minalpha;
792 waypointsprite_distancealphaexponent = autocvar_g_waypointsprite_distancealphaexponent;
793 waypointsprite_timealphaexponent = autocvar_g_waypointsprite_timealphaexponent;
794 waypointsprite_scale = autocvar_g_waypointsprite_scale;
795 waypointsprite_fontsize = autocvar_g_waypointsprite_fontsize;
796 waypointsprite_edgefadealpha = autocvar_g_waypointsprite_edgefadealpha;
797 waypointsprite_edgefadescale = autocvar_g_waypointsprite_edgefadescale;
798 waypointsprite_edgefadedistance = autocvar_g_waypointsprite_edgefadedistance;
799 waypointsprite_edgeoffset_bottom = autocvar_g_waypointsprite_edgeoffset_bottom;
800 waypointsprite_edgeoffset_left = autocvar_g_waypointsprite_edgeoffset_left;
801 waypointsprite_edgeoffset_right = autocvar_g_waypointsprite_edgeoffset_right;
802 waypointsprite_edgeoffset_top = autocvar_g_waypointsprite_edgeoffset_top;
803 waypointsprite_crosshairfadealpha = autocvar_g_waypointsprite_crosshairfadealpha;
804 waypointsprite_crosshairfadescale = autocvar_g_waypointsprite_crosshairfadescale;
805 waypointsprite_crosshairfadedistance = autocvar_g_waypointsprite_crosshairfadedistance;
806 waypointsprite_distancefadealpha = autocvar_g_waypointsprite_distancefadealpha;
807 waypointsprite_distancefadescale = autocvar_g_waypointsprite_distancefadescale;
808 waypointsprite_distancefadedistance = waypointsprite_fadedistance * autocvar_g_waypointsprite_distancefadedistancemultiplier;
809 waypointsprite_alpha = autocvar_g_waypointsprite_alpha * (1 - autocvar__menu_alpha);
811 if(!waypointsprite_initialized)
813 WaypointSprite_Load_Frames(".tga");
814 WaypointSprite_Load_Frames(".jpg");
815 waypointsprite_initialized = true;
818 waypointsprite_count = waypointsprite_newcount;
819 waypointsprite_newcount = 0;