1 var float(string text, float handleColors, vector fontSize) stringwidth;
12 for(e = prev.sort_next; e; prev = e, e = e.sort_next)
14 if(prev != e.sort_prev)
15 error(strcat("sort list chain error\nplease submit the output of 'prvm_edicts client' to the developers"));
19 for(e = prev.sort_next; e; prev = e, e = e.sort_next)
21 if(prev != e.sort_prev)
22 error(strcat("sort list chain error\nplease submit the output of 'prvm_edicts client' to the developers"));
27 float RegisterPlayer(entity player)
31 for(pl = players.sort_next; pl; pl = pl.sort_next)
33 error("Player already registered!");
34 player.sort_next = players.sort_next;
35 player.sort_prev = players;
37 players.sort_next.sort_prev = player;
38 players.sort_next = player;
43 void RemovePlayer(entity player)
48 for(pl = players.sort_next; pl && pl != player; pl = pl.sort_next)
53 error("Trying to remove a player which is not in the playerlist!");
56 parent.sort_next = player.sort_next;
58 player.sort_next.sort_prev = parent;
62 void MoveToLast(entity e)
74 float RegisterTeam(entity Team)
78 for(tm = teams.sort_next; tm; tm = tm.sort_next)
80 error("Team already registered!");
81 Team.sort_next = teams.sort_next;
82 Team.sort_prev = teams;
84 teams.sort_next.sort_prev = Team;
85 teams.sort_next = Team;
90 void RemoveTeam(entity Team)
95 for(tm = teams.sort_next; tm && tm != Team; tm = tm.sort_next)
100 print(_("Trying to remove a team which is not in the teamlist!"));
103 parent.sort_next = Team.sort_next;
105 Team.sort_next.sort_prev = parent;
109 entity GetTeam(float Team, float add)
113 num = (Team == FL_SPECTATOR) ? 16 : Team;
115 return teamslots[num];
125 vector HUD_GetFontsize(string cvarname)
128 v = stov(cvar_string(cvarname));
137 float PreviewExists(string name)
139 if(autocvar_cl_readpicture_force)
142 if (fexists(strcat(name, ".tga"))) return true;
143 if (fexists(strcat(name, ".png"))) return true;
144 if (fexists(strcat(name, ".jpg"))) return true;
145 if (fexists(strcat(name, ".pcx"))) return true;
150 vector rotate(vector v, float a)
153 // FTEQCC SUCKS AGAIN
154 w_x = v_x * cos(a) + v_y * sin(a);
155 w_y = -1 * v_x * sin(a) + v_y * cos(a);
159 float ColorTranslateMode;
161 string ColorTranslateRGB(string s)
163 if(ColorTranslateMode & 1)
164 return strdecolorize(s);
169 // decolorizes and team colors the player name when needed
170 string playername(string thename, float teamid)
175 t = Team_ColorCode(teamid);
176 return strcat(t, strdecolorize(thename));
179 return strdecolorize(thename);
182 float cvar_or(string cv, float v)
192 vector project_3d_to_2d(vector vec)
194 vec = cs_project(vec);
195 if(cs_project_is_b0rked > 0)
197 vec_x *= vid_conwidth / vid_width;
198 vec_y *= vid_conheight / vid_height;
203 void dummyfunction(float a1, float a2, float a3, float a4, float a5, float a6, float a7, float a8)
207 float expandingbox_sizefactor_from_fadelerp(float fadelerp)
209 return 1.2 / (1.2 - fadelerp);
212 vector expandingbox_resize_centered_box_offset(float sz, vector boxsize, float boxxsizefactor)
214 boxsize_x *= boxxsizefactor; // easier interface for text
215 return boxsize * (0.5 * (1 - sz));
218 void drawborderlines(float thickness, vector pos, vector dim, vector color, float theAlpha, float drawflag)
222 // left and right lines
224 line_dim_x = thickness;
226 drawfill(pos, line_dim, color, theAlpha, drawflag);
227 drawfill(pos + (dim_x + thickness) * '1 0 0', line_dim, color, theAlpha, drawflag);
229 // upper and lower lines
231 line_dim_x = dim_x + thickness * 2; // make upper and lower lines longer
232 line_dim_y = thickness;
233 drawfill(pos, line_dim, color, theAlpha, drawflag);
234 drawfill(pos + (dim_y + thickness) * '0 1 0', line_dim, color, theAlpha, drawflag);
237 void drawpic_tiled(vector pos, string pic, vector sz, vector area, vector color, float theAlpha, float drawflag)
239 vector current_pos, end_pos, new_size, ratio;
240 end_pos = pos + area;
242 current_pos_y = pos_y;
243 while (current_pos_y < end_pos_y)
245 current_pos_x = pos_x;
246 while (current_pos_x < end_pos_x)
248 new_size_x = min(sz_x, end_pos_x - current_pos_x);
249 new_size_y = min(sz_y, end_pos_y - current_pos_y);
250 ratio_x = new_size_x / sz_x;
251 ratio_y = new_size_y / sz_y;
252 drawsubpic(current_pos, new_size, pic, '0 0 0', ratio, color, theAlpha, drawflag);
253 current_pos_x += sz_x;
255 current_pos_y += sz_y;
259 // drawpic wrapper to draw an image as large as possible with preserved aspect ratio into a box
260 var float _drawpic_imgaspect;
261 var vector _drawpic_imgsize;
262 var vector _drawpic_sz;
263 var float _drawpic_oldsz;
264 var string _drawpic_picpath;
265 #define drawpic_aspect(pos,pic,mySize,color,theAlpha,drawflag)\
267 _drawpic_imgsize = draw_getimagesize(pic);\
268 if(_drawpic_imgsize != '0 0 0') {\
269 _drawpic_imgaspect = _drawpic_imgsize_x/_drawpic_imgsize_y;\
270 _drawpic_sz = mySize;\
271 if(_drawpic_sz_x/_drawpic_sz_y > _drawpic_imgaspect) {\
272 _drawpic_oldsz = _drawpic_sz_x;\
273 _drawpic_sz_x = _drawpic_sz_y * _drawpic_imgaspect;\
275 drawpic(pos + eX * (_drawpic_oldsz - _drawpic_sz_x) * 0.5, pic, _drawpic_sz, color, theAlpha, drawflag);\
277 _drawpic_oldsz = _drawpic_sz_y;\
278 _drawpic_sz_y = _drawpic_sz_x / _drawpic_imgaspect;\
280 drawpic(pos + eY * (_drawpic_oldsz - _drawpic_sz_y) * 0.5, pic, _drawpic_sz, color, theAlpha, drawflag);\
285 // draw HUD element with image from gfx/hud/hud_skin/foo.tga if it exists, otherwise gfx/hud/default/foo.tga
286 #define drawpic_aspect_skin(pos,pic,sz,color,theAlpha,drawflag)\
288 _drawpic_picpath = strcat(hud_skin_path, "/", pic);\
289 if(precache_pic(_drawpic_picpath) == "") {\
290 _drawpic_picpath = strcat("gfx/hud/default/", pic);\
292 drawpic_aspect(pos, _drawpic_picpath, sz, color, theAlpha, drawflag);\
293 _drawpic_picpath = string_null;\
296 // draw HUD element with image from gfx/hud/hud_skin/foo.tga if it exists, otherwise gfx/hud/default/foo.tga
297 #define drawpic_skin(pos,pic,sz,color,theAlpha,drawflag)\
299 _drawpic_picpath = strcat(hud_skin_path, "/", pic);\
300 if(precache_pic(_drawpic_picpath) == "") {\
301 _drawpic_picpath = strcat("gfx/hud/default/", pic);\
303 drawpic(pos, _drawpic_picpath, sz, color, theAlpha, drawflag);\
304 _drawpic_picpath = string_null;\
307 void drawpic_aspect_skin_expanding(vector position, string pic, vector scale, vector rgb, float theAlpha, float flag, float fadelerp)
310 sz = expandingbox_sizefactor_from_fadelerp(fadelerp);
312 drawpic_aspect_skin(position + expandingbox_resize_centered_box_offset(sz, scale, 1), pic, scale * sz, rgb, theAlpha * (1 - fadelerp), flag);
315 void drawpic_aspect_skin_expanding_two(vector position, string pic, vector scale, vector rgb, float theAlpha, float flag, float fadelerp)
317 drawpic_aspect_skin_expanding(position, pic, scale, rgb, theAlpha, flag, fadelerp);
318 drawpic_skin(position, pic, scale, rgb, theAlpha * fadelerp, flag);
320 #define SET_POS_AND_SZ_Y_ASPECT(allow_colors)\
321 float textaspect, oldsz;\
322 textaspect = stringwidth(text, allow_colors, '1 1 1' * sz_y) / sz_y;\
323 if(sz_x/sz_y > textaspect) {\
325 sz_x = sz_y * textaspect;\
326 pos_x += (oldsz - sz_x) * 0.5;\
329 sz_y = sz_x / textaspect; \
330 pos_y += (oldsz - sz_y) * 0.5;\
333 // drawstring wrapper to draw a string as large as possible with preserved aspect ratio into a box
334 void drawstring_aspect(vector pos, string text, vector sz, vector color, float theAlpha, float drawflag) {
335 SET_POS_AND_SZ_Y_ASPECT(FALSE)
336 drawstring(pos, text, '1 1 0' * sz_y, color, theAlpha, drawflag);
339 // drawstring wrapper to draw a colorcodedstring as large as possible with preserved aspect ratio into a box
340 void drawcolorcodedstring_aspect(vector pos, string text, vector sz, float theAlpha, float drawflag) {
341 SET_POS_AND_SZ_Y_ASPECT(TRUE)
342 drawcolorcodedstring(pos, text, '1 1 0' * sz_y, theAlpha, drawflag);
345 vector drawfontscale;
346 void drawstring_expanding(vector position, string text, vector scale, vector rgb, float theAlpha, float flag, float fadelerp)
349 sz = expandingbox_sizefactor_from_fadelerp(fadelerp);
351 drawfontscale = sz * '1 1 0';
352 dummyfunction(0, 0, 0, 0, 0, 0, 0, 0);
353 drawstring(position + expandingbox_resize_centered_box_offset(sz, scale, stringwidth(text, FALSE, scale * (sz / drawfontscale_x)) / (scale_x * sz)), text, scale * (sz / drawfontscale_x), rgb, theAlpha * (1 - fadelerp), flag);
355 // (scale_x * sz / drawfontscale_x) * drawfontscale_x * SIZE1 / (scale_x * sz)
357 drawfontscale = '1 1 0';
360 // drawstring wrapper to draw a string as large as possible with preserved aspect ratio into a box
361 void drawstring_aspect_expanding(vector pos, string text, vector sz, vector color, float theAlpha, float drawflag, float fadelerp) {
362 SET_POS_AND_SZ_Y_ASPECT(FALSE)
363 drawstring_expanding(pos, text, '1 1 0' * sz_y, color, theAlpha, drawflag, fadelerp);
366 void drawcolorcodedstring_expanding(vector position, string text, vector scale, float theAlpha, float flag, float fadelerp)
369 sz = expandingbox_sizefactor_from_fadelerp(fadelerp);
371 drawfontscale = sz * '1 1 0';
372 dummyfunction(0, 0, 0, 0, 0, 0, 0, 0);
373 drawcolorcodedstring(position + expandingbox_resize_centered_box_offset(sz, scale, stringwidth(text, TRUE, scale * (sz / drawfontscale_x)) / (scale_x * sz)), text, scale * (sz / drawfontscale_x), theAlpha * (1 - fadelerp), flag);
374 drawfontscale = '1 1 0';
377 void drawcolorcodedstring_aspect_expanding(vector pos, string text, vector sz, float theAlpha, float drawflag, float fadelerp) {
378 SET_POS_AND_SZ_Y_ASPECT(TRUE)
379 drawcolorcodedstring_expanding(pos, text, '1 1 0' * sz_y, theAlpha, drawflag, fadelerp);
382 // this draws the triangles of a model DIRECTLY. Don't expect high performance, really...
383 float PolyDrawModelSurface(entity e, float i_s)
389 tex = getsurfacetexture(e, i_s);
391 return 0; // this is beyond the last one
392 n_t = getsurfacenumtriangles(e, i_s);
393 for(i_t = 0; i_t < n_t; ++i_t)
395 tri = getsurfacetriangle(e, i_s, i_t);
396 R_BeginPolygon(tex, 0);
397 R_PolygonVertex(getsurfacepoint(e, i_s, tri_x), getsurfacepointattribute(e, i_s, tri_x, SPA_TEXCOORDS0), '1 1 1', 1);
398 R_PolygonVertex(getsurfacepoint(e, i_s, tri_y), getsurfacepointattribute(e, i_s, tri_y, SPA_TEXCOORDS0), '1 1 1', 1);
399 R_PolygonVertex(getsurfacepoint(e, i_s, tri_z), getsurfacepointattribute(e, i_s, tri_z, SPA_TEXCOORDS0), '1 1 1', 1);
404 void PolyDrawModel(entity e)
407 for(i_s = 0; ; ++i_s)
408 if(!PolyDrawModelSurface(e, i_s))
412 void DrawCircleClippedPic(vector centre, float radius, string pic, float f, vector rgb, float a, float drawflag)
415 vector ringsize, v, t;
416 ringsize = radius * '1 1 0';
418 x = cos(f * 2 * M_PI);
419 y = sin(f * 2 * M_PI);
420 q = fabs(x) + fabs(y);
426 // draw full rectangle
427 R_BeginPolygon(pic, drawflag);
428 v = centre; t = '0.5 0.5 0';
429 v_x += 0.5 * ringsize_x; t += '0.5 0.5 0';
430 R_PolygonVertex(v, t, rgb, a);
432 v = centre; t = '0.5 0.5 0';
433 v_y += 0.5 * ringsize_y; t += '0.5 -0.5 0';
434 R_PolygonVertex(v, t, rgb, a);
436 v = centre; t = '0.5 0.5 0';
437 v_x -= 0.5 * ringsize_x; t -= '0.5 0.5 0';
438 R_PolygonVertex(v, t, rgb, a);
440 v = centre; t = '0.5 0.5 0';
441 v_y -= 0.5 * ringsize_y; t -= '0.5 -0.5 0';
442 R_PolygonVertex(v, t, rgb, a);
448 R_BeginPolygon(pic, drawflag);
449 v = centre; t = '0.5 0.5 0';
450 R_PolygonVertex(v, t, rgb, a);
452 v = centre; t = '0.5 0.5 0';
453 v_x += 0.5 * ringsize_x; t += '0.5 0.5 0';
454 R_PolygonVertex(v, t, rgb, a);
459 // draw upper and first triangle
460 R_BeginPolygon(pic, drawflag);
461 v = centre; t = '0.5 0.5 0';
462 v_x += 0.5 * ringsize_x; t += '0.5 0.5 0';
463 R_PolygonVertex(v, t, rgb, a);
465 v = centre; t = '0.5 0.5 0';
466 v_y += 0.5 * ringsize_y; t += '0.5 -0.5 0';
467 R_PolygonVertex(v, t, rgb, a);
469 v = centre; t = '0.5 0.5 0';
470 v_x -= 0.5 * ringsize_x; t -= '0.5 0.5 0';
471 R_PolygonVertex(v, t, rgb, a);
473 R_BeginPolygon(pic, drawflag);
474 v = centre; t = '0.5 0.5 0';
475 R_PolygonVertex(v, t, rgb, a);
477 v = centre; t = '0.5 0.5 0';
478 v_x -= 0.5 * ringsize_x; t -= '0.5 0.5 0';
479 R_PolygonVertex(v, t, rgb, a);
481 v = centre; t = '0.5 0.5 0';
482 v_y -= 0.5 * ringsize_y; t -= '0.5 -0.5 0';
483 R_PolygonVertex(v, t, rgb, a);
491 // draw upper triangle
492 R_BeginPolygon(pic, drawflag);
493 v = centre; t = '0.5 0.5 0';
494 v_x += 0.5 * ringsize_x; t += '0.5 0.5 0';
495 R_PolygonVertex(v, t, rgb, a);
497 v = centre; t = '0.5 0.5 0';
498 v_y += 0.5 * ringsize_y; t += '0.5 -0.5 0';
499 R_PolygonVertex(v, t, rgb, a);
501 v = centre; t = '0.5 0.5 0';
502 v_x -= 0.5 * ringsize_x; t -= '0.5 0.5 0';
503 R_PolygonVertex(v, t, rgb, a);
509 R_BeginPolygon(pic, drawflag);
510 v = centre; t = '0.5 0.5 0';
511 R_PolygonVertex(v, t, rgb, a);
513 v = centre; t = '0.5 0.5 0';
514 v_x -= 0.5 * ringsize_x; t -= '0.5 0.5 0';
515 R_PolygonVertex(v, t, rgb, a);
520 // draw first triangle
521 R_BeginPolygon(pic, drawflag);
522 v = centre; t = '0.5 0.5 0';
523 R_PolygonVertex(v, t, rgb, a);
525 v = centre; t = '0.5 0.5 0';
526 v_x += 0.5 * ringsize_x; t += '0.5 0.5 0';
527 R_PolygonVertex(v, t, rgb, a);
529 v = centre; t = '0.5 0.5 0';
530 v_y += 0.5 * ringsize_y; t += '0.5 -0.5 0';
531 R_PolygonVertex(v, t, rgb, a);
542 R_BeginPolygon(pic, drawflag);
543 v = centre; t = '0.5 0.5 0';
544 R_PolygonVertex(v, t, rgb, a);
546 v = centre; t = '0.5 0.5 0';
547 v_x += 0.5 * ringsize_x; t += '0.5 0.5 0';
548 R_PolygonVertex(v, t, rgb, a);
554 v = centre; t = '0.5 0.5 0';
555 v_x += x * 0.5 * ringsize_x; t += x * '0.5 0.5 0';
556 v_y += y * 0.5 * ringsize_y; t += y * '0.5 -0.5 0';
557 R_PolygonVertex(v, t, rgb, a);
562 const vector GETPLAYERORIGIN_ERROR = '1123581321 2357111317 3141592653'; // way out of bounds for anything on the map
563 vector getplayerorigin(float pl)
568 e = CSQCModel_server2csqc(pl + 1);
572 #ifndef NO_LEGACY_NETWORKING
573 s = getplayerkeyvalue(pl, "TEMPHACK_origin");
578 e = entcs_receiver[pl];
582 return GETPLAYERORIGIN_ERROR;
585 float getplayerisdead(float pl)
589 e = CSQCModel_server2csqc(pl + 1);
591 return e.csqcmodel_isdead;
596 void URI_Get_Callback(float id, float status, string data)
598 if(url_URI_Get_Callback(id, status, data))
602 else if (id == URI_GET_DISCARD)
606 else if (id >= URI_GET_CURL && id <= URI_GET_CURL_END)
609 Curl_URI_Get_Callback(id, status, data);
613 print(sprintf(_("Received HTTP request data for an invalid id %d.\n"), id));
617 void draw_beginBoldFont()
619 drawfont = FONT_USER+2;
622 void draw_endBoldFont()
624 drawfont = FONT_USER+1;