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