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