]> git.xonotic.org Git - xonotic/darkplaces.git/blob - dpdefs/csprogsdefs.qc
csqc: Implement builtin #177 "localsound"
[xonotic/darkplaces.git] / dpdefs / csprogsdefs.qc
1 /*
2 ==============================================================================
3
4                         SOURCE FOR GLOBALVARS_T C STRUCTURE
5                         MUST NOT BE MODIFIED, OR CRC ERRORS WILL APPEAR
6
7 ==============================================================================
8 */
9
10 //
11 // system globals
12 //
13 entity          self;
14 entity          other;
15 entity          world;
16 float           time;
17 float           frametime;
18
19 float           player_localentnum;     //the entnum
20 float           player_localnum;        //the playernum
21 float           maxclients;     //a constant filled in by the engine. gah, portability eh?
22
23 float           clientcommandframe;     //player movement
24 float           servercommandframe;     //clientframe echoed off the server
25
26 string          mapname;
27
28 //
29 // global variables set by built in functions
30 //
31 vector          v_forward, v_up, v_right;       // set by makevectors()
32
33 // set by traceline / tracebox
34 float           trace_allsolid;
35 float           trace_startsolid;
36 float           trace_fraction;
37 vector          trace_endpos;
38 vector          trace_plane_normal;
39 float           trace_plane_dist;
40 entity          trace_ent;
41 float           trace_inopen;
42 float           trace_inwater;
43
44 //
45 // required prog functions
46 //
47 void()          CSQC_Init;
48 void()          CSQC_Shutdown;
49 float(float f, float t, float n)        CSQC_InputEvent;
50 void(float w, float h)          CSQC_UpdateView;
51 float(string s) CSQC_ConsoleCommand;
52
53 //these fields are read and set by the default player physics
54 vector          pmove_org;
55 vector          pmove_vel;
56 vector          pmove_mins;
57 vector          pmove_maxs;
58 //retrieved from the current movement commands (read by player physics)
59 float           input_timelength;
60 vector          input_angles;
61 vector          input_movevalues;       //forwards, right, up.
62 float           input_buttons;          //attack, use, jump (default physics only uses jump)
63
64 float           movevar_gravity;
65 float           movevar_stopspeed;
66 float           movevar_maxspeed;
67 float           movevar_spectatormaxspeed;      //used by NOCLIP movetypes.
68 float           movevar_accelerate;
69 float           movevar_airaccelerate;
70 float           movevar_wateraccelerate;
71 float           movevar_friction;
72 float           movevar_waterfriction;
73 float           movevar_entgravity;     //the local player's gravity field. Is a multiple (1 is the normal value)
74
75 //================================================
76 void            end_sys_globals;                // flag for structure dumping
77 //================================================
78
79 /*
80 ==============================================================================
81
82                         SOURCE FOR ENTVARS_T C STRUCTURE
83                         MUST NOT BE MODIFIED, OR CRC ERRORS WILL APPEAR
84
85 ==============================================================================
86 */
87
88 //
89 // system fields (*** = do not set in prog code, maintained by C code)
90 //
91 .float          modelindex;             // *** model index in the precached list
92 .vector         absmin, absmax; // *** origin + mins / maxs
93
94 .float          entnum; // *** the ent number as on the server
95 .float          drawmask;
96 .void()         predraw;
97
98 .float          movetype;
99 .float          solid;
100
101 .vector         origin;                 // ***
102 .vector         oldorigin;              // ***
103 .vector         velocity;
104 .vector         angles;
105 .vector         avelocity;
106
107 .string         classname;              // spawn function
108 .string         model;
109 .float          frame;
110 .float          skin;
111 .float          effects;
112
113 .vector         mins, maxs;             // bounding box extents reletive to origin
114 .vector         size;                   // maxs - mins
115
116 .void()         touch;
117 .void()         use;
118 .void()         think;
119 .void()         blocked;                // for doors or plats, called when can't push other
120
121 .float          nextthink;
122
123 .entity         chain;
124
125 .string         netname;
126
127 .entity         enemy;
128
129 .float          flags;
130
131 .float          colormap;
132
133 .entity         owner;          // who launched a missile
134
135 //================================================
136 void            end_sys_fields;                 // flag for structure dumping
137 //================================================
138
139 /*
140 ==============================================================================
141
142                         OPTIONAL FIELDS AND GLOBALS
143
144 ==============================================================================
145 */
146
147 // Additional OPTIONAL Fields and Globals
148 float           intermission; // indicates intermission state (0 = normal, 1 = scores, 2 = finale text)
149
150 vector          view_angles; // same as input_angles
151 vector          view_punchangle; // from server
152 vector          view_punchvector; // from server
153
154 /*
155 ==============================================================================
156
157                         CONSTANT DEFINITIONS
158
159 ==============================================================================
160 */
161
162 const float MASK_ENGINE                 = 1;
163 const float MASK_ENGINEVIEWMODELS       = 2;
164 const float MASK_NORMAL                 = 4;
165
166 const float RF_VIEWMODEL        = 1;
167 const float RF_EXTERNALMODEL    = 2;
168 const float RF_DEPTHHACK        = 4;
169 const float RF_ADDITIVE         = 8;
170 const float RF_USEAXIS          = 16;
171
172 const float VF_MIN              = 1;    //(vector)
173 const float VF_MIN_X            = 2;    //(float)
174 const float VF_MIN_Y            = 3;    //(float)
175 const float VF_SIZE             = 4;    //(vector) (viewport size)
176 const float VF_SIZE_Y           = 5;    //(float)
177 const float VF_SIZE_X           = 6;    //(float)
178 const float VF_VIEWPORT         = 7;    //(vector, vector)
179 const float VF_FOV              = 8;    //(vector)
180 const float VF_FOVX             = 9;    //(float)
181 const float VF_FOVY             = 10;   //(float)
182 const float VF_ORIGIN           = 11;   //(vector)
183 const float VF_ORIGIN_X         = 12;   //(float)
184 const float VF_ORIGIN_Y         = 13;   //(float)
185 const float VF_ORIGIN_Z         = 14;   //(float)
186 const float VF_ANGLES           = 15;   //(vector)
187 const float VF_ANGLES_X         = 16;   //(float)
188 const float VF_ANGLES_Y         = 17;   //(float)
189 const float VF_ANGLES_Z         = 18;   //(float)
190 const float VF_DRAWWORLD        = 19;   //(float)
191 const float VF_DRAWENGINESBAR   = 20;   //(float)
192 const float VF_DRAWCROSSHAIR    = 21;   //(float)
193
194 const float VF_CL_VIEWANGLES    = 33;   //(vector)
195 const float VF_CL_VIEWANGLES_X  = 34;   //(float)
196 const float VF_CL_VIEWANGLES_Y  = 35;   //(float)
197 const float VF_CL_VIEWANGLES_Z  = 36;   //(float)
198
199 const float VF_PERSPECTIVE      = 200;
200
201 const float STAT_HEALTH         = 0;
202 const float STAT_WEAPONMODEL    = 2;
203 const float STAT_AMMO           = 3;
204 const float STAT_ARMOR          = 4;
205 const float STAT_WEAPONFRAME    = 5;
206 const float STAT_SHELLS         = 6;
207 const float STAT_NAILS          = 7;
208 const float STAT_ROCKETS        = 8;
209 const float STAT_CELLS          = 9;
210 const float STAT_ACTIVEWEAPON   = 10;
211 const float STAT_TOTALSECRETS   = 11;
212 const float STAT_TOTALMONSTERS  = 12;
213 const float STAT_SECRETS                = 13;
214 const float STAT_MONSTERS               = 14;
215 const float STAT_ITEMS          = 15;
216 const float STAT_VIEWHEIGHT     = 16;
217
218 // Quake Sound Constants
219 const float CHAN_AUTO                   = 0;
220 const float CHAN_WEAPON                 = 1;
221 const float CHAN_VOICE                  = 2;
222 const float CHAN_ITEM                   = 3;
223 const float CHAN_BODY                   = 4;
224
225 const float ATTN_NONE                   = 0;
226 const float ATTN_NORM                   = 1;
227 const float ATTN_IDLE                   = 2;
228 const float ATTN_STATIC                 = 3;
229
230 // Frik File Constants
231 const float FILE_READ                   = 0;
232 const float FILE_APPEND                 = 1;
233 const float FILE_WRITE                  = 2;
234
235 // Quake Point Contents
236 const float CONTENT_EMPTY                                       = -1;
237 const float CONTENT_SOLID                                       = -2;
238 const float CONTENT_WATER                                       = -3;
239 const float CONTENT_SLIME                                       = -4;
240 const float CONTENT_LAVA                                        = -5;
241 const float CONTENT_SKY                                         = -6;
242
243 // Quake Solid Constants
244 const float SOLID_NOT                                           = 0;
245 const float SOLID_TRIGGER                                       = 1;
246 const float SOLID_BBOX                                          = 2;
247 const float SOLID_SLIDEBOX                                      = 3;
248 const float SOLID_BSP                                           = 4;
249 const float SOLID_CORPSE                                        = 5;
250
251 // Quake Move Constants
252 const float MOVE_NORMAL                                         = 0;
253 const float MOVE_NOMONSTERS                                     = 1;
254 const float MOVE_MISSILE                                        = 2;
255
256 // Boolean Constants
257 const float true        = 1;
258 const float false       = 0;
259 const float TRUE        = 1;
260 const float FALSE       = 0;
261
262 const float EXTRA_LOW = -99999999;
263 const float EXTRA_HIGH = 99999999;
264
265 const vector VEC_1      = '1 1 1';
266 const vector VEC_0      = '0 0 0';
267 const vector VEC_M1     = '-1 -1 -1';
268
269 const float M_PI = 3.14159265358979323846;
270
271 vector  VEC_HULL_MIN = '-16 -16 -24';
272 vector  VEC_HULL_MAX = '16 16 32';
273
274 // Quake Temporary Entity Constants
275 const float TE_SPIKE                                            = 0;
276 const float TE_SUPERSPIKE                                       = 1;
277 const float TE_GUNSHOT                                          = 2;
278 const float TE_EXPLOSION                                        = 3;
279 const float TE_TAREXPLOSION                                     = 4;
280 const float TE_LIGHTNING1                                       = 5;
281 const float TE_LIGHTNING2                                       = 6;
282 const float TE_WIZSPIKE                                         = 7;
283 const float TE_KNIGHTSPIKE                                      = 8;
284 const float TE_LIGHTNING3                                       = 9;
285 const float TE_LAVASPLASH                                       = 10;
286 const float TE_TELEPORT                                         = 11;
287 const float TE_EXPLOSION2                                       = 12;
288         // Darkplaces Additions
289         const float TE_EXPLOSIONRGB                                     = 53;
290         const float TE_GUNSHOTQUAD                                      = 57;
291         const float TE_EXPLOSIONQUAD                            = 70;
292         const float TE_SPIKEQUAD                                        = 58;
293         const float TE_SUPERSPIKEQUAD                           = 59;
294
295 // PFlags for Dynamic Lights
296 const float PFLAGS_NOSHADOW                                     = 1;
297 const float PFLAGS_CORONA                                       = 2;
298 const float PFLAGS_FULLDYNAMIC                          = 128;
299
300 const float EF_ADDITIVE         = 32;
301 const float EF_BLUE             = 64;
302 const float EF_FLAME            = 1024;
303 const float EF_FULLBRIGHT       = 512;
304 const float EF_NODEPTHTEST      = 8192;
305 const float EF_NODRAW           = 16;
306 const float EF_NOSHADOW         = 4096;
307 const float EF_RED              = 128;
308 const float EF_STARDUST         = 2048;
309 const float EF_SELECTABLE       = 16384;
310
311 const float PFL_ONGROUND        = 1;
312 const float PFL_CROUCH          = 2;
313 const float PFL_DEAD            = 4;
314 const float PFL_GIBBED          = 8;
315
316 // draw flags
317 const float DRAWFLAG_NORMAL = 0;
318 const float DRAWFLAG_ADDITIVE = 1;
319 const float DRAWFLAG_MODULATE = 2;
320 const float DRAWFLAG_2XMODULATE = 3;
321 const float DRAWFLAG_SCREEN = 4;
322 const float DRAWFLAG_MIPMAP = 0x100; // only for R_BeginPolygon
323
324 /*
325 ==============================================================================
326
327                         BUILTIN DEFINITIONS
328                         EXTENSIONS ARE NOT ADDED HERE, BUT BELOW!
329
330 ==============================================================================
331 */
332
333 void(vector ang) makevectors = #1;
334 void(entity e, vector o) setorigin = #2;
335 void(entity e, string m) setmodel = #3;
336 void(entity e, vector min, vector max) setsize = #4;
337
338 void() break_to_debugger = #6;
339 float() random = #7;
340 void(entity e, float chan, string samp, float volume, float atten, ...) sound = #8;
341 vector(vector v) normalize = #9;
342 void(string e) error = #10;
343 void(string e) objerror = #11;
344 float(vector v) vlen = #12;
345 float(vector v) vectoyaw = #13;
346 entity() spawn = #14;
347 void(entity e) remove = #15;
348 float(vector v1, vector v2, float tryents, entity ignoreentity) traceline = #16;
349
350 entity(entity start, .string fld, string match) find = #18;
351 void(string s) precache_sound = #19;
352 void(string s) precache_model = #20;
353
354 entity(vector org, float rad) findradius = #22;
355
356 void(string s, ...) dprint = #25;
357 string(float f) ftos = #26;
358 string(vector v) vtos = #27;
359 void() coredump = #28;
360 void() traceon = #29;
361 void() traceoff = #30;
362 void(entity e) eprint = #31;
363 // settrace optional
364 float(float yaw, float dist, float settrace) walkmove = #32;
365
366 float() droptofloor = #34;
367 void(float style, string value) lightstyle = #35;
368 float(float v) rint = #36;
369 float(float v) floor = #37;
370 float(float v) ceil = #38;
371
372 float(entity e) checkbottom = #40;
373 float(vector v) pointcontents = #41;
374
375 float(float f) fabs = #43;
376
377 float(string s) cvar = #45;
378 void(string s, ...) localcmd = #46;
379 entity(entity e) nextent = #47;
380 void(vector o, vector d, float color, float count) particle = #48;
381 void() ChangeYaw = #49;
382
383 vector(vector v) vectoangles = #51;
384 vector(vector v, vector w) vectoangles2 = #51;
385
386 float(float f) sin = #60;
387 float(float f) cos = #61;
388 float(float f) sqrt = #62;
389 void(entity ent) changepitch = #63;
390 void(entity e, entity ignore) tracetoss = #64;
391 string(entity ent) etos = #65;
392
393 string(string s) precache_file = #68;
394 void(entity e) makestatic = #69;
395
396 void(string var, string val) cvar_set = #72;
397
398 void(vector pos, string samp, float vol, float atten) ambientsound = #74;
399 string(string s) precache_model2 = #75;
400 string(string s) precache_sound2 = #76;
401 string(string s) precache_file2 = #77;
402
403 float(string s) stof = #81;
404
405
406 void(vector v1, vector min, vector max, vector v2, float nomonsters, entity forent) tracebox = #90;
407 vector() randomvec = #91;
408 vector(vector org) getlight = #92;
409 vector(vector org, float lpflags) getlight2 = #92;
410 vector getlight_dir;
411 vector getlight_ambient;
412 vector getlight_diffuse;
413 const float LP_LIGHTMAP = 1;
414 const float LP_RTWORLD = 2;
415 const float LP_DYNLIGHT = 4;
416 const float LP_COMPLETE = 7;
417
418 float(string name, string value) registercvar = #93;
419 float( float a, ... ) min = #94;
420 float( float b, ... ) max = #95;
421 float(float minimum, float val, float maximum) bound = #96;
422 float(float f, float f) pow = #97;
423 entity(entity start, .float fld, float match) findfloat = #98;
424 entity(entity start, .entity fld, entity match) findentity = #98;
425 float(string s) checkextension = #99;
426 // FrikaC and Telejano range #100-#199
427
428 float(string filename, float mode) fopen = #110;
429 void(float fhandle) fclose = #111;
430 string(float fhandle) fgets = #112;
431 void(float fhandle, string s) fputs = #113;
432 float(string s) strlen = #114;
433 string(...) strcat = #115;
434 string(string s, float start, float length) substring = #116;
435 vector(string) stov = #117;
436 string(string s) strzone = #118;
437 void(string s) strunzone = #119;
438 void(string s, float chan, float vol) localsound = #177;
439
440 // FTEQW range #200-#299
441
442 float(float number, float quantity) bitshift = #218;
443
444 //float(string str, string sub[, float startpos]) strstrofs = #221;
445 float(string str, string sub, float startpos) strstrofs = #221;
446 float(string str, float ofs) str2chr = #222;
447 string(float c, ...) chr2str = #223;
448 string(float ccase, float calpha, float cnum, string s, ...) strconv = #224;
449 string(float chars, string s, ...) strpad = #225;
450 string(string info, string key, string value, ...) infoadd = #226;
451 string(string info, string key) infoget = #227;
452 float(string s1, string s2) strcmp = #228;
453 float(string s1, string s2, float len) strncmp = #228;
454 float(string s1, string s2) strcasecmp = #229;
455 float(string s1, string s2, float len) strncasecmp = #230;
456
457 // CSQC range #300-#399
458 void() clearscene = #300;
459 void(float mask) addentities = #301;
460 void(entity ent) addentity = #302;
461 float(float property, ...) setproperty = #303;
462 float(float property) getproperty = #309;
463 vector(float property) getpropertyvec = #309;
464 void() renderscene = #304;
465 void(vector org, float radius, vector lightcolours) adddynamiclight = #305;
466 void(vector org, float radius, vector lightcolours, float style, string cubemapname, float pflags) adddynamiclight2 = #305;
467 //void(string texturename, float flag[, float is2d, float lines]) R_BeginPolygon = #306;
468 void(string texturename, float flag, ...) R_BeginPolygon = #306;
469 void(vector org, vector texcoords, vector rgb, float alpha) R_PolygonVertex = #307;
470 void() R_EndPolygon = #308;
471 vector (vector v) cs_unproject = #310;
472 vector (vector v) cs_project = #311;
473
474 void(float width, vector pos1, vector pos2, vector rgb, float alpha, float flag) drawline = #315;
475 float(string name) iscachedpic = #316;
476 string(string name, ...) precache_pic = #317;
477 string(string name) precache_cubemap = #317;
478 vector(string picname) draw_getimagesize = #318;
479 void(string name) freepic = #319;
480 float(vector position, float character, vector scale, vector rgb, float alpha, float flag) drawcharacter = #320;
481 float(vector position, string text, vector scale, vector rgb, float alpha, float flag) drawstring = #321;
482 float(vector position, string pic, vector size, vector rgb, float alpha, float flag) drawpic = #322;
483 float(vector position, vector size, vector rgb, float alpha, float flag) drawfill = #323;
484 void(float x, float y, float width, float height) drawsetcliparea = #324;
485 void(void) drawresetcliparea = #325;
486 float(vector position, string text, vector scale, float alpha, float flag) drawcolorcodedstring = #326;
487 vector(vector position, string text, vector scale, vector rgb, float alpha, float flag) drawcolorcodedstring2 = #326;
488
489 float(float stnum) getstatf = #330;
490 float(float stnum, ...) getstati = #331; // can optionally take first bit and count
491 string(float firststnum) getstats = #332;
492 void(entity e, float mdlindex) setmodelindex = #333;
493 string(float mdlindex) modelnameforindex = #334;
494 float(string effectname) particleeffectnum = #335;
495 void(entity ent, float effectnum, vector start, vector end) trailparticles = #336;
496 //void(float effectnum, vector origin [, vector dir, float count]) pointparticles = #337;
497 void(float effectnum, vector origin , vector dir, float count) pointparticles = #337;
498 void(string s, ...) centerprint = #338;
499 void(string s, ...) print = #339;
500 string(float keynum) keynumtostring = #340;
501 float(string keyname) stringtokeynum = #341;
502 string(float keynum) getkeybind = #342;
503 void(float usecursor) setcursormode = #343;
504 vector() getmousepos = #344;
505 float(float framenum) getinputstate = #345;
506 void(float sens) setsensitivityscale = #346;
507 void(...) runstandardplayerphysics = #347; // this may or may not take a player ent
508 string(float playernum, string keyname) getplayerkeyvalue = #348;
509 float() isdemo = #349;
510 float() isserver = #350;
511 void(vector origin, vector forward, vector right, vector up) SetListener = #351;
512 void(string cmdname) registercommand = #352;
513 float(entity ent) wasfreed = #353;
514 string(string key) serverkey = #354;
515
516 // Use proper case; refer to the id1 Write* functions!
517 float() ReadByte = #360;
518 float() ReadChar = #361;
519 float() ReadShort = #362;
520 float() ReadLong = #363;
521 float() ReadCoord = #364;
522 float() ReadAngle = #365;
523 string() ReadString = #366;
524 float() ReadFloat = #367;
525
526 // LadyHavoc's range #400-#499
527 void(entity from, entity to) copyentity = #400;
528
529 entity(.string fld, string match) findchain = #402;
530 entity(.float fld, float match) findchainfloat = #403;
531 void(vector org, string modelname, float startframe, float endframe, float framerate) effect = #404;
532 void(vector org, vector velocity, float howmany) te_blood = #405;
533 void(vector mincorner, vector maxcorner, float explosionspeed, float howmany) te_bloodshower = #406;
534 void(vector org, vector color) te_explosionrgb = #407;
535 void(vector mincorner, vector maxcorner, vector vel, float howmany, float color, float gravityflag, float randomveljitter) te_particlecube = #408;
536 void(vector mincorner, vector maxcorner, vector vel, float howmany, float color) te_particlerain = #409;
537 void(vector mincorner, vector maxcorner, vector vel, float howmany, float color) te_particlesnow = #410;
538 void(vector org, vector vel, float howmany) te_spark = #411;
539 void(vector org) te_gunshotquad = #412;
540 void(vector org) te_spikequad = #413;
541 void(vector org) te_superspikequad = #414;
542 void(vector org) te_explosionquad = #415;
543 void(vector org) te_smallflash = #416;
544 void(vector org, float radius, float lifetime, vector color) te_customflash = #417;
545 void(vector org) te_gunshot = #418;
546 void(vector org) te_spike = #419;
547 void(vector org) te_superspike = #420;
548 void(vector org) te_explosion = #421;
549 void(vector org) te_tarexplosion = #422;
550 void(vector org) te_wizspike = #423;
551 void(vector org) te_knightspike = #424;
552 void(vector org) te_lavasplash = #425;
553 void(vector org) te_teleport = #426;
554 void(vector org, float colorstart, float colorlength) te_explosion2 = #427;
555 void(entity own, vector start, vector end) te_lightning1 = #428;
556 void(entity own, vector start, vector end) te_lightning2 = #429;
557 void(entity own, vector start, vector end) te_lightning3 = #430;
558 void(entity own, vector start, vector end) te_beam = #431;
559 void(vector dir) vectorvectors = #432;
560 void(vector org) te_plasmaburn = #433;
561 float(entity e, float s) getsurfacenumpoints = #434;
562 vector(entity e, float s, float n) getsurfacepoint = #435;
563 vector(entity e, float s) getsurfacenormal = #436;
564 string(entity e, float s) getsurfacetexture = #437;
565 float(entity e, vector p) getsurfacenearpoint = #438;
566 vector(entity e, float s, vector p) getsurfaceclippedpoint = #439;
567
568 float(string s) tokenize = #441;
569 string(float n) argv = #442;
570 void(entity e, entity tagentity, string tagname) setattachment = #443;
571 float(string pattern, float caseinsensitive, float quiet) search_begin = #444;
572 void(float handle) search_end = #445;
573 float(float handle) search_getsize = #446;
574 string(float handle, float num) search_getfilename = #447;
575 string(string s) cvar_string = #448;
576 entity(entity start, .float fld, float match) findflags = #449;
577 entity(.float fld, float match) findchainflags = #450;
578 float(entity ent, string tagname) gettagindex = #451;
579 vector(entity ent, float tagindex) gettaginfo = #452;
580
581 void(vector org, vector vel, float howmany) te_flamejet = #457;
582
583 entity(float num) entitybyindex = #459;
584 float() buf_create = #460;
585 void(float bufhandle) buf_del = #461;
586 float(float bufhandle) buf_getsize = #462;
587 void(float bufhandle_from, float bufhandle_to) buf_copy = #463;
588 void(float bufhandle, float sortpower, float backward) buf_sort = #464;
589 string(float bufhandle, string glue) buf_implode = #465;
590 string(float bufhandle, float string_index) bufstr_get = #466;
591 void(float bufhandle, float string_index, string str) bufstr_set = #467;
592 float(float bufhandle, string str, float order) bufstr_add = #468;
593 void(float bufhandle, float string_index) bufstr_free = #469;
594
595 float(float s) asin = #471;
596 float(float c) acos = #472;
597 float(float t) atan = #473;
598 float(float c, float s) atan2 = #474;
599 float(float a) tan = #475;
600 float(string s) strippedstringlen = #476;
601 float(string s) strlennocol = #476; // This is the correct name for the function, but not removing the strippedstringlen mapping.
602 string(string s) decolorizedstring = #477;
603 string(string s) strdecolorize = #477; // This is the correct name for the function, but not removing the decolorizedstring mapping.
604 string(float uselocaltime, string format, ...) strftime = #478;
605 string(string s) strtolower = #480;
606 string(string s) strtoupper = #481;
607 string(string s) cvar_defstring = #482;
608 void(vector origin, string sample, float volume, float attenuation) pointsound = #483;
609 string(string search, string replace, string subject) strreplace = #484;
610 string(string search, string replace, string subject) strireplace = #485;
611 vector(entity e, float s, float n, float a) getsurfacepointattribute = #486;
612 #ifdef SUPPORT_GECKO
613 float gecko_create( string name ) = #487;
614 void gecko_destroy( string name ) = #488;
615 void gecko_navigate( string name, string URI ) = #489;
616 float gecko_keyevent( string name, float key, float eventtype ) = #490;
617 void gecko_mousemove( string name, float x, float y ) = #491;
618 void gecko_resize( string name, float w, float h ) = #492;
619 vector gecko_get_texture_extent( string name ) = #493;
620 #else
621
622 #endif
623
624 /*
625 ==============================================================================
626
627                         EXTENSION DEFINITIONS
628
629 ==============================================================================
630 */
631
632 // DP_CSQC_SPAWNPARTICLE
633 // idea: VorteX
634 // darkplaces implementation: VorteX
635 // constant definitions:
636 // particle base behavior:
637 float PT_ALPHASTATIC = 1;
638 float PT_STATIC = 2;
639 float PT_SPARK = 3;
640 float PT_BEAM = 4;
641 float PT_RAIN = 5;
642 float PT_RAINDECAL = 6;
643 float PT_SNOW = 7;
644 float PT_BUBBLE = 8;
645 float PT_BLOOD = 9;
646 float PT_SMOKE = 10;
647 float PT_DECAL = 11;
648 float PT_ENTITYPARTICLE = 12;
649 // particle blendtypes:
650 float PBLEND_ALPHA = 0;
651 float PBLEND_ADD = 1;
652 float PBLEND_INVMOD = 2;
653 // particle orientation:
654 float PARTICLE_BILLBOARD = 0;
655 float PARTICLE_SPARK = 1;
656 float PARTICLE_ORIENTED_DOUBLESIDED = 2;
657 float PARTICLE_BEAM = 3;
658 // global definitions:
659 float particle_type; // one of PT_
660 float particle_blendmode; // one of PBLEND_ values
661 float particle_orientation; // one of PARTICLE_ values
662 vector particle_color1;
663 vector particle_color2;
664 float particle_tex; // number of chunk in particlefont
665 float particle_size;
666 float particle_sizeincrease;
667 float particle_alpha;
668 float particle_alphafade;
669 float particle_time;
670 float particle_gravity;
671 float particle_bounce;
672 float particle_airfriction;
673 float particle_liquidfriction;
674 float particle_originjitter;
675 float particle_velocityjitter;
676 float particle_qualityreduction; // enable culling of this particle when FPS is low
677 float particle_stretch;
678 vector particle_staincolor1;
679 vector particle_staincolor2;
680 float particle_staintex;
681 float particle_stainalpha;
682 float particle_stainsize;
683 float particle_delayspawn;
684 float particle_delaycollision;
685 float particle_angle;
686 float particle_spin;
687 // builtin definitions:
688 float(float max_themes) initparticlespawner = #522; // check fields/globals for integration and enable particle spawner, return 1 is succeded, otherwise returns 0
689 void() resetparticle = #523; // reset p_ globals to default theme #0
690 void(float theme) particletheme = #524; // restore p_ globals from saved theme
691 float() particlethemesave = #525; // save p_ globals to new particletheme and return it's index
692 void(float theme) particlethemeupdate = #525; // save p_ globals to new particletheme and return it's index
693 void(float theme) particlethemefree = #526; // delete a particle theme
694 float(vector org, vector vel) spawnparticle = #527; // returns 0 when failed, 1 when spawned
695 float(vector org, vector vel, float theme) quickparticle = #527; // not reading globals, just theme, returns 0 when failed, 1 when spawned
696 float(vector org, vector vel, float delay, float collisiondelay) delayedparticle = #528;
697 float(vector org, vector vel, float delay, float collisiondelay, float theme) quickdelayedparticle = #528;
698 // description: this builtin provides an easy and flexible way to spawn particles,
699 // it is not created as replace for DP_SV_POINTPARTICLES but as an addition to it.
700 // With this extension you can create a specific particles like rain particles, or entity particles
701 // notes:
702 // 1) 0 is default particle template, it could be changed
703 // 2) color vectors could have value 0-255 of each component
704 // restrictions: max themes could be between 4 and 2048
705 // warning: you should call initparticlespawner() at very beginning BEFORE all other particle spawner functions
706 // function to query particle info
707 // don't remove this function as it protects all particle_ globals from FTEQCC/FRIKQCC non-referenced removal optimisation
708 void() printparticle =
709 {
710         // vortex: this also protects from 'non-referenced' optimisation on some compilers
711         print("PARTICLE:\n");
712         print(strcat("  type: ", ftos(particle_type), "\n"));
713         print(strcat("  blendmode: ", ftos(particle_blendmode), "\n"));
714         print(strcat("  orientation: ", ftos(particle_orientation), "\n"));
715         print(strcat("  color1: ", vtos(particle_color1), "\n"));
716         print(strcat("  color2: ", vtos(particle_color2), "\n"));
717         print(strcat("  tex: ", ftos(particle_tex), "\n"));
718         print(strcat("  size: ", ftos(particle_size), "\n"));
719         print(strcat("  sizeincrease: ", ftos(particle_sizeincrease), "\n"));
720         print(strcat("  alpha: ", ftos(particle_alpha), "\n"));
721         print(strcat("  alphafade: ", ftos(particle_alphafade), "\n"));
722         print(strcat("  time: ", ftos(particle_time), "\n"));
723         print(strcat("  gravity: ", ftos(particle_gravity), "\n"));
724         print(strcat("  bounce: ", ftos(particle_bounce), "\n"));
725         print(strcat("  airfriction: ", ftos(particle_airfriction), "\n"));
726         print(strcat("  liquidfriction: ", ftos(particle_liquidfriction), "\n"));
727         print(strcat("  originjitter: ", ftos(particle_originjitter), "\n"));
728         print(strcat("  velocityjitter: ", ftos(particle_velocityjitter), "\n"));
729         print(strcat("  qualityreduction: ", ftos(particle_qualityreduction), "\n"));
730         print(strcat("  stretch: ", ftos(particle_stretch), "\n"));
731         print(strcat("  staincolor1: ", vtos(particle_staincolor1), "\n"));
732         print(strcat("  staincolor2: ", vtos(particle_staincolor2), "\n"));
733         print(strcat("  staintex: ", ftos(particle_staintex), "\n"));
734         print(strcat("  stainalpha: ", ftos(particle_stainalpha), "\n"));
735         print(strcat("  stainsize: ", ftos(particle_stainsize), "\n"));
736         print(strcat("  delayspawn: ", ftos(particle_delayspawn), "\n"));
737         print(strcat("  delaycollision: ", ftos(particle_delaycollision), "\n"));
738         print(strcat("  angle: ", ftos(particle_angle), "\n"));
739         print(strcat("  spin: ", ftos(particle_spin), "\n"));
740 }
741
742 // DP_CSQC_ENTITYTRANSPARENTSORTING_OFFSET
743 // idea: VorteX
744 // darkplaces implementation: VorteX
745 float RF_USETRANSPARENTOFFSET = 64; // enables transparent origin offsetting
746 // global definitions
747 float transparent_offset; // should be set before entity is added
748 // description: offset a model's meshes origin used for transparent sorting. Could be used to tweak sorting bugs on very large transparent entities or hacking transparent sorting order for certain objects
749 // example: transparent_offset = 1000000; // entity always appear on background of other transparents
750 // note: offset is done in view forward axis
751
752 // DP_CSQC_ENTITYWORLDOBJECT
753 // idea: VorteX
754 // darkplaces implementation: VorteX
755 const float RF_WORLDOBJECT = 128;
756 // description: when renderflag is set, engine will not use culling methods for this entity, e.g. it will always be drawn
757 // useful for large outdoor objects (like asteroids on sky horizon or sky models)
758
759 // DP_CSQC_ENTITYMODELLIGHT
760 // idea: VorteX
761 // darkplaces implementation: VorteX
762 const float RF_MODELLIGHT = 4096;
763 .vector modellight_ambient;
764 .vector modellight_diffuse;
765 .vector modellight_dir;
766 // description: allows CSQC to override directional model lightning on entity
767
768 // DP_CSQC_SETPAUSE
769 // idea: VorteX
770 // darkplaces implementation: VorteX
771 // builtin definitions:
772 void(float ispaused) setpause = #531;
773 // description: provides ability to set pause in local games (similar to one set once console is activated)
774 // not stopping sound/cd track, useful for inventory screens, ingame menus with input etc.
775
776 // DP_CSQC_QUERYRENDERENTITY
777 // idea: VorteX
778 // darkplaces implementation: VorteX
779 // constant definitions:
780 // render entity fields:
781 float E_ACTIVE      = 0; // float 0/1
782 float E_ORIGIN      = 1; // vector
783 float E_FORWARD     = 2; // vector
784 float E_RIGHT       = 3; // vector
785 float E_UP          = 4; // vector
786 float E_SCALE       = 5; // float
787 float E_ORIGINANDVECTORS = 6; // returns origin, + sets v_* vectors to orientation
788 float E_ALPHA       = 7; // float
789 float E_COLORMOD    = 8; // vector
790 float E_PANTSCOLOR  = 9; // vector
791 float E_SHIRTCOLOR  = 10; // vector
792 float E_SKIN        = 11; // float
793 float E_MINS        = 12; // vector
794 float E_MAXS        = 13; // vector
795 float E_ABSMIN      = 14; // vector
796 float E_ABSMAX      = 15; // vector
797 float E_LIGHT       = 16; // vector - modellight
798 // builtin definitions:
799 float(float entitynum, float fldnum) getentity = #504;
800 vector(float entitynum, float fldnum) getentityvec = #504;
801 // description: allows to query parms from render entities, especially useful with attaching CSQC ents to
802 // server entities networked and interpolated by engine (monsters, players), number of entity is it's SVQC number
803 // you can send it via tempentity/CSQC entity message. Note that this builtin doesnt know about entity removing/reallocating
804 // so it's meaning to work for short period of time, dont use it on missiles/grenades whatever will be removed next five seconds
805
806 //DP_GFX_FONTS
807 //idea: Blub\0, divVerent
808 //darkplaces implementation: Blub\0
809 //console commands:
810 //  loadfont fontname fontmaps size1 size2 ...
811 //   A font can simply be gfx/tgafile (freetype fonts doent need extension),
812 //   or alternatively you can specify multiple fonts and faces
813 //   Like this: gfx/vera-sans:2,gfx/fallback:1
814 //   to load face 2 of the font gfx/vera-sans and use face 1
815 //   of gfx/fallback as fallback font
816 //   You can also specify a list of font sizes to load, like this:
817 //   loadfont console gfx/conchars,gfx/fallback 8 12 16 24 32
818 //   In many cases, 8 12 16 24 32 should be a good choice.
819 //   for slots see:
820 //constant definitions:
821 float drawfont;            // set it before drawstring()/drawchar() calls
822 float FONT_DEFAULT = 0;    // 'default'
823 float FONT_CONSOLE = 1;    // 'console', REALLY should be fixed width (ls!)
824 float FONT_SBAR = 2;       // 'sbar', used on hud, must be fixed width
825 float FONT_NOTIFY = 3;     // 'notify', used on sprint/bprint
826 float FONT_CHAT = 4;       // 'chat'
827 float FONT_CENTERPRINT = 5;// 'centerprint'
828 float FONT_INFOBAR = 6;    // 'infobar'
829 float FONT_MENU = 7;       // 'menu', should be fixed width
830 float FONT_USER0 = 8;      // 'user0', userdefined fonts
831 float FONT_USER1 = 9;      // 'user1', userdefined fonts
832 float FONT_USER2 = 10;     // 'user2', userdefined fonts
833 float FONT_USER3 = 11;     // 'user3', userdefined fonts
834 float FONT_USER4 = 12;     // 'user4', userdefined fonts
835 float FONT_USER5 = 13;     // 'user5', userdefined fonts
836 float FONT_USER6 = 14;     // 'user6', userdefined fonts
837 float FONT_USER7 = 15;     // 'user7' slot, userdefined fonts
838 //builtin definitions:
839 float findfont(string s) = #356; // find font by fontname and return it's index
840 float loadfont(string fontname, string fontmaps, string sizes, float slot, float fix_scale, float fix_voffset) = #357;
841 // loads font immediately so stringwidth() function can be used just after builtin call
842 // returns a font slotnum (which is used to set drawfont to)
843 // first 3 parms are identical to "loadfont" console command ones
844 // slot could be one of FONT_ constants or result of findfont() or -1 to not use it
845 // if slot is given, font will be loaded to this slotnum and fontname become new title for it
846 // this way you can rename user* fonts to something more usable
847 // fix_* parms let you fix badly made fonts by applying some transformations to them
848 // fix_scale : per-character center-oriented scale (doesn't change line height at all)
849 // fix_voffset : vertical offset for each character, it's a multiplier to character height
850 float stringwidth(string text, float allowColorCodes, vector size) = #327; // get a width of string with given font and char size
851 float stringwidth_menu(string text, float allowColorCodes, vector size) = #468; // in menu.dat it has different builtin #
852 //description: engine support for custom fonts in console, hud, qc etc.
853 // limits:
854 //  max 128 chars for font name
855 //  max 3 font fallbacks
856 //  max 8 sizes per font
857
858 //DP_GFX_FONTS_FREETYPE
859 //idea: Blub\0, divVerent
860 //darkplaces implementation: Blub\0
861 //cvar definitions:
862 //   r_font_disable_freetype 0/1 : disable freetype fonts loading (uttetly disables freetype library initialization)
863 //   r_font_antialias 0/1 : antialiasing when loading font
864 //   r_font_hint 0/1/2/3  : hinting when loading font, 0 is no hinting, 1 light autohinting , 2 full autohinting, 3 full hinting
865 //   r_font_postprocess_blur X      : font outline blur amount
866 //   r_font_postprocess_outline X   : font outline width
867 //   r_font_postprocess_shadow_x X  : font outline shadow x shift amount, applied during outlining
868 //   r_font_postprocess_shadow_y X  : font outline shadow y shift amount, applied during outlining
869 //   r_font_postprocess_shadow_z X  : font outline shadow z shift amount, applied during blurring
870 //description: engine support for truetype/freetype fonts
871 //so .AFM+.PFB/.OTF/.TTF files could be stuffed as fontmaps in loadfont()
872 //(console command version will support them as well)
873
874 //DP_CSQC_BINDMAPS
875 //idea: daemon, motorsep
876 //darkplaces implementation: divVerent
877 //builtin definitions:
878 string(float key, float bindmap) getkeybind_bindmap = #342;
879 float(float key, string bind, float bindmap) setkeybind_bindmap = #630;
880 vector(void) getbindmaps = #631;
881 float(vector bm) setbindmaps = #632;
882 string(string command, float bindmap) findkeysforcommand = #610;
883 //<already in EXT_CSQC> float(string key) stringtokeynum = #341;
884 //<already in EXT_CSQC> string(float keynum) keynumtostring = #340;
885 //description: key bind setting/getting including support for switchable
886 //bindmaps.
887
888 //DP_CRYPTO
889 //idea: divVerent
890 //darkplaces implementation: divVerent
891 //builtin definitions: (CSQC)
892 float(string url, float id, string content_type, string delim, float buf, float keyid) crypto_uri_postbuf = #513;
893 //description:
894 //use -1 as buffer handle to justs end delim as postdata
895
896 //DP_CSQC_MAINVIEW
897 //idea: divVerent
898 //darkplaces implementation: divVerent
899 //constant definitions:
900 const float VF_MAINVIEW         = 400;
901 //use setproperty(VF_MAINVIEW, 1); before calling R_RenderView for the render
902 //that shall become the "main" view, which is e.g. used by PRYDON_CLIENTCURSOR
903 //this flag is set for the first scene, and not cleared by R_ClearScene
904 //this flag is automatically cleared by R_RenderView
905 //so when not using this extension, the first view rendered is the main view
906
907 //DP_CSQC_MINFPS_QUALITY
908 //idea: divVerent
909 //darkplaces implementation: divVerent
910 //constant definitions:
911 const float VF_MINFPS_QUALITY   = 401;
912 //use getproperty(VF_MINFPS_QUALITY); to do CSQC based LOD based on cl_minfps
913 //1 should lead to an unmodified view
914
915 //DP_CSQC_V_CALCREFDEF_WIP1
916 //DP_CSQC_V_CALCREFDEF_WIP2
917 //idea: divVerent
918 //darkplaces implementation: divVerent
919 //builtin definitions:
920 void(entity e, float refdefflags) V_CalcRefdef = #640;
921 //constant definitions:
922 float PMF_DUCKED = 4;
923 float PMF_ONGROUND = 8;
924 float REFDEFFLAG_TELEPORTED = 1;
925 float REFDEFFLAG_JUMPING = 2;
926 float REFDEFFLAG_DEAD = 4;
927 float REFDEFFLAG_INTERMISSION = 8;
928 //- use this on the player entity after performing prediction
929 //- pass REFDEFFLAG_TELEPORTED if the player teleported since last frame
930 //- pass REFDEFFLAG_JUMPING if jump button is pressed
931 //- pass REFDEFFLAG_DEAD if dead (DP_CSQC_V_CALCREFDEF_WIP2)
932 //- pass REFDEFFLAG_INTERMISSION if in intermission (DP_CSQC_V_CALCREFDEF_WIP2)
933 //- the player entity needs to have origin, velocity, pmove_flags set according
934 //  to prediction (the above two PMF_ flags are used in the player's pmove_flags)
935 //- NOTE: to check for this, ALSO OR a check with DP_CSQC_V_CALCREFDEF to also support
936 //  the finished extension once done
937
938 // assorted builtins
939 float   drawsubpic(vector position, vector size, string pic, vector srcPosition, vector srcSize, vector rgb, float alpha, float flag) = #328;
940 vector  drawgetimagesize(string pic) = #318;
941 #define SPA_POSITION 0
942 #define SPA_S_AXIS 1
943 #define SPA_T_AXIS 2
944 #define SPA_R_AXIS 3
945 #define SPA_TEXCOORDS0 4
946 #define SPA_LIGHTMAP0_TEXCOORDS 5
947 #define SPA_LIGHTMAP_COLOR 6
948 // float (entity e, float s)                                            getsurfacenumpoints = #434;
949 // vector (entity e, float s, float n)                                  getsurfacepoint = #435;
950 // vector (entity e, float s)                                           getsurfacenormal = #436;
951 // string (entity e, float s)                                           getsurfacetexture = #437;
952 // float (entity e, vector p)                                           getsurfacenearpoint = #438;
953 // vector (entity e, float s, vector p)                                 getsurfaceclippedpoint = #439;
954 // vector(entity e, float s, float n, float a) getsurfacepointattribute = #486;
955 float(entity e, float s) getsurfacenumtriangles = #628;
956 vector(entity e, float s, float n) getsurfacetriangle = #629;
957
958 //DP_QC_ASINACOSATANATAN2TAN
959 //idea: Urre
960 //darkplaces implementation: LadyHavoc
961 //constant definitions:
962 float DEG2RAD = 0.0174532925199432957692369076848861271344287188854172545609719144;
963 float RAD2DEG = 57.2957795130823208767981548141051703324054724665643215491602438612;
964 float PI      = 3.1415926535897932384626433832795028841971693993751058209749445923;
965 //builtin definitions:
966 /* -Wdouble-declaration
967 float(float s) asin = #471; // returns angle in radians for a given sin() value, the result is in the range -PI*0.5 to PI*0.5
968 float(float c) acos = #472; // returns angle in radians for a given cos() value, the result is in the range 0 to PI
969 float(float t) atan = #473; // returns angle in radians for a given tan() value, the result is in the range -PI*0.5 to PI*0.5
970 float(float c, float s) atan2 = #474; // returns angle in radians for a given cos() and sin() value pair, the result is in the range -PI to PI (this is identical to vectoyaw except it returns radians rather than degrees)
971 float(float a) tan = #475; // returns tangent value (which is simply sin(a)/cos(a)) for the given angle in radians, the result is in the range -infinity to +infinity
972 */
973 //description:
974 //useful math functions for analyzing vectors, note that these all use angles in radians (just like the cos/sin functions) not degrees unlike makevectors/vectoyaw/vectoangles, so be sure to do the appropriate conversions (multiply by DEG2RAD or RAD2DEG as needed).
975 //note: atan2 can take unnormalized vectors (just like vectoyaw), and the function was included only for completeness (more often you want vectoyaw or vectoangles), atan2(v_x,v_y) * RAD2DEG gives the same result as vectoyaw(v)
976
977 //DP_QC_SPRINTF
978 //idea: divVerent
979 //darkplaces implementation: divVerent
980 //builtin definitions:
981 string(string format, ...) sprintf = #627;
982 //description:
983 //you know sprintf :P
984 //supported stuff:
985 //  %
986 //  optional: <argpos>$ for the argument to format (the arg counter then is not increased)
987 //  flags: #0- +
988 //  optional: <width>, *, or *<argpos>$ for the field width (width is read before value and precision)
989 //  optional: .<precision>, .*, or .*<argpos>$ for the precision (precision is read before value)
990 //  length modifiers: h for forcing a float, l for forcing an int/entity (by default, %d etc. cast a float to int)
991 //  conversions:
992 //    d takes a float if no length is specified or h is, and an int/entity if l is specified as length, and cast it to an int
993 //    i takes an int/entity if no length is specified or i is, and a float if h is specified as length, and cast it to an int
994 //    ouxXc take a float if no length is specified or h is, and an int/entity if l is specified as length, and cast it to an unsigned int
995 //    eEfFgG take a float if no length is specified or h is, and an int/entity if l is specified as length, and cast it to a double
996 //    s takes a string
997 //    vV takes a vector, and processes the three components as if it were a gG for all three components, separated by space
998 //    For conversions s and c, the flag # makes precision and width interpreted
999 //      as byte count, by default it is interpreted as character count in UTF-8
1000 //      enabled engines. No other conversions can create wide characters, and #
1001 //      has another meaning in these.
1002
1003 //DP_QC_GETTIME
1004 //idea: tZork
1005 //darkplaces implementation: tZork, divVerent
1006 //constant definitions:
1007 float GETTIME_FRAMESTART = 0; // time of start of frame
1008 float GETTIME_REALTIME = 1; // current time (may be OS specific)
1009 float GETTIME_HIRES = 2; // like REALTIME, but may reset between QC invocations and thus can be higher precision
1010 float GETTIME_UPTIME = 3; // time since start of the engine
1011 //builtin definitions:
1012 float(float tmr) gettime = #519;
1013 //description:
1014 //some timers to query...
1015
1016 //DP_QC_GETTIME_CDTRACK
1017 //idea: divVerent
1018 //darkplaces implementation: divVerent
1019 //constant definitions:
1020 float GETTIME_CDTRACK = 4;
1021 //description:
1022 //returns the playing time of the current cdtrack when passed to gettime()
1023 //see DP_END_GETSOUNDTIME for similar functionality but for entity sound channels
1024
1025 //DP_QC_TOKENIZEBYSEPARATOR
1026 //idea: Electro, SavageX, LadyHavoc
1027 //darkplaces implementation: LadyHavoc
1028 //builtin definitions:
1029 float(string s, string separator1, ...) tokenizebyseparator = #479;
1030 //description:
1031 //this function returns tokens separated by any of the supplied separator strings, example:
1032 //numnumbers = tokenizebyseparator("10.2.3.4", ".");
1033 //returns 4 and the tokens are "10" "2" "3" "4"
1034 //possibly useful for parsing IPv4 addresses (such as "1.2.3.4") and IPv6 addresses (such as "[1234:5678:9abc:def0:1234:5678:9abc:def0]:26000")
1035
1036 //DP_QC_TOKENIZE_CONSOLE
1037 //idea: divVerent
1038 //darkplaces implementation: divVerent
1039 //builtin definitions:
1040 float(string s) tokenize_console = #514;
1041 float(float i) argv_start_index = #515;
1042 float(float i) argv_end_index = #516;
1043 //description:
1044 //this function returns tokens separated just like the console does
1045 //also, functions are provided to get the index of the first and last character of each token in the original string
1046 //Passing negative values to them, or to argv, will be treated as indexes from the LAST token (like lists work in Perl). So argv(-1) will return the LAST token.
1047
1048 //DP_SND_SOUND7_WIP1
1049 //DP_SND_SOUND7_WIP2
1050 //idea: divVerent
1051 //darkplaces implementation: divVerent
1052 //builtin definitions:
1053 void(entity e, float chan, string samp, float vol, float atten, float speed, float flags) sound7 = #8;
1054 float SOUNDFLAG_RELIABLE = 1;
1055 //description:
1056 //plays a sound, with some more flags
1057 //extensions to sound():
1058 //- channel may be in the range from -128 to 127; channels -128 to 0 are "auto",
1059 //  i.e. support multiple sounds at once, but cannot be stopped/restarted
1060 //- a value 0 in the speed parameter means no change; otherwise, it is a
1061 //  percentage of playback speed ("pitch shifting"). 100 is normal pitch, 50 is
1062 //  half speed, 200 is double speed, etc. (DP_SND_SOUND7_WIP2)
1063 //- the flag SOUNDFLAG_RELIABLE can be specified, which makes the sound send
1064 //  to MSG_ALL (reliable) instead of MSG_BROADCAST (unreliable, default);
1065 //  similarily, SOUNDFLAG_RELIABLE_TO_ONE sends to MSG_ONE
1066 //- channel 0 is controlled by snd_channel0volume; channel 1 and -1 by
1067 //  snd_channel1volume, etc. (so, a channel shares the cvar with its respective
1068 //  auto-channel); however, the mod MUST define snd_channel8volume and upwards
1069 //  in default.cfg if they are to be used, as the engine does not create them
1070 //  to not litter the cvar list
1071 //- this extension applies to CSQC as well; CSQC_Event_Sound will get speed and
1072 //  flags as extra 7th and 8th argument
1073 //- WIP2 ideas: SOUNDFLAG_RELIABLE_TO_ONE, SOUNDFLAG_NOPHS, SOUNDFLAG_FORCELOOP
1074 //- NOTE: to check for this, ALSO OR a check with DP_SND_SOUND7 to also support
1075 //  the finished extension once done
1076
1077 //DP_PRECACHE_PIC_FLAGS
1078 //idea: divVerent
1079 //darkplaces implementation: divVerent
1080 //constant definitions:
1081 float PRECACHE_PIC_FROMWAD = 1; // this one actually is part of EXT_CSQC
1082 float PRECACHE_PIC_NOTPERSISTENT = 2; // picture may get deallocated when unused
1083 float PRECACHE_PIC_MIPMAP = 8; // mipmap the texture for possibly better downscaling at memory expense
1084 //notes: these constants are given as optional second argument to precache_pic()
1085
1086 //DP_QC_TRACE_MOVETYPE_WORLDONLY
1087 //idea: LadyHavoc
1088 //darkplaces implementation: LadyHavoc
1089 //constant definitions:
1090 float MOVE_WORLDONLY = 3;
1091 //description:
1092 //allows traces to hit only world (ignoring all entities, unlike MOVE_NOMONSTERS which hits all bmodels), use as the nomonsters parameter to trace functions
1093
1094 //DP_SND_GETSOUNDTIME
1095 //idea: VorteX
1096 //darkplaces implementation: VorteX
1097 //constant definitions:
1098 float(entity e, float channel) getsoundtime = #533; // get currently sound playing position on entity channel, -1 if not playing or error
1099 float(string sample) soundlength = #534; // returns length of sound sample in seconds, -1 on error (sound not precached, sound system not initialized etc.)
1100 //description: provides opportunity to query length of sound samples and realtime tracking of sound playing on entities (similar to DP_GETTIME_CDTRACK)
1101 //note: beware dedicated server not running sound engine at all, so in dedicated mode this builtins will not work in server progs
1102 //note also: menu progs not supporting getsoundtime() (will give a warning) since it has no sound playing on entities
1103 //examples of use:
1104 //  - QC-driven looped sounds
1105 //  - QC events when sound playing is finished
1106 //  - toggleable ambientsounds
1107 //  - subtitles
1108
1109 //DP_QC_NUM_FOR_EDICT
1110 //idea: Blub\0
1111 //darkplaces implementation: Blub\0
1112 //Function to get the number of an entity - a clean way.
1113 float(entity num) num_for_edict = #512;
1114
1115 //DP_TRACE_HITCONTENTSMASK_SURFACEINFO
1116 //idea: LadyHavoc
1117 //darkplaces implementation: LadyHavoc
1118 //globals:
1119 .float dphitcontentsmask; // if non-zero on the entity passed to traceline/tracebox/tracetoss this will override the normal collidable contents rules and instead hit these contents values (for example AI can use tracelines that hit DONOTENTER if it wants to, by simply changing this field on the entity passed to traceline), this affects normal movement as well as trace calls
1120 float trace_dpstartcontents; // DPCONTENTS_ value at start position of trace
1121 float trace_dphitcontents; // DPCONTENTS_ value of impacted surface (not contents at impact point, just contents of the surface that was hit)
1122 float trace_dphitq3surfaceflags; // Q3SURFACEFLAG_ value of impacted surface
1123 string trace_dphittexturename; // texture name of impacted surface
1124 //constants:
1125 float DPCONTENTS_SOLID = 1; // hit a bmodel, not a bounding box
1126 float DPCONTENTS_WATER = 2;
1127 float DPCONTENTS_SLIME = 4;
1128 float DPCONTENTS_LAVA = 8;
1129 float DPCONTENTS_SKY = 16;
1130 float DPCONTENTS_BODY = 32; // hit a bounding box, not a bmodel
1131 float DPCONTENTS_CORPSE = 64; // hit a SOLID_CORPSE entity
1132 float DPCONTENTS_NODROP = 128; // an area where backpacks should not spawn
1133 float DPCONTENTS_PLAYERCLIP = 256; // blocks player movement
1134 float DPCONTENTS_MONSTERCLIP = 512; // blocks monster movement
1135 float DPCONTENTS_DONOTENTER = 1024; // AI hint brush
1136 float DPCONTENTS_LIQUIDSMASK = 14; // WATER | SLIME | LAVA
1137 float DPCONTENTS_BOTCLIP = 2048; // AI hint brush
1138 float DPCONTENTS_OPAQUE = 4096; // only fully opaque brushes get this (may be useful for line of sight checks)
1139 float Q3SURFACEFLAG_NODAMAGE = 1;
1140 float Q3SURFACEFLAG_SLICK = 2; // low friction surface
1141 float Q3SURFACEFLAG_SKY = 4; // sky surface (also has NOIMPACT and NOMARKS set)
1142 float Q3SURFACEFLAG_LADDER = 8; // climbable surface
1143 float Q3SURFACEFLAG_NOIMPACT = 16; // projectiles should remove themselves on impact (this is set on sky)
1144 float Q3SURFACEFLAG_NOMARKS = 32; // projectiles should not leave marks, such as decals (this is set on sky)
1145 float Q3SURFACEFLAG_FLESH = 64; // projectiles should do a fleshy effect (blood?) on impact
1146 float Q3SURFACEFLAG_NODRAW = 128; // compiler hint (not important to qc)
1147 //float Q3SURFACEFLAG_HINT = 256; // compiler hint (not important to qc)
1148 //float Q3SURFACEFLAG_SKIP = 512; // compiler hint (not important to qc)
1149 //float Q3SURFACEFLAG_NOLIGHTMAP = 1024; // compiler hint (not important to qc)
1150 //float Q3SURFACEFLAG_POINTLIGHT = 2048; // compiler hint (not important to qc)
1151 float Q3SURFACEFLAG_METALSTEPS = 4096; // walking on this surface should make metal step sounds
1152 float Q3SURFACEFLAG_NOSTEPS = 8192; // walking on this surface should not make footstep sounds
1153 float Q3SURFACEFLAG_NONSOLID = 16384; // compiler hint (not important to qc)
1154 //float Q3SURFACEFLAG_LIGHTFILTER = 32768; // compiler hint (not important to qc)
1155 //float Q3SURFACEFLAG_ALPHASHADOW = 65536; // compiler hint (not important to qc)
1156 //float Q3SURFACEFLAG_NODLIGHT = 131072; // compiler hint (not important to qc)
1157 //float Q3SURFACEFLAG_DUST = 262144; // translucent 'light beam' effect (not important to qc)
1158 //description:
1159 //adds additional information after a traceline/tracebox/tracetoss call.
1160 //also (very important) sets trace_* globals before calling .touch functions,
1161 //this allows them to inspect the nature of the collision (for example
1162 //determining if a projectile hit sky), clears trace_* variables for the other
1163 //object in a touch event (that is to say, a projectile moving will see the
1164 //trace results in its .touch function, but the player it hit will see very
1165 //little information in the trace_ variables as it was not moving at the time)
1166
1167 //DP_QC_CVAR_TYPE
1168 //idea: divVerent
1169 //DarkPlaces implementation: divVerent
1170 //builtin definitions:
1171 float(string name) cvar_type = #495;
1172 float CVAR_TYPEFLAG_EXISTS = 1;
1173 float CVAR_TYPEFLAG_SAVED = 2;
1174 float CVAR_TYPEFLAG_PRIVATE = 4;
1175 float CVAR_TYPEFLAG_ENGINE = 8;
1176 float CVAR_TYPEFLAG_HASDESCRIPTION = 16;
1177 float CVAR_TYPEFLAG_READONLY = 32;
1178
1179 //DP_QC_CRC16
1180 //idea: divVerent
1181 //darkplaces implementation: divVerent
1182 //Some hash function to build hash tables with. This has to be be the CRC-16-CCITT that is also required for the QuakeWorld download protocol.
1183 //When caseinsensitive is set, the CRC is calculated of the lower cased string.
1184 float(float caseinsensitive, string s, ...) crc16 = #494;
1185
1186 //DP_QC_URI_ESCAPE
1187 //idea: divVerent
1188 //darkplaces implementation: divVerent
1189 //URI::Escape's functionality
1190 string(string in) uri_escape = #510;
1191 string(string in) uri_unescape = #511;
1192
1193 //DP_QC_DIGEST
1194 //idea: motorsep, Spike
1195 //DarkPlaces implementation: divVerent
1196 //builtin definitions:
1197 string(string digest, string data, ...) digest_hex = #639;
1198 //description:
1199 //returns a given hex digest of given data
1200 //the returned digest is always encoded in hexadecimal
1201 //only the "MD4" digest is always supported!
1202 //if the given digest is not supported, string_null is returned
1203 //the digest string is matched case sensitively, use "MD4", not "md4"!
1204
1205 //DP_QC_DIGEST_SHA256
1206 //idea: motorsep, Spike
1207 //DarkPlaces implementation: divVerent
1208 //description:
1209 //"SHA256" is also an allowed digest type
1210
1211 //DP_QC_LOG
1212 //darkplaces implementation: divVerent
1213 //builtin definitions:
1214 float log(float f) = #532;
1215 //description:
1216 //logarithm
1217
1218 //FTE_CSQC_SKELETONOBJECTS
1219 //idea: Spike, LadyHavoc
1220 //darkplaces implementation: LadyHavoc
1221 //builtin definitions:
1222 // all skeleton numbers are 1-based (0 being no skeleton)
1223 // all bone numbers are 1-based (0 being invalid)
1224 float(float modlindex) skel_create = #263; // create a skeleton (be sure to assign this value into .skeletonindex for use), returns skeleton index (1 or higher) on success, returns 0 on failure (for example if the modelindex is not skeletal), it is recommended that you create a new skeleton if you change modelindex, as the skeleton uses the hierarchy from the model.
1225 float(float skel, entity ent, float modlindex, float retainfrac, float firstbone, float lastbone) skel_build = #264; // blend in a percentage of standard animation, 0 replaces entirely, 1 does nothing, 0.5 blends half, etc, and this only alters the bones in the specified range for which out of bounds values like 0,100000 are safe (uses .frame, .frame2, .frame3, .frame4, .lerpfrac, .lerpfrac3, .lerpfrac4, .frame1time, .frame2time, .frame3time, .frame4time), returns skel on success, 0 on failure
1226 float(float skel) skel_get_numbones = #265; // returns how many bones exist in the created skeleton, 0 if skeleton does not exist
1227 string(float skel, float bonenum) skel_get_bonename = #266; // returns name of bone (as a tempstring), "" if invalid bonenum (< 1 for example) or skeleton does not exist
1228 float(float skel, float bonenum) skel_get_boneparent = #267; // returns parent num for supplied bonenum, 0 if bonenum has no parent or bone does not exist (returned value is always less than bonenum, you can loop on this)
1229 float(float skel, string tagname) skel_find_bone = #268; // get number of bone with specified name, 0 on failure, bonenum (1-based) on success, same as using gettagindex but takes modelindex instead of entity
1230 vector(float skel, float bonenum) skel_get_bonerel = #269; // get matrix of bone in skeleton relative to its parent - sets v_forward, v_right, v_up, returns origin (relative to parent bone)
1231 vector(float skel, float bonenum) skel_get_boneabs = #270; // get matrix of bone in skeleton in model space - sets v_forward, v_right, v_up, returns origin (relative to entity)
1232 void(float skel, float bonenum, vector org) skel_set_bone = #271; // set matrix of bone relative to its parent, reads v_forward, v_right, v_up, takes origin as parameter (relative to parent bone)
1233 void(float skel, float bonenum, vector org) skel_mul_bone = #272; // transform bone matrix (relative to its parent) by the supplied matrix in v_forward, v_right, v_up, takes origin as parameter (relative to parent bone)
1234 void(float skel, float startbone, float endbone, vector org) skel_mul_bones = #273; // transform bone matrices (relative to their parents) by the supplied matrix in v_forward, v_right, v_up, takes origin as parameter (relative to parent bones)
1235 void(float skeldst, float skelsrc, float startbone, float endbone) skel_copybones = #274; // copy bone matrices (relative to their parents) from one skeleton to another, useful for copying a skeleton to a corpse
1236 void(float skel) skel_delete = #275; // deletes skeleton at the beginning of the next frame (you can add the entity, delete the skeleton, renderscene, and it will still work)
1237 float(float modlindex, string framename) frameforname = #276; // finds number of a specified frame in the animation, returns -1 if no match found
1238 float(float modlindex, float framenum) frameduration = #277; // returns the intended play time (in seconds) of the specified framegroup, if it does not exist the result is 0, if it is a single frame it may be a small value around 0.1 or 0.
1239 //fields:
1240 .float skeletonindex; // active skeleton overriding standard animation on model
1241 .float frame; // primary framegroup animation (strength = 1 - lerpfrac - lerpfrac3 - lerpfrac4)
1242 .float frame2; // secondary framegroup animation (strength = lerpfrac)
1243 .float frame3; // tertiary framegroup animation (strength = lerpfrac3)
1244 .float frame4; // quaternary framegroup animation (strength = lerpfrac4)
1245 .float lerpfrac; // strength of framegroup blend
1246 .float lerpfrac3; // strength of framegroup blend
1247 .float lerpfrac4; // strength of framegroup blend
1248 .float frame1time; // start time of framegroup animation
1249 .float frame2time; // start time of framegroup animation
1250 .float frame3time; // start time of framegroup animation
1251 .float frame4time; // start time of framegroup animation
1252 //description:
1253 //this extension provides a way to do complex skeletal animation on an entity.
1254 //
1255 //see also DP_SKELETONOBJECTS (this extension implemented on server as well as client)
1256 //
1257 //notes:
1258 //each model contains its own skeleton, reusing a skeleton with incompatible models will yield garbage (or not render).
1259 //each model contains its own animation data, you can use animations from other model files (for example saving out all character animations as separate model files).
1260 //if an engine supports loading an animation-only file format such as .md5anim in FTEQW, it can be used to animate any model with a compatible skeleton.
1261 //proper use of this extension may require understanding matrix transforms (v_forward, v_right, v_up, origin), and you must keep in mind that v_right is negative for this purpose.
1262 //
1263 //features include:
1264 //multiple animations blended together.
1265 //animating a model with animations from another model with a compatible skeleton.
1266 //restricting animation blends to certain bones of a model - for example independent animation of legs, torso, head.
1267 //custom bone controllers - for example making eyes track a target location.
1268 //
1269 //
1270 //
1271 //example code follows...
1272 //
1273 //this helper function lets you identify (by parentage) what group a bone
1274 //belongs to - for example "torso", "leftarm", would return 1 ("torso") for
1275 //all children of the bone named "torso", unless they are children of
1276 //"leftarm" (which is a child of "torso") which would return 2 instead...
1277 float(float skel, float bonenum, string g1, string g2, string g3, string g4, string g5, string g6) example_skel_findbonegroup =
1278 {
1279         local string bonename;
1280         while (bonenum >= 0)
1281         {
1282                 bonename = skel_get_bonename(skel, bonenum);
1283                 if (bonename == g1) return 1;
1284                 if (bonename == g2) return 2;
1285                 if (bonename == g3) return 3;
1286                 if (bonename == g4) return 4;
1287                 if (bonename == g5) return 5;
1288                 if (bonename == g6) return 6;
1289                 bonenum = skel_get_boneparent(skel, bonenum);
1290         }
1291         return 0;
1292 };
1293 // create a skeletonindex for our player using current modelindex
1294 void() example_skel_player_setup =
1295 {
1296         self.skeletonindex = skel_create(self.modelindex);
1297 };
1298 // setup bones of skeleton based on an animation
1299 // note: animmodelindex can be a different model than self.modelindex
1300 void(float animmodelindex, float framegroup, float framegroupstarttime) example_skel_player_update_begin =
1301 {
1302         // start with our standard animation
1303         self.frame = framegroup;
1304         self.frame2 = 0;
1305         self.frame3 = 0;
1306         self.frame4 = 0;
1307         self.frame1time = framegroupstarttime;
1308         self.frame2time = 0;
1309         self.frame3time = 0;
1310         self.frame4time = 0;
1311         self.lerpfrac = 0;
1312         self.lerpfrac3 = 0;
1313         self.lerpfrac4 = 0;
1314         skel_build(self.skeletonindex, self, animmodelindex, 0, 0, 100000);
1315 };
1316 // apply a different framegroup animation to bones with a specified parent
1317 void(float animmodelindex, float framegroup, float framegroupstarttime, float blendalpha, string groupbonename, string excludegroupname1, string excludegroupname2) example_skel_player_update_applyoverride =
1318 {
1319         local float bonenum;
1320         local float numbones;
1321         self.frame = framegroup;
1322         self.frame2 = 0;
1323         self.frame3 = 0;
1324         self.frame4 = 0;
1325         self.frame1time = framegroupstarttime;
1326         self.frame2time = 0;
1327         self.frame3time = 0;
1328         self.frame4time = 0;
1329         self.lerpfrac = 0;
1330         self.lerpfrac3 = 0;
1331         self.lerpfrac4 = 0;
1332         bonenum = 0;
1333         numbones = skel_get_numbones(self.skeletonindex);
1334         while (bonenum < numbones)
1335         {
1336                 if (example_skel_findbonegroup(self.skeletonindex, bonenum, groupbonename, excludegroupname1, excludegroupname2, "", "", "") == 1)
1337                         skel_build(self.skeletonindex, self, animmodelindex, 1 - blendalpha, bonenum, bonenum + 1);
1338                 bonenum = bonenum + 1;
1339         }
1340 };
1341 // make eyes point at a target location, be sure v_forward, v_right, v_up are set correctly before calling
1342 void(vector eyetarget, string bonename) example_skel_player_update_eyetarget =
1343 {
1344         local float bonenum;
1345         local vector ang;
1346         local vector oldforward, oldright, oldup;
1347         local vector relforward, relright, relup, relorg;
1348         local vector boneforward, boneright, boneup, boneorg;
1349         local vector parentforward, parentright, parentup, parentorg;
1350         local vector u, v;
1351         local vector modeleyetarget;
1352         bonenum = skel_find_bone(self.skeletonindex, bonename) - 1;
1353         if (bonenum < 0)
1354                 return;
1355         oldforward = v_forward;
1356         oldright = v_right;
1357         oldup = v_up;
1358         v = eyetarget - self.origin;
1359         modeleyetarget_x =   v * v_forward;
1360         modeleyetarget_y = 0-v * v_right;
1361         modeleyetarget_z =   v * v_up;
1362         // this is an eyeball, make it point at the target location
1363         // first get all the data we can...
1364         relorg = skel_get_bonerel(self.skeletonindex, bonenum);
1365         relforward = v_forward;
1366         relright = v_right;
1367         relup = v_up;
1368         boneorg = skel_get_boneabs(self.skeletonindex, bonenum);
1369         boneforward = v_forward;
1370         boneright = v_right;
1371         boneup = v_up;
1372         parentorg = skel_get_boneabs(self.skeletonindex, skel_get_boneparent(self.skeletonindex, bonenum));
1373         parentforward = v_forward;
1374         parentright = v_right;
1375         parentup = v_up;
1376         // get the vector from the eyeball to the target
1377         u = modeleyetarget - boneorg;
1378         // now transform it inversely by the parent matrix to produce new rel vectors
1379         v_x = u * parentforward;
1380         v_y = u * parentright;
1381         v_z = u * parentup;
1382         ang = vectoangles2(v, relup);
1383         ang_x = 0 - ang_x;
1384         makevectors(ang);
1385         // set the relative bone matrix
1386         skel_set_bone(self.skeletonindex, bonenum, relorg);
1387         // restore caller's v_ vectors
1388         v_forward = oldforward;
1389         v_right = oldright;
1390         v_up = oldup;
1391 };
1392 // delete skeleton when we're done with it
1393 // note: skeleton remains valid until next frame when it is really deleted
1394 void() example_skel_player_delete =
1395 {
1396         skel_delete(self.skeletonindex);
1397         self.skeletonindex = 0;
1398 };
1399 //
1400 // END OF EXAMPLES FOR FTE_CSQC_SKELETONOBJECTS
1401 //
1402
1403 //DP_QC_ENTITYDATA
1404 //idea: KrimZon
1405 //darkplaces implementation: KrimZon
1406 //builtin definitions:
1407 float() numentityfields = #496;
1408 string(float fieldnum) entityfieldname = #497;
1409 float(float fieldnum) entityfieldtype = #498;
1410 string(float fieldnum, entity ent) getentityfieldstring = #499;
1411 float(float fieldnum, entity ent, string s) putentityfieldstring = #500;
1412 //constants:
1413 //Returned by entityfieldtype
1414 float FIELD_STRING   = 1;
1415 float FIELD_FLOAT    = 2;
1416 float FIELD_VECTOR   = 3;
1417 float FIELD_ENTITY   = 4;
1418 float FIELD_FUNCTION = 6;
1419 //description:
1420 //Versatile functions intended for storing data from specific entities between level changes, but can be customized for some kind of partial savegame.
1421 //WARNING: .entity fields cannot be saved and restored between map loads as they will leave dangling pointers.
1422 //numentityfields returns the number of entity fields. NOT offsets. Vectors comprise 4 fields: v, v_x, v_y and v_z.
1423 //entityfieldname returns the name as a string, eg. "origin" or "classname" or whatever.
1424 //entityfieldtype returns a value that the constants represent, but the field may be of another type in more exotic progs.dat formats or compilers.
1425 //getentityfieldstring returns data as would be written to a savegame, eg... "0.05" (float), "0 0 1" (vector), or "Hello World!" (string). Function names can also be returned.
1426 //putentityfieldstring puts the data returned by getentityfieldstring back into the entity.
1427
1428 //DP_QC_ENTITYSTRING
1429 void(string s) loadfromdata = #529;
1430 void(string s) loadfromfile = #530;
1431 void(string s) callfunction = #605;
1432 void(float fh, entity e) writetofile = #606;
1433 float(string s) isfunction = #607;
1434 void(entity e, string s) parseentitydata = #608;
1435
1436 //DP_COVERAGE
1437 //idea: divVerent
1438 //darkplaces implementation: divVerent
1439 //function definitions:
1440 void coverage() = #642;  // Reports a coverage event. The engine counts for each of the calls to this builtin whether it has been called.
1441
1442 //DP_QC_FS_SEARCH_PACKFILE
1443 //idea: Mario
1444 //darkplaces implementation: Mario
1445 //builtin definitions:
1446 float(string pattern, float caseinsensitive, float quiet, string packfile) search_packfile_begin = #444;
1447 //description:
1448 //extension to search_begin (DP_QC_FS_SEARCH), performs a filename search with the specified pattern (for example "maps/*.bsp") and stores the results in a search slot (minimum of 128 supported by any engine with this extension), the other functions take this returned search slot number, be sure to search_free when done (they are also freed on progs reload).
1449 //only searches for files within the specified packfile, which is expected to match the results of whichpack().
1450
1451 // assorted builtins
1452 const float             STAT_MOVEVARS_TICRATE           = 240;
1453 const float             STAT_MOVEVARS_TIMESCALE         = 241;
1454 const float             STAT_FRAGLIMIT                                  = 235;
1455 const float             STAT_TIMELIMIT                                  = 236;
1456 const float     STAT_MOVEVARS_GRAVITY           = 242;
1457 string(void)                                            ReadPicture = #501;
1458 float PARTICLES_USEALPHA = 1;
1459 float particles_alphamin, particles_alphamax;
1460 float PARTICLES_USECOLOR = 2;
1461 vector particles_colormin, particles_colormax;
1462 float PARTICLES_USEFADE = 4;  // fades the COUNT (fade alpha using alphamin/alphamax)
1463 float particles_fade;
1464 float PARTICLES_DRAWASTRAIL = 128;
1465 void(float effectindex, entity own, vector org_from, vector org_to, vector dir_from, vector dir_to, float countmultiplier, float flags) boxparticles = #502;
1466 float trace_networkentity;
1467 const float RF_FULLBRIGHT       = 256;
1468 const float RF_NOSHADOW = 512;
1469 float RF_DYNAMICMODELLIGHT = 8192;
1470
1471 float gettaginfo_parent;
1472 string gettaginfo_name;
1473 vector gettaginfo_offset;
1474 vector gettaginfo_forward;
1475 vector gettaginfo_right;
1476 vector gettaginfo_up;
1477 float checkpvs(vector viewpos, entity viewee) = #240;
1478 float mod(float dividend, float divisor) = #245;