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