DarkPlaces
Game engine based on the Quake 1 engine by id Software, developed by LadyHavoc
 
svvm_cmds.c
Go to the documentation of this file.
1#include "quakedef.h"
2
3#include "prvm_cmds.h"
4#include "jpeg.h"
5
6//============================================================================
7// Server
8
9
10
11const char *vm_sv_extensions[] = {
12"BX_WAL_SUPPORT",
13"DP_BUTTONCHAT",
14"DP_BUTTONUSE",
15"DP_CL_LOADSKY",
16"DP_CON_ALIASPARAMETERS",
17"DP_CON_BESTWEAPON",
18"DP_CON_EXPANDCVAR",
19"DP_CON_SET",
20"DP_CON_SETA",
21"DP_CON_STARTMAP",
22"DP_COVERAGE",
23"DP_CRYPTO",
24"DP_CSQC_BINDMAPS",
25"DP_CSQC_ENTITYWORLDOBJECT",
26"DP_CSQC_ENTITYMODELLIGHT",
27"DP_CSQC_ENTITYTRANSPARENTSORTING_OFFSET",
28"DP_CSQC_MAINVIEW",
29"DP_CSQC_MINFPS_QUALITY",
30"DP_CSQC_MULTIFRAME_INTERPOLATION",
31"DP_CSQC_BOXPARTICLES",
32"DP_CSQC_SPAWNPARTICLE",
33"DP_CSQC_QUERYRENDERENTITY",
34"DP_CSQC_ROTATEMOVES",
35"DP_CSQC_SETPAUSE",
36"DP_CSQC_V_CALCREFDEF_WIP1",
37"DP_CSQC_V_CALCREFDEF_WIP2",
38"DP_EF_ADDITIVE",
39"DP_EF_BLUE",
40"DP_EF_DOUBLESIDED",
41"DP_EF_DYNAMICMODELLIGHT",
42"DP_EF_FLAME",
43"DP_EF_FULLBRIGHT",
44"DP_EF_NODEPTHTEST",
45"DP_EF_NODRAW",
46"DP_EF_NOGUNBOB",
47"DP_EF_NOSELFSHADOW",
48"DP_EF_NOSHADOW",
49"DP_EF_RED",
50"DP_EF_RESTARTANIM_BIT",
51"DP_EF_STARDUST",
52"DP_EF_TELEPORT_BIT",
53"DP_ENT_ALPHA",
54"DP_ENT_COLORMOD",
55"DP_ENT_CUSTOMCOLORMAP",
56"DP_ENT_EXTERIORMODELTOCLIENT",
57"DP_ENT_GLOW",
58"DP_ENT_GLOWMOD",
59"DP_ENT_LOWPRECISION",
60"DP_ENT_SCALE",
61"DP_ENT_TRAILEFFECTNUM",
62"DP_ENT_VIEWMODEL",
63"DP_GFX_EXTERNALTEXTURES",
64"DP_GFX_EXTERNALTEXTURES_PERMAP",
65"DP_GFX_FOG",
66"DP_GFX_MODEL_INTERPOLATION",
67"DP_GFX_QUAKE3MODELTAGS",
68"DP_GFX_SKINFILES",
69"DP_GFX_SKYBOX",
70"DP_GFX_FONTS",
71"DP_GFX_FONTS_FREETYPE",
72"DP_UTF8",
73"DP_FONT_VARIABLEWIDTH",
74"DP_HALFLIFE_MAP",
75"DP_HALFLIFE_MAP_CVAR",
76"DP_HALFLIFE_SPRITE",
77"DP_INPUTBUTTONS",
78"DP_LIGHTSTYLE_STATICVALUE",
79"DP_LITSPRITES",
80"DP_LITSUPPORT",
81"DP_MONSTERWALK",
82"DP_MOVETYPEBOUNCEMISSILE",
83"DP_MOVETYPEFLYWORLDONLY",
84"DP_MOVETYPEFOLLOW",
85"DP_NULL_MODEL",
86"DP_QC_ASINACOSATANATAN2TAN",
87"DP_QC_AUTOCVARS",
88"DP_QC_CHANGEPITCH",
89"DP_QC_CMD",
90"DP_QC_COPYENTITY",
91"DP_QC_CRC16",
92"DP_QC_CVAR_DEFSTRING",
93"DP_QC_CVAR_DESCRIPTION",
94"DP_QC_CVAR_STRING",
95"DP_QC_CVAR_TYPE",
96"DP_QC_DIGEST",
97"DP_QC_DIGEST_SHA256",
98"DP_QC_EDICT_NUM",
99"DP_QC_ENTITYDATA",
100"DP_QC_ENTITYSTRING",
101"DP_QC_ETOS",
102"DP_QC_EXTRESPONSEPACKET",
103"DP_QC_FINDBOX",
104"DP_QC_FINDCHAIN",
105"DP_QC_FINDCHAINFLAGS",
106"DP_QC_FINDCHAINFLOAT",
107"DP_QC_FINDCHAIN_TOFIELD",
108"DP_QC_FINDFLAGS",
109"DP_QC_FINDFLOAT",
110"DP_QC_FS_SEARCH",
111"DP_QC_FS_SEARCH_PACKFILE",
112"DP_QC_GETLIGHT",
113"DP_QC_GETSURFACE",
114"DP_QC_GETSURFACETRIANGLE",
115"DP_QC_GETSURFACEPOINTATTRIBUTE",
116"DP_QC_GETTAGINFO",
117"DP_QC_GETTAGINFO_BONEPROPERTIES",
118"DP_QC_GETTIME",
119"DP_QC_GETTIME_CDTRACK",
120"DP_QC_I18N",
121"DP_QC_LOG",
122"DP_QC_MINMAXBOUND",
123"DP_QC_MULTIPLETEMPSTRINGS",
124"DP_QC_NUDGEOUTOFSOLID",
125"DP_QC_NUM_FOR_EDICT",
126"DP_QC_RANDOMVEC",
127"DP_QC_SINCOSSQRTPOW",
128"DP_QC_SPRINTF",
129"DP_QC_STRFTIME",
130"DP_QC_STRINGBUFFERS",
131"DP_QC_STRINGBUFFERS_CVARLIST",
132"DP_QC_STRINGBUFFERS_EXT_WIP",
133"DP_QC_STRINGCOLORFUNCTIONS",
134"DP_QC_STRING_CASE_FUNCTIONS",
135"DP_QC_STRREPLACE",
136"DP_QC_TOKENIZEBYSEPARATOR",
137"DP_QC_TOKENIZE_CONSOLE",
138"DP_QC_TRACEBOX",
139"DP_QC_TRACETOSS",
140"DP_QC_TRACE_MOVETYPE_HITMODEL",
141"DP_QC_TRACE_MOVETYPE_WORLDONLY",
142"DP_QC_UNLIMITEDTEMPSTRINGS",
143"DP_QC_URI_ESCAPE",
144"DP_QC_URI_GET",
145"DP_QC_URI_POST",
146"DP_QC_VECTOANGLES_WITH_ROLL",
147"DP_QC_VECTORVECTORS",
148"DP_QC_WHICHPACK",
149"DP_QUAKE2_MODEL",
150"DP_QUAKE2_SPRITE",
151"DP_QUAKE3_MAP",
152"DP_QUAKE3_MODEL",
153"DP_REGISTERCVAR",
154"DP_SKELETONOBJECTS",
155"DP_SND_DIRECTIONLESSATTNNONE",
156"DP_SND_FAKETRACKS",
157"DP_SND_SOUND7_WIP1",
158"DP_SND_SOUND7_WIP2",
159"DP_SND_OGGVORBIS",
160"DP_SND_SETPARAMS",
161"DP_SND_STEREOWAV",
162"DP_SND_GETSOUNDTIME",
163"DP_VIDEO_DPV",
164"DP_VIDEO_SUBTITLES",
165"DP_SOLIDCORPSE",
166"DP_SPRITE32",
167"DP_SV_BOTCLIENT",
168"DP_SV_BOUNCEFACTOR",
169"DP_SV_CLIENTCAMERA",
170"DP_SV_CLIENTCOLORS",
171"DP_SV_CLIENTNAME",
172"DP_SV_CMD",
173"DP_SV_CUSTOMIZEENTITYFORCLIENT",
174"DP_SV_DISABLECLIENTPREDICTION",
175"DP_SV_DISCARDABLEDEMO",
176"DP_SV_DRAWONLYTOCLIENT",
177"DP_SV_DROPCLIENT",
178"DP_SV_EFFECT",
179"DP_SV_ENTITYCONTENTSTRANSITION",
180"DP_SV_MODELFLAGS_AS_EFFECTS",
181"DP_SV_MOVETYPESTEP_LANDEVENT",
182"DP_SV_NETADDRESS",
183"DP_SV_NODRAWTOCLIENT",
184"DP_SV_ONENTITYNOSPAWNFUNCTION",
185"DP_SV_ONENTITYPREPOSTSPAWNFUNCTION",
186"DP_SV_PING",
187"DP_SV_PING_PACKETLOSS",
188"DP_SV_PLAYERPHYSICS",
189"DP_PHYSICS_ODE",
190"DP_SV_POINTPARTICLES",
191"DP_SV_POINTSOUND",
192"DP_SV_PRECACHEANYTIME",
193"DP_SV_PRINT",
194"DP_SV_PUNCHVECTOR",
195"DP_SV_QCSTATUS",
196"DP_SV_ROTATINGBMODEL",
197"DP_SV_SETCOLOR",
198"DP_SV_SHUTDOWN",
199"DP_SV_SLOWMO",
200"DP_SV_SPAWNFUNC_PREFIX",
201"DP_SV_WRITEPICTURE",
202"DP_SV_WRITEUNTERMINATEDSTRING",
203"DP_TE_BLOOD",
204"DP_TE_BLOODSHOWER",
205"DP_TE_CUSTOMFLASH",
206"DP_TE_EXPLOSIONRGB",
207"DP_TE_FLAMEJET",
208"DP_TE_PARTICLECUBE",
209"DP_TE_PARTICLERAIN",
210"DP_TE_PARTICLESNOW",
211"DP_TE_PLASMABURN",
212"DP_TE_QUADEFFECTS1",
213"DP_TE_SMALLFLASH",
214"DP_TE_SPARK",
215"DP_TE_STANDARDEFFECTBUILTINS",
216"DP_TRACE_HITCONTENTSMASK_SURFACEINFO"
217"DP_USERMOVETYPES",
218"DP_VIEWZOOM",
219"EXT_BITSHIFT",
220"FRIK_FILE",
221"FTE_CSQC_SKELETONOBJECTS",
222"FTE_QC_CHECKPVS",
223"FTE_STRINGS",
224"KRIMZON_SV_PARSECLIENTCOMMAND",
225"NEH_CMD_PLAY2",
226"NEH_RESTOREGAME",
227"NEXUIZ_PLAYERMODEL",
228"NXQ_GFX_LETTERBOX",
229"PRYDON_CLIENTCURSOR",
230"TENEBRAE_GFX_DLIGHTS",
231"TW_SV_STEPCONTROL",
232"ZQ_PAUSE",
233"DP_RM_CLIPGROUP",
234NULL
235//"EXT_CSQC" // not ready yet
236};
237
238/*
239=================
240VM_SV_setorigin
241
242This is the only valid way to move an object without using the physics of the world (setting velocity and waiting). Directly changing origin will not set internal links correctly, so clipping would be messed up. This should be called when an object is spawned, and then only if it is teleported.
243
244setorigin (entity, origin)
245=================
246*/
247static void VM_SV_setorigin(prvm_prog_t *prog)
248{
249 prvm_edict_t *e;
250
252
254 if (e == prog->edicts)
255 {
256 VM_Warning(prog, "setorigin: can not modify world entity\n");
257 return;
258 }
259 if (e->free)
260 {
261 VM_Warning(prog, "setorigin: can not modify free entity\n");
262 return;
263 }
267 SV_LinkEdict(e);
268}
269
270// TODO: rotate param isnt used.. could be a bug. please check this and remove it if possible [1/10/2008 Black]
271static void SetMinMaxSize (prvm_prog_t *prog, prvm_edict_t *e, float *min, float *max, qbool rotate)
272{
273 int i;
274
275 for (i=0 ; i<3 ; i++)
276 if (min[i] > max[i])
277 prog->error_cmd("SetMinMaxSize: backwards mins/maxs");
278
279// set derived values
283
284 SV_LinkEdict(e);
285}
286
287/*
288=================
289VM_SV_setsize
290
291the size box is rotated by the current angle
292LadyHavoc: no it isn't...
293
294setsize (entity, minvector, maxvector)
295=================
296*/
297static void VM_SV_setsize(prvm_prog_t *prog)
298{
299 prvm_edict_t *e;
301
303
305 if (e == prog->edicts)
306 {
307 VM_Warning(prog, "setsize: can not modify world entity\n");
308 return;
309 }
310 if (e->free)
311 {
312 VM_Warning(prog, "setsize: can not modify free entity\n");
313 return;
314 }
317 SetMinMaxSize(prog, e, mins, maxs, false);
318}
319
320
321/*
322=================
323VM_SV_setmodel
324
325setmodel(entity, model)
326=================
327*/
328static vec3_t quakemins = {-16, -16, -16}, quakemaxs = {16, 16, 16};
329static void VM_SV_setmodel(prvm_prog_t *prog)
330{
331 prvm_edict_t *e;
332 model_t *mod;
333 int i;
334
336
338 if (e == prog->edicts)
339 {
340 VM_Warning(prog, "setmodel: can not modify world entity\n");
341 return;
342 }
343 if (e->free)
344 {
345 VM_Warning(prog, "setmodel: can not modify free entity\n");
346 return;
347 }
351
353
354 if (mod)
355 {
357 SetMinMaxSize(prog, e, mod->normalmins, mod->normalmaxs, true);
358 else
359 SetMinMaxSize(prog, e, quakemins, quakemaxs, true);
360 }
361 else
362 SetMinMaxSize(prog, e, vec3_origin, vec3_origin, true);
363}
364
365/*
366=================
367VM_SV_sprint
368
369single print to a specific client
370
371sprint(clientent, value)
372=================
373*/
374static void VM_SV_sprint(prvm_prog_t *prog)
375{
376 client_t *client;
377 int entnum;
378 char string[VM_TEMPSTRING_MAXSIZE];
379
381
382 VM_VarString(prog, 1, string, sizeof(string));
383
385 // LadyHavoc: div0 requested that sprintto world operate like print
386 if (entnum == 0)
387 {
388 Con_Print(string);
389 return;
390 }
391
393 {
394 VM_Warning(prog, "tried to centerprint to a non-client\n");
395 return;
396 }
397
398 client = svs.clients + entnum-1;
399 if (!client->netconnection)
400 return;
401
403 MSG_WriteString(&client->netconnection->message, string);
404}
405
406
407/*
408=================
409VM_SV_centerprint
410
411single print to a specific client
412
413centerprint(clientent, value)
414=================
415*/
417{
418 client_t *client;
419 int entnum;
420 char string[VM_TEMPSTRING_MAXSIZE];
421
423
425
427 {
428 VM_Warning(prog, "tried to centerprint to a non-client\n");
429 return;
430 }
431
432 client = svs.clients + entnum-1;
433 if (!client->netconnection)
434 return;
435
436 VM_VarString(prog, 1, string, sizeof(string));
438 MSG_WriteString(&client->netconnection->message, string);
439}
440
441/*
442=================
443VM_SV_particle
444
445particle(origin, color, count)
446=================
447*/
462
463
464/*
465=================
466VM_SV_ambientsound
467
468=================
469*/
471{
472 const char *samp;
473 vec3_t pos;
474 prvm_vec_t vol, attenuation;
475 int soundnum, large;
476
478
480 samp = PRVM_G_STRING(OFS_PARM1);
481 vol = PRVM_G_FLOAT(OFS_PARM2);
482 attenuation = PRVM_G_FLOAT(OFS_PARM3);
483
484// check to see if samp was properly precached
485 soundnum = SV_SoundIndex(samp, 1);
486 if (!soundnum)
487 return;
488
489 large = false;
490 if (soundnum >= 256)
491 large = true;
492
494 large = false;
495
496 // add an svc_spawnambient command to the level signon packet
497
498 if (large)
500 else
502
504
506 MSG_WriteShort (&sv.signon, soundnum);
507 else
508 MSG_WriteByte (&sv.signon, soundnum);
509
510 MSG_WriteByte (&sv.signon, (int)(vol*255));
511 MSG_WriteByte (&sv.signon, (int)(attenuation*64));
512
513}
514
515/*
516=================
517VM_SV_sound
518
519Each entity can have eight independant sound sources, like voice,
520weapon, feet, etc.
521
522Channel 0 is an auto-allocate channel, the others override anything
523already running on that entity/channel pair.
524
525An attenuation of 0 will play full volume everywhere in the level.
526Larger attenuations will drop off.
527
528void(entity e, float chan, string samp, float volume[, float atten[, float pitchchange[, float flags]]]) sound (QUAKE)
529=================
530*/
531static void VM_SV_sound(prvm_prog_t *prog)
532{
533 const char *sample;
534 int channel;
536 int nvolume;
537 int flags;
538 float attenuation;
539 float pitchchange;
540
542
544 channel = (int)PRVM_G_FLOAT(OFS_PARM1);
545 sample = PRVM_G_STRING(OFS_PARM2);
546 nvolume = (int)(PRVM_G_FLOAT(OFS_PARM3) * 255);
547 if (prog->argc < 5)
548 {
549 Con_DPrintf("VM_SV_sound: given only 4 parameters, expected 5, assuming attenuation = ATTN_NORMAL\n");
550 attenuation = 1;
551 }
552 else
553 attenuation = PRVM_G_FLOAT(OFS_PARM4);
554 if (prog->argc < 6)
555 pitchchange = 0;
556 else
557 pitchchange = PRVM_G_FLOAT(OFS_PARM5) * 0.01f;
558
559 if (prog->argc < 7)
560 {
561 flags = 0;
562 if(channel >= 8 && channel <= 15) // weird QW feature
563 {
565 channel -= 8;
566 }
567 }
568 else
569 {
570 // LadyHavoc: we only let the qc set certain flags, others are off-limits
572 }
573
574 if (nvolume < 0 || nvolume > 255)
575 {
576 VM_Warning(prog, "SV_StartSound: volume must be in range 0-1\n");
577 return;
578 }
579
580 if (attenuation < 0 || attenuation > 4)
581 {
582 VM_Warning(prog, "SV_StartSound: attenuation must be in range 0-4\n");
583 return;
584 }
585
586 channel = CHAN_USER2ENGINE(channel);
587
588 if (!IS_CHAN(channel))
589 {
590 VM_Warning(prog, "SV_StartSound: channel must be in range 0-127\n");
591 return;
592 }
593
594 SV_StartSound (entity, channel, sample, nvolume, attenuation, flags & CHANNELFLAG_RELIABLE, pitchchange);
595}
596
597/*
598=================
599VM_SV_pointsound
600
601Follows the same logic as VM_SV_sound, except instead of
602an entity, an origin for the sound is provided, and channel
603is omitted (since no entity is being tracked).
604
605=================
606*/
608{
609 const char *sample;
610 int nvolume;
611 float attenuation;
612 float pitchchange;
613 vec3_t org;
614
616
618 sample = PRVM_G_STRING(OFS_PARM1);
619 nvolume = (int)(PRVM_G_FLOAT(OFS_PARM2) * 255);
620 attenuation = PRVM_G_FLOAT(OFS_PARM3);
621 pitchchange = prog->argc < 5 ? 0 : PRVM_G_FLOAT(OFS_PARM4) * 0.01f;
622
623 if (nvolume < 0 || nvolume > 255)
624 {
625 VM_Warning(prog, "SV_StartPointSound: volume must be in range 0-1\n");
626 return;
627 }
628
629 if (attenuation < 0 || attenuation > 4)
630 {
631 VM_Warning(prog, "SV_StartPointSound: attenuation must be in range 0-4\n");
632 return;
633 }
634
635 SV_StartPointSound (org, sample, nvolume, attenuation, pitchchange);
636}
637
638/*
639=================
640VM_SV_traceline
641
642Used for use tracing and shot targeting
643Traces are blocked by bbox and exact bsp entityes, and also slide box entities
644if the tryents flag is set.
645
646traceline (vector1, vector2, movetype, ignore)
647=================
648*/
649static void VM_SV_traceline(prvm_prog_t *prog)
650{
651 vec3_t v1, v2;
652 trace_t trace;
653 int move;
654 prvm_edict_t *ent;
655
656 VM_SAFEPARMCOUNTRANGE(4, 8, VM_SV_traceline); // allow more parameters for future expansion
657
658 prog->xfunction->builtinsprofile += 30;
659
662 move = (int)PRVM_G_FLOAT(OFS_PARM2);
663 ent = PRVM_G_EDICT(OFS_PARM3);
664
665 if (isnan(v1[0]) || isnan(v1[1]) || isnan(v1[2]) || isnan(v2[0]) || isnan(v2[1]) || isnan(v2[2]))
666 prog->error_cmd("%s: NAN errors detected in traceline('%f %f %f', '%f %f %f', %i, entity %i)\n", prog->name, v1[0], v1[1], v1[2], v2[0], v2[1], v2[2], move, PRVM_EDICT_TO_PROG(ent));
667
669
670 VM_SetTraceGlobals(prog, &trace);
671}
672
673
674/*
675=================
676VM_SV_tracebox
677
678Used for use tracing and shot targeting
679Traces are blocked by bbox and exact bsp entityes, and also slide box entities
680if the tryents flag is set.
681
682tracebox (vector1, vector mins, vector maxs, vector2, tryents)
683=================
684*/
685// LadyHavoc: added this for my own use, VERY useful, similar to traceline
686static void VM_SV_tracebox(prvm_prog_t *prog)
687{
688 vec3_t v1, v2, m1, m2;
689 trace_t trace;
690 int move;
691 prvm_edict_t *ent;
692
693 VM_SAFEPARMCOUNTRANGE(6, 8, VM_SV_tracebox); // allow more parameters for future expansion
694
695 prog->xfunction->builtinsprofile += 30;
696
701 move = (int)PRVM_G_FLOAT(OFS_PARM4);
702 ent = PRVM_G_EDICT(OFS_PARM5);
703
704 if (isnan(v1[0]) || isnan(v1[1]) || isnan(v1[2]) || isnan(v2[0]) || isnan(v2[1]) || isnan(v2[2]))
705 prog->error_cmd("%s: NAN errors detected in tracebox('%f %f %f', '%f %f %f', '%f %f %f', '%f %f %f', %i, entity %i)\n", prog->name, v1[0], v1[1], v1[2], m1[0], m1[1], m1[2], m2[0], m2[1], m2[2], v2[0], v2[1], v2[2], move, PRVM_EDICT_TO_PROG(ent));
706
708
709 VM_SetTraceGlobals(prog, &trace);
710}
711
713{
714 int i;
715 float gravity;
716 vec3_t move, end, tossentorigin, tossentmins, tossentmaxs;
717 vec3_t original_origin;
718 vec3_t original_velocity;
719 vec3_t original_angles;
720 vec3_t original_avelocity;
721 trace_t trace;
722
723 VectorCopy(PRVM_serveredictvector(tossent, origin) , original_origin );
724 VectorCopy(PRVM_serveredictvector(tossent, velocity) , original_velocity );
725 VectorCopy(PRVM_serveredictvector(tossent, angles) , original_angles );
726 VectorCopy(PRVM_serveredictvector(tossent, avelocity), original_avelocity);
727
728 gravity = PRVM_serveredictfloat(tossent, gravity);
729 if (!gravity)
730 gravity = 1.0f;
731 gravity *= sv_gravity.value * 0.025;
732
733 for (i = 0;i < 200;i++) // LadyHavoc: sanity check; never trace more than 10 seconds
734 {
735 SV_CheckVelocity (tossent);
736 PRVM_serveredictvector(tossent, velocity)[2] -= gravity;
738 VectorScale (PRVM_serveredictvector(tossent, velocity), 0.05, move);
739 VectorAdd (PRVM_serveredictvector(tossent, origin), move, end);
740 VectorCopy(PRVM_serveredictvector(tossent, origin), tossentorigin);
741 VectorCopy(PRVM_serveredictvector(tossent, mins), tossentmins);
742 VectorCopy(PRVM_serveredictvector(tossent, maxs), tossentmaxs);
743 trace = SV_TraceBox(tossentorigin, tossentmins, tossentmaxs, end, MOVE_NORMAL, tossent, SV_GenericHitSuperContentsMask(tossent), 0, 0, collision_extendmovelength.value);
745 PRVM_serveredictvector(tossent, velocity)[2] -= gravity;
746
747 if (trace.fraction < 1)
748 break;
749 }
750
751 VectorCopy(original_origin , PRVM_serveredictvector(tossent, origin) );
752 VectorCopy(original_velocity , PRVM_serveredictvector(tossent, velocity) );
753 VectorCopy(original_angles , PRVM_serveredictvector(tossent, angles) );
754 VectorCopy(original_avelocity, PRVM_serveredictvector(tossent, avelocity));
755
756 return trace;
757}
758
759static void VM_SV_tracetoss(prvm_prog_t *prog)
760{
761 trace_t trace;
762 prvm_edict_t *ent;
763 prvm_edict_t *ignore;
764
766
767 prog->xfunction->builtinsprofile += 600;
768
769 ent = PRVM_G_EDICT(OFS_PARM0);
770 if (ent == prog->edicts)
771 {
772 VM_Warning(prog, "tracetoss: can not use world entity\n");
773 return;
774 }
775 ignore = PRVM_G_EDICT(OFS_PARM1);
776
777 trace = SV_Trace_Toss(prog, ent, ignore);
778
779 VM_SetTraceGlobals(prog, &trace);
780}
781
782//============================================================================
783
784static unsigned char *checkpvs;
785
786static int VM_SV_newcheckclient(prvm_prog_t *prog, int check)
787{
788 int i;
789 prvm_edict_t *ent;
790 vec3_t org;
791
792// cycle to the next one
793
794 check = bound(1, check, svs.maxclients);
795 if (check == svs.maxclients)
796 i = 1;
797 else
798 i = check + 1;
799
800 for ( ; ; i++)
801 {
802 // count the cost
803 prog->xfunction->builtinsprofile++;
804 // wrap around
805 if (i == svs.maxclients+1)
806 i = 1;
807 // look up the client's edict
808 ent = PRVM_EDICT_NUM(i);
809 // check if it is to be ignored, but never ignore the one we started on (prevent infinite loop)
810 if (i != check && (ent->free || PRVM_serveredictfloat(ent, health) <= 0 || ((int)PRVM_serveredictfloat(ent, flags) & FL_NOTARGET)))
811 continue;
812 // found a valid client (possibly the same one again)
813 break;
814 }
815
816// get the PVS for the entity
818 if (sv.worldmodel && sv.worldmodel->brush.FatPVS)
819 sv.worldmodel->brush.FatPVS(sv.worldmodel, org, 0, &checkpvs, sv_mempool, false);
820 else
821 checkpvs = NULL;
822
823 return i;
824}
825
826/*
827=================
828VM_SV_checkclient
829
830Returns a client (or object that has a client enemy) that would be a
831valid target.
832
833If there is more than one valid option, they are cycled each frame
834
835If (self.origin + self.viewofs) is not in the PVS of the current target,
836it is not returned at all.
837
838name checkclient ()
839=================
840*/
843{
844 prvm_edict_t *ent, *self;
845 vec3_t view;
846
848
849 // find a new check if on a new frame
850 if (sv.time - sv.lastchecktime >= 0.1)
851 {
854 }
855
856 // return check if it might be visible
858 if (ent->free || PRVM_serveredictfloat(ent, health) <= 0)
859 {
860 VM_RETURN_EDICT(prog->edicts);
861 return;
862 }
863
864 // if current entity can't possibly see the check entity, return 0
867 if (sv.worldmodel && checkpvs && !sv.worldmodel->brush.BoxTouchingPVS(sv.worldmodel, checkpvs, view, view))
868 {
869 c_notvis++;
870 VM_RETURN_EDICT(prog->edicts);
871 return;
872 }
873
874 // might be able to see it
875 c_invis++;
876 VM_RETURN_EDICT(ent);
877}
878
879//============================================================================
880
881/*
882=================
883VM_SV_checkpvs
884
885Checks if an entity is in a point's PVS.
886Should be fast but can be inexact.
887
888float checkpvs(vector viewpos, entity viewee) = #240;
889=================
890*/
891static void VM_SV_checkpvs(prvm_prog_t *prog)
892{
893 vec3_t viewpos, absmin, absmax;
894 prvm_edict_t *viewee;
895#if 1
896 unsigned char *pvs;
897#else
898 unsigned char *fatpvs = NULL;
899#endif
900
903 viewee = PRVM_G_EDICT(OFS_PARM1);
904
905 if(viewee->free)
906 {
907 VM_Warning(prog, "checkpvs: can not check free entity\n");
909 return;
910 }
911
912#if 1
913 if(!sv.worldmodel || !sv.worldmodel->brush.GetPVS || !sv.worldmodel->brush.BoxTouchingPVS)
914 {
915 // no PVS support on this worldmodel... darn
917 return;
918 }
919 pvs = sv.worldmodel->brush.GetPVS(sv.worldmodel, viewpos);
920 if(!pvs)
921 {
922 // viewpos isn't in any PVS... darn
924 return;
925 }
928 PRVM_G_FLOAT(OFS_RETURN) = sv.worldmodel->brush.BoxTouchingPVS(sv.worldmodel, pvs, absmin, absmax);
929#else
930 // using fat PVS like FTEQW does (slow)
931 if(!sv.worldmodel || !sv.worldmodel->brush.FatPVS || !sv.worldmodel->brush.BoxTouchingPVS)
932 {
933 // no PVS support on this worldmodel... darn
935 return;
936 }
937 sv.worldmodel->brush.FatPVS(sv.worldmodel, viewpos, 8, &fatpvs, sv_mempool, false);
938 if(!fatpvs)
939 {
940 // viewpos isn't in any PVS... darn
942 return;
943 }
946 PRVM_G_FLOAT(OFS_RETURN) = sv.worldmodel->brush.BoxTouchingPVS(sv.worldmodel, fatpvs, absmin, absmax);
947#endif
948}
949
950
951/*
952=================
953VM_SV_stuffcmd
954
955Sends text over to the client's execution buffer
956
957stuffcmd (clientent, value, ...)
958=================
959*/
960static void VM_SV_stuffcmd(prvm_prog_t *prog)
961{
962 int entnum;
963 client_t *old;
964 char string[VM_TEMPSTRING_MAXSIZE];
965
967
970 {
971 VM_Warning(prog, "Can't stuffcmd to a non-client\n");
972 return;
973 }
974
975 VM_VarString(prog, 1, string, sizeof(string));
976
977 old = host_client;
979 SV_ClientCommands ("%s", string);
980 host_client = old;
981}
982
983/*
984=================
985VM_SV_findradius
986
987Returns a chain of entities that have origins within a spherical area
988
989findradius (origin, radius)
990=================
991*/
993{
994 prvm_edict_t *ent, *chain;
995 vec_t radius, radius2;
996 vec3_t org, eorg, mins, maxs;
997 int i;
998 int numtouchedicts;
999 static prvm_edict_t *touchedicts[MAX_EDICTS];
1000 int chainfield;
1001
1003
1004 if(prog->argc == 3)
1005 chainfield = PRVM_G_INT(OFS_PARM2);
1006 else
1007 chainfield = prog->fieldoffsets.chain;
1008 if (chainfield < 0)
1009 prog->error_cmd("VM_SV_findradius: %s doesnt have the specified chain field !", prog->name);
1010
1011 chain = (prvm_edict_t *)prog->edicts;
1012
1014 radius = PRVM_G_FLOAT(OFS_PARM1);
1015 radius2 = radius * radius;
1016
1017 mins[0] = org[0] - (radius + 1);
1018 mins[1] = org[1] - (radius + 1);
1019 mins[2] = org[2] - (radius + 1);
1020 maxs[0] = org[0] + (radius + 1);
1021 maxs[1] = org[1] + (radius + 1);
1022 maxs[2] = org[2] + (radius + 1);
1023 numtouchedicts = SV_EntitiesInBox(mins, maxs, MAX_EDICTS, touchedicts);
1024 if (numtouchedicts > MAX_EDICTS)
1025 {
1026 // this never happens
1027 Con_Printf("SV_EntitiesInBox returned %i edicts, max was %i\n", numtouchedicts, MAX_EDICTS);
1028 numtouchedicts = MAX_EDICTS;
1029 }
1030 for (i = 0;i < numtouchedicts;i++)
1031 {
1032 ent = touchedicts[i];
1033 prog->xfunction->builtinsprofile++;
1034 // Quake did not return non-solid entities but darkplaces does
1035 // (note: this is the reason you can't blow up fallen zombies)
1037 continue;
1038 // LadyHavoc: compare against bounding box rather than center so it
1039 // doesn't miss large objects, and use DotProduct instead of Length
1040 // for a major speedup
1043 {
1044 eorg[0] -= bound(PRVM_serveredictvector(ent, mins)[0], eorg[0], PRVM_serveredictvector(ent, maxs)[0]);
1045 eorg[1] -= bound(PRVM_serveredictvector(ent, mins)[1], eorg[1], PRVM_serveredictvector(ent, maxs)[1]);
1046 eorg[2] -= bound(PRVM_serveredictvector(ent, mins)[2], eorg[2], PRVM_serveredictvector(ent, maxs)[2]);
1047 }
1048 else
1049 VectorMAMAM(1, eorg, -0.5f, PRVM_serveredictvector(ent, mins), -0.5f, PRVM_serveredictvector(ent, maxs), eorg);
1050 if (DotProduct(eorg, eorg) < radius2)
1051 {
1053 chain = ent;
1054 }
1055 }
1056
1058}
1059
1060/*
1061=================
1062VM_SV_findbox
1063
1064Returns a chain of entities that are touching a box (a simpler findradius); supports DP_QC_FINDCHAIN_TOFIELD
1065
1066findbox (mins, maxs)
1067=================
1068*/
1069static void VM_SV_findbox(prvm_prog_t *prog)
1070{
1072 int i, numtouchedicts;
1073 static prvm_edict_t *touchedicts[MAX_EDICTS];
1074 int chainfield;
1075
1077
1078 if(prog->argc == 3)
1079 chainfield = PRVM_G_INT(OFS_PARM2);
1080 else
1081 chainfield = prog->fieldoffsets.chain;
1082 if (chainfield < 0)
1083 prog->error_cmd("VM_SV_findbox: %s doesnt have the specified chain field !", prog->name);
1084
1085 chain = (prvm_edict_t *)prog->edicts;
1086
1087 numtouchedicts = SV_EntitiesInBox(PRVM_G_VECTOR(OFS_PARM0), PRVM_G_VECTOR(OFS_PARM1), MAX_EDICTS, touchedicts);
1088 if (numtouchedicts > MAX_EDICTS)
1089 {
1090 // this never happens
1091 Con_Printf("SV_EntitiesInBox returned %i edicts, max was %i\n", numtouchedicts, MAX_EDICTS);
1092 numtouchedicts = MAX_EDICTS;
1093 }
1094 for (i = 0; i < numtouchedicts; ++i)
1095 {
1096 prog->xfunction->builtinsprofile++;
1097 PRVM_EDICTFIELDEDICT(touchedicts[i], chainfield) = PRVM_EDICT_TO_PROG(chain);
1098 chain = touchedicts[i];
1099 }
1100
1102}
1103
1109
1116
1117/*
1118===============
1119VM_SV_walkmove
1120
1121float(float yaw, float dist[, settrace]) walkmove
1122===============
1123*/
1124static void VM_SV_walkmove(prvm_prog_t *prog)
1125{
1126 prvm_edict_t *ent;
1127 float yaw, dist;
1128 vec3_t move;
1129 mfunction_t *oldf;
1130 int oldself;
1131 qbool settrace;
1132
1134
1135 // assume failure if it returns early
1137
1139 if (ent == prog->edicts)
1140 {
1141 VM_Warning(prog, "walkmove: can not modify world entity\n");
1142 return;
1143 }
1144 if (ent->free)
1145 {
1146 VM_Warning(prog, "walkmove: can not modify free entity\n");
1147 return;
1148 }
1149 yaw = PRVM_G_FLOAT(OFS_PARM0);
1150 dist = PRVM_G_FLOAT(OFS_PARM1);
1151 settrace = prog->argc >= 3 && PRVM_G_FLOAT(OFS_PARM2);
1152
1153 if ( !( (int)PRVM_serveredictfloat(ent, flags) & (FL_ONGROUND|FL_FLY|FL_SWIM) ) )
1154 return;
1155
1156 yaw = yaw*M_PI*2 / 360;
1157
1158 move[0] = cos(yaw)*dist;
1159 move[1] = sin(yaw)*dist;
1160 move[2] = 0;
1161
1162// save program state, because SV_movestep may call other progs
1163 oldf = prog->xfunction;
1164 oldself = PRVM_serverglobaledict(self);
1165
1166 PRVM_G_FLOAT(OFS_RETURN) = SV_movestep(ent, move, true, false, settrace);
1167
1168
1169// restore program state
1170 prog->xfunction = oldf;
1171 PRVM_serverglobaledict(self) = oldself;
1172}
1173
1174/*
1175===============
1176VM_SV_droptofloor
1177
1178void() droptofloor
1179===============
1180*/
1182{
1183 if (sv.worldmodel->brush.isq3bsp || sv.worldmodel->brush.isq2bsp)
1184 return trace->startsolid;
1185 else
1186 return trace->allsolid || trace->fraction == 1;
1187}
1189{
1190 prvm_edict_t *ent;
1191 vec3_t end;
1192 trace_t trace;
1193
1194 VM_SAFEPARMCOUNTRANGE(0, 2, VM_SV_droptofloor); // allow 2 parameters because the id1 defs.qc had an incorrect prototype
1195
1196 // assume failure if it returns early
1198
1200 if (ent == prog->edicts)
1201 {
1202 VM_Warning(prog, "droptofloor: can not modify world entity\n");
1203 return;
1204 }
1205 if (ent->free)
1206 {
1207 VM_Warning(prog, "droptofloor: can not modify free entity\n");
1208 return;
1209 }
1210
1212 {
1213 int n = PHYS_NudgeOutOfSolid(prog, ent);
1214 if (!n)
1215 VM_Warning(prog, "droptofloor at \"%f %f %f\": sv_gameplayfix_droptofloorstartsolid_nudgetocorrect COULD NOT FIX badly placed entity \"%s\" before drop\n", PRVM_gameedictvector(ent, origin)[0], PRVM_gameedictvector(ent, origin)[1], PRVM_gameedictvector(ent, origin)[2], PRVM_GetString(prog, PRVM_gameedictstring(ent, classname)));
1216 else if (n > 0)
1217 VM_Warning(prog, "droptofloor at \"%f %f %f\": sv_gameplayfix_droptofloorstartsolid_nudgetocorrect FIXED badly placed entity \"%s\" before drop\n", PRVM_gameedictvector(ent, origin)[0], PRVM_gameedictvector(ent, origin)[1], PRVM_gameedictvector(ent, origin)[2], PRVM_GetString(prog, PRVM_gameedictstring(ent, classname)));
1218 }
1219
1221 if (sv.worldmodel->brush.isq3bsp)
1222 end[2] -= 4096;
1223 else if (sv.worldmodel->brush.isq2bsp)
1224 end[2] -= 128;
1225 else
1226 end[2] -= 256; // Quake, QuakeWorld
1227
1228 /* bones_was_here: not using SV_GenericHitSuperContentsMask(ent) anymore because it was setting:
1229 * items: SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY
1230 * monsters: SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY | SUPERCONTENTS_PLAYERCLIP
1231 * explobox: SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY | SUPERCONTENTS_CORPSE
1232 * which caused (startsolid == true) when, for example, a health was touching a monster.
1233 * Changing MOVE_NORMAL also fixes that, but other engines are using MOVE_NORMAL here.
1234 */
1236 if (droptofloor_bsp_failcond(&trace))
1237 {
1239 {
1240 vec3_t offset, org;
1241
1242 offset[0] = 0.5f * (PRVM_serveredictvector(ent, mins)[0] + PRVM_serveredictvector(ent, maxs)[0]);
1243 offset[1] = 0.5f * (PRVM_serveredictvector(ent, mins)[1] + PRVM_serveredictvector(ent, maxs)[1]);
1244 offset[2] = PRVM_serveredictvector(ent, mins)[2];
1246 VectorAdd(end, offset, end);
1247
1249 if (droptofloor_bsp_failcond(&trace))
1250 {
1251 VM_Warning(prog, "droptofloor at \"%f %f %f\": sv_gameplayfix_droptofloorstartsolid COULD NOT FIX badly placed entity \"%s\"\n", PRVM_serveredictvector(ent, origin)[0], PRVM_serveredictvector(ent, origin)[1], PRVM_serveredictvector(ent, origin)[2], PRVM_GetString(prog, PRVM_gameedictstring(ent, classname)));
1252 return;
1253 }
1254 VM_Warning(prog, "droptofloor at \"%f %f %f\": sv_gameplayfix_droptofloorstartsolid FIXED badly placed entity \"%s\"\n", PRVM_serveredictvector(ent, origin)[0], PRVM_serveredictvector(ent, origin)[1], PRVM_serveredictvector(ent, origin)[2], PRVM_GetString(prog, PRVM_gameedictstring(ent, classname)));
1256
1257 // only because we dropped it without considering its bbox
1259 PHYS_NudgeOutOfSolid(prog, ent);
1260 }
1261 else
1262 {
1263 VM_Warning(prog, "droptofloor at \"%f %f %f\": badly placed entity \"%s\", startsolid: %d allsolid: %d\n", PRVM_serveredictvector(ent, origin)[0], PRVM_serveredictvector(ent, origin)[1], PRVM_serveredictvector(ent, origin)[2], PRVM_GetString(prog, PRVM_gameedictstring(ent, classname)), trace.startsolid, trace.allsolid);
1264 return;
1265 }
1266 }
1267 else
1269
1270 SV_LinkEdict(ent);
1274 // if support is destroyed, keep suspended (gross hack for floating items in various maps)
1275 ent->priv.server->suspendedinairflag = true;
1276}
1277
1278/*
1279===============
1280VM_SV_lightstyle
1281
1282void(float style, string value) lightstyle
1283===============
1284*/
1286{
1287 int style;
1288 const char *val;
1289 client_t *client;
1290 int j;
1291
1293
1295 val = PRVM_G_STRING(OFS_PARM1);
1296
1297 if( (unsigned) style >= MAX_LIGHTSTYLES ) {
1298 prog->error_cmd( "PF_lightstyle: style: %i >= 64", style );
1299 }
1300
1301// change the string in sv
1303
1304// send message to all clients on this server
1305 if (sv.state != ss_active)
1306 return;
1307
1308 for (j = 0, client = svs.clients;j < svs.maxclients;j++, client++)
1309 {
1310 if (client->active && client->netconnection)
1311 {
1314 MSG_WriteString (&client->netconnection->message, val);
1315 }
1316 }
1317}
1318
1319/*
1320=============
1321VM_SV_checkbottom
1322=============
1323*/
1329
1330/*
1331=============
1332VM_SV_pointcontents
1333=============
1334*/
1342
1343/*
1344=============
1345VM_SV_aim
1346
1347Pick a vector for the player to shoot along
1348vector aim(entity, missilespeed)
1349=============
1350*/
1351static void VM_SV_aim(prvm_prog_t *prog)
1352{
1353 prvm_edict_t *ent, *check, *bestent;
1354 vec3_t start, dir, end, bestdir;
1355 int i, j;
1356 trace_t tr;
1357 float dist, bestdist;
1358 //float speed;
1359
1361
1362 // assume failure if it returns early
1364 // if sv_aim is so high it can't possibly accept anything, skip out early
1365 if (sv_aim.value >= 1)
1366 return;
1367
1368 ent = PRVM_G_EDICT(OFS_PARM0);
1369 if (ent == prog->edicts)
1370 {
1371 VM_Warning(prog, "aim: can not use world entity\n");
1372 return;
1373 }
1374 if (ent->free)
1375 {
1376 VM_Warning(prog, "aim: can not use free entity\n");
1377 return;
1378 }
1379 //speed = PRVM_G_FLOAT(OFS_PARM1);
1380
1382 start[2] += 20;
1383
1384// try sending a trace straight
1386 VectorMA (start, 2048, dir, end);
1390 {
1392 return;
1393 }
1394
1395
1396// try all possible entities
1397 VectorCopy (dir, bestdir);
1398 bestdist = sv_aim.value;
1399 bestent = NULL;
1400
1401 check = PRVM_NEXT_EDICT(prog->edicts);
1402 for (i=1 ; i<prog->num_edicts ; i++, check = PRVM_NEXT_EDICT(check) )
1403 {
1404 prog->xfunction->builtinsprofile++;
1406 continue;
1407 if (check == ent)
1408 continue;
1409 if (teamplay.integer && PRVM_serveredictfloat(ent, team) > 0 && PRVM_serveredictfloat(ent, team) == PRVM_serveredictfloat(check, team))
1410 continue; // don't aim at teammate
1411 for (j=0 ; j<3 ; j++)
1412 end[j] = PRVM_serveredictvector(check, origin)[j]
1413 + 0.5*(PRVM_serveredictvector(check, mins)[j] + PRVM_serveredictvector(check, maxs)[j]);
1414 VectorSubtract (end, start, dir);
1417 if (dist < bestdist)
1418 continue; // to far to turn
1420 if (tr.ent == check)
1421 { // can shoot at this one
1422 bestdist = dist;
1423 bestent = check;
1424 }
1425 }
1426
1427 if (bestent)
1428 {
1432 end[2] = dir[2];
1433 VectorNormalize (end);
1435 }
1436 else
1437 {
1439 }
1440}
1441
1442/*
1443===============================================================================
1444
1445MESSAGE WRITING
1446
1447===============================================================================
1448*/
1449
1450#define MSG_BROADCAST 0 // unreliable to all
1451#define MSG_ONE 1 // reliable to one (msg_entity)
1452#define MSG_ALL 2 // reliable to all
1453#define MSG_INIT 3 // write to the init string
1454#define MSG_ENTITY 5
1455
1457{
1458 int entnum;
1459 int dest;
1460 prvm_edict_t *ent;
1461
1462 dest = (int)PRVM_G_FLOAT(OFS_PARM0);
1463 switch (dest)
1464 {
1465 case MSG_BROADCAST:
1466 return &sv.datagram;
1467
1468 case MSG_ONE:
1472 {
1473 VM_Warning(prog, "WriteDest: tried to write to non-client\n");
1474 return &sv.reliable_datagram;
1475 }
1476 else if (!svs.clients[entnum-1].active)
1477 {
1478 VM_Warning(prog, "WriteDest: tried to write to a disconnected client\n");
1479 return &sv.reliable_datagram;
1480 }
1481 else if (!svs.clients[entnum-1].netconnection)
1482 {
1483 VM_Warning(prog, "WriteDest: tried to write to a bot client\n");
1484 return &sv.reliable_datagram;
1485 }
1486 else
1487 return &svs.clients[entnum-1].netconnection->message;
1488
1489 default:
1490 VM_Warning(prog, "WriteDest: bad destination\n");
1491 case MSG_ALL:
1492 return &sv.reliable_datagram;
1493
1494 case MSG_INIT:
1495 return &sv.signon;
1496
1497 case MSG_ENTITY:
1499 }
1500
1501 //return NULL;
1502}
1503
1505{
1508}
1509
1511{
1514}
1515
1521
1523{
1526}
1527
1533
1539
1545
1551
1552
1558
1559// writes a picture as at most size bytes of data
1560// message:
1561// IMGNAME \0 SIZE(short) IMGDATA
1562// if failed to read/compress:
1563// IMGNAME \0 \0 \0
1564//#501 void(float dest, string name, float maxsize) WritePicture (DP_SV_WRITEPICTURE))
1566{
1567 const char *imgname;
1568 void *buf;
1569 size_t size;
1570
1572
1573 imgname = PRVM_G_STRING(OFS_PARM1);
1574 size = (size_t) PRVM_G_FLOAT(OFS_PARM2);
1575 if(size > 65535)
1576 size = 65535;
1577
1578 MSG_WriteString(WriteDest(prog), imgname);
1579 if(Image_Compress(imgname, size, &buf, &size))
1580 {
1581 // actual picture
1582 MSG_WriteShort(WriteDest(prog), (int)size);
1583 SZ_Write(WriteDest(prog), (unsigned char *) buf, (int)size);
1584 }
1585 else
1586 {
1587 // placeholder
1588 MSG_WriteShort(WriteDest(prog), 0);
1589 }
1590}
1591
1593
1595{
1596 prvm_edict_t *ent;
1597 int i, large;
1598
1599 // allow 0 parameters due to an id1 qc bug in which this function is used
1600 // with no parameters (but directly after setmodel with self in OFS_PARM0)
1602
1603 if (prog->argc >= 1)
1604 ent = PRVM_G_EDICT(OFS_PARM0);
1605 else
1607 if (ent == prog->edicts)
1608 {
1609 VM_Warning(prog, "makestatic: can not modify world entity\n");
1610 return;
1611 }
1612 if (ent->free)
1613 {
1614 VM_Warning(prog, "makestatic: can not modify free entity\n");
1615 return;
1616 }
1617
1618 large = false;
1619 if (PRVM_serveredictfloat(ent, modelindex) >= 256 || PRVM_serveredictfloat(ent, frame) >= 256)
1620 large = true;
1621
1623 {
1627 }
1628 else if (large)
1629 {
1633 }
1634 else
1635 {
1639 }
1640
1643 for (i=0 ; i<3 ; i++)
1644 {
1647 }
1648
1649// throw the entity away now
1650 PRVM_ED_Free(prog, ent);
1651}
1652
1653//=============================================================================
1654
1655/*
1656==============
1657VM_SV_setspawnparms
1658==============
1659*/
1661{
1662 prvm_edict_t *ent;
1663 int i;
1664 client_t *client;
1665
1667
1668 ent = PRVM_G_EDICT(OFS_PARM0);
1669 i = PRVM_NUM_FOR_EDICT(ent);
1670 if (i < 1 || i > svs.maxclients || !svs.clients[i-1].active)
1671 {
1672 Con_Print("tried to setspawnparms on a non-client\n");
1673 return;
1674 }
1675
1676 // copy spawn parms out of the client_t
1677 client = svs.clients + i-1;
1678 for (i=0 ; i< NUM_SPAWN_PARMS ; i++)
1679 (&PRVM_serverglobalfloat(parm1))[i] = client->spawn_parms[i];
1680}
1681
1682/*
1683=================
1684VM_SV_getlight
1685
1686Returns a color vector indicating the lighting at the requested point.
1687
1688(Internal Operation note: actually measures the light beneath the point, just like
1689 the model lighting on the client)
1690
1691getlight(vector)
1692=================
1693*/
1694static void VM_SV_getlight(prvm_prog_t *prog)
1695{
1696 vec3_t ambientcolor, diffusecolor, diffusenormal;
1697 vec3_t p;
1700 VectorClear(ambientcolor);
1701 VectorClear(diffusecolor);
1702 VectorClear(diffusenormal);
1703 if (sv.worldmodel && sv.worldmodel->brush.LightPoint)
1704 sv.worldmodel->brush.LightPoint(sv.worldmodel, p, ambientcolor, diffusecolor, diffusenormal);
1705 VectorMA(ambientcolor, 0.5, diffusecolor, PRVM_G_VECTOR(OFS_RETURN));
1706}
1707
1708typedef struct
1709{
1710 unsigned char type; // 1/2/8 or 0 to indicate unused
1713
1714static customstat_t vm_customstats[MAX_CL_STATS]; // matches the regular stat numbers, but only MIN_VM_STAT to MAX_VM_STAT range is used if things are working properly (can register stats from MAX_VM_STAT to MAX_CL_STATS but will warn)
1716
1718{
1719 memset(vm_customstats, 0, sizeof(vm_customstats));
1721}
1722
1723void VM_SV_UpdateCustomStats (client_t *client, prvm_edict_t *ent, sizebuf_t *msg, int *stats)
1724{
1725 prvm_prog_t *prog = SVVM_prog;
1726 int i;
1727 char s[17];
1728 union {
1729 int i;
1730 float f;
1731 } u;
1732
1734 {
1735 if(!vm_customstats[i].type)
1736 continue;
1737 switch(vm_customstats[i].type)
1738 {
1739 //string as 16 bytes
1740 case 1:
1741 memset(s, 0, 17);
1742 dp_strlcpy(s, PRVM_E_STRING(ent, vm_customstats[i].fieldoffset), 16);
1743 stats[i] = s[ 0] + s[ 1] * 256 + s[ 2] * 65536 + s[ 3] * 16777216;
1744 stats[i+1] = s[ 4] + s[ 5] * 256 + s[ 6] * 65536 + s[ 7] * 16777216;
1745 stats[i+2] = s[ 8] + s[ 9] * 256 + s[10] * 65536 + s[11] * 16777216;
1746 stats[i+3] = s[12] + s[13] * 256 + s[14] * 65536 + s[15] * 16777216;
1747 break;
1748 //float field sent as-is
1749 case 8:
1750 // can't directly use PRVM_E_INT on the field because it may be PRVM_64 and a double is not the representation we want to send
1751 u.f = PRVM_E_FLOAT(ent, vm_customstats[i].fieldoffset);
1752 stats[i] = u.i;
1753 break;
1754 //integer value of float field
1755 case 2:
1756 stats[i] = (int)PRVM_E_FLOAT(ent, vm_customstats[i].fieldoffset);
1757 break;
1758 default:
1759 break;
1760 }
1761 }
1762}
1763
1764extern cvar_t sv_qcstats;
1765
1766// void(float index, float type, .void field) SV_AddStat = #232;
1767// Set up an auto-sent player stat.
1768// Client's get thier own fields sent to them. Index may not be less than 32.
1769// Type is a value equating to the ev_ values found in qcc to dictate types. Valid ones are:
1770// 1: string (4 stats carrying a total of 16 charactures)
1771// 2: float (one stat, float converted to an integer for transportation)
1772// 8: integer (one stat, not converted to an int, so this can be used to transport floats as floats - what a unique idea!)
1773static void VM_SV_AddStat(prvm_prog_t *prog)
1774{
1775 int off, i, type;
1776
1778
1781 off = PRVM_G_INT (OFS_PARM2);
1782
1783 switch (type)
1784 {
1785 case 1:
1786 case 2:
1787 case 8:
1788 break;
1789 default:
1790 VM_Warning(prog, "PF_SV_AddStat: unrecognized type %i - supported types are 1 (string up to 16 bytes, takes 4 stat slots), 2 (truncate to int32), 8 (send as float)", type);
1791 return;
1792 }
1793
1794 if (i < 0)
1795 {
1796 VM_Warning(prog, "PF_SV_AddStat: index (%i) may not be less than %i\n", i, MIN_VM_STAT);
1797 return;
1798 }
1799
1800 if (i >= MAX_CL_STATS)
1801 {
1802 VM_Warning(prog, "PF_SV_AddStat: index (%i) >= MAX_CL_STATS (%i), not supported by protocol, and AddStat beyond MAX_VM_STAT (%i) conflicts with engine MOVEVARS\n", i, MAX_CL_STATS, MAX_VM_STAT);
1803 return;
1804 }
1805
1806 if (i > (MAX_CL_STATS - 4) && type == 1)
1807 {
1808 VM_Warning(prog, "PF_SV_AddStat: index (%i) > (MAX_CL_STATS (%i) - 4) with string type won't fit in the protocol, and AddStat beyond MAX_VM_STAT conflicts with engine MOVEVARS\n", i, MAX_CL_STATS);
1809 return;
1810 }
1811
1812 // these are hazardous to override but sort of allowed if one wants to be adventurous... and enjoys warnings.
1813 if (i < MIN_VM_STAT)
1814 VM_Warning(prog, "PF_SV_AddStat: index (%i) < MIN_VM_STAT (%i) may conflict with engine stats - allowed, but this may break things\n", i, MIN_VM_STAT);
1815 else if (i >= MAX_VM_STAT && !sv_qcstats.integer)
1816 VM_Warning(prog, "PF_SV_AddStat: index (%i) >= MAX_VM_STAT (%i) conflicts with engine stats - allowed, but this may break slowmo and stuff\n", i, MAX_VM_STAT);
1817 else if (i > (MAX_VM_STAT - 4) && type == 1 && !sv_qcstats.integer)
1818 VM_Warning(prog, "PF_SV_AddStat: index (%i) >= MAX_VM_STAT (%i) - 4 with string type won't fit within MAX_VM_STAT, thus conflicting with engine stats - allowed, but this may break slowmo and stuff\n", i, MAX_VM_STAT);
1819
1824}
1825
1826/*
1827=================
1828VM_SV_copyentity
1829
1830copies data from one entity to another
1831
1832copyentity(src, dst)
1833=================
1834*/
1836{
1837 prvm_edict_t *in, *out;
1839 in = PRVM_G_EDICT(OFS_PARM0);
1840 if (in == prog->edicts)
1841 {
1842 VM_Warning(prog, "copyentity: can not read world entity\n");
1843 return;
1844 }
1845 if (in->free)
1846 {
1847 VM_Warning(prog, "copyentity: can not read free entity\n");
1848 return;
1849 }
1850 out = PRVM_G_EDICT(OFS_PARM1);
1851 if (out == prog->edicts)
1852 {
1853 VM_Warning(prog, "copyentity: can not modify world entity\n");
1854 return;
1855 }
1856 if (out->free)
1857 {
1858 VM_Warning(prog, "copyentity: can not modify free entity\n");
1859 return;
1860 }
1861 memcpy(out->fields.fp, in->fields.fp, prog->entityfields * sizeof(prvm_vec_t));
1862
1863 SV_LinkEdict(out);
1864}
1865
1866
1867/*
1868=================
1869VM_SV_setcolor
1870
1871sets the color of a client and broadcasts the update to all connected clients
1872
1873setcolor(clientent, value)
1874=================
1875*/
1876static void VM_SV_setcolor(prvm_prog_t *prog)
1877{
1878 client_t *client;
1879 int entnum, i;
1880
1884
1886 {
1887 Con_Print("tried to setcolor a non-client\n");
1888 return;
1889 }
1890
1891 client = svs.clients + entnum-1;
1892 if (client->edict)
1893 {
1895 PRVM_serveredictfloat(client->edict, team) = (i & 15) + 1;
1896 }
1897 client->colors = i;
1898 if (client->old_colors != client->colors)
1899 {
1900 client->old_colors = client->colors;
1901 // send notification to all clients
1905 }
1906}
1907
1908/*
1909=================
1910VM_SV_effect
1911
1912effect(origin, modelname, startframe, framecount, framerate)
1913=================
1914*/
1915static void VM_SV_effect(prvm_prog_t *prog)
1916{
1917 int i;
1918 const char *s;
1919 vec3_t org;
1922 if (!s[0])
1923 {
1924 VM_Warning(prog, "effect: no model specified\n");
1925 return;
1926 }
1927
1928 i = SV_ModelIndex(s, 1);
1929 if (!i)
1930 {
1931 VM_Warning(prog, "effect: model not precached\n");
1932 return;
1933 }
1934
1935 if (PRVM_G_FLOAT(OFS_PARM3) < 1)
1936 {
1937 VM_Warning(prog, "effect: framecount < 1\n");
1938 return;
1939 }
1940
1941 if (PRVM_G_FLOAT(OFS_PARM4) < 1)
1942 {
1943 VM_Warning(prog, "effect: framerate < 1\n");
1944 return;
1945 }
1946
1949}
1950
1970
1992
2008
2038
2064
2090
2110
2122
2134
2146
2158
2170
2172{
2174 if (PRVM_G_FLOAT(OFS_PARM1) < 8 || PRVM_G_FLOAT(OFS_PARM2) < (1.0 / 256.0))
2175 return;
2178 // origin
2182 // radius
2183 MSG_WriteByte(&sv.datagram, (int)bound(0, PRVM_G_FLOAT(OFS_PARM1) / 8 - 1, 255));
2184 // lifetime
2185 MSG_WriteByte(&sv.datagram, (int)bound(0, PRVM_G_FLOAT(OFS_PARM2) * 256 - 1, 255));
2186 // color
2187 MSG_WriteByte(&sv.datagram, (int)bound(0, PRVM_G_VECTOR(OFS_PARM3)[0] * 255, 255));
2188 MSG_WriteByte(&sv.datagram, (int)bound(0, PRVM_G_VECTOR(OFS_PARM3)[1] * 255, 255));
2189 MSG_WriteByte(&sv.datagram, (int)bound(0, PRVM_G_VECTOR(OFS_PARM3)[2] * 255, 255));
2191}
2192
2204
2216
2228
2240
2252
2264
2276
2288
2300
2315
2333
2351
2369
2387
2398
2416
2417//void(entity e, string s) clientcommand = #440; // executes a command string as if it came from the specified client
2418//this function originally written by KrimZon, made shorter by LadyHavoc
2420{
2421 client_t *temp_client;
2422 int i;
2424
2425 //find client for this entity
2427 if (i < 0 || i >= svs.maxclients || !svs.clients[i].active)
2428 {
2429 Con_Print("PF_clientcommand: entity is not a client\n");
2430 return;
2431 }
2432
2433 temp_client = host_client;
2436 host_client = temp_client;
2437}
2438
2439//void(entity e, entity tagentity, string tagname) setattachment = #443; // attachs e to a tag on tagentity (note: use "" to attach to entity origin/angles instead of a tag)
2441{
2443 prvm_edict_t *tagentity = PRVM_G_EDICT(OFS_PARM1);
2444 const char *tagname = PRVM_G_STRING(OFS_PARM2);
2445 model_t *model;
2446 int tagindex;
2448
2449 if (e == prog->edicts)
2450 {
2451 VM_Warning(prog, "setattachment: can not modify world entity\n");
2452 return;
2453 }
2454 if (e->free)
2455 {
2456 VM_Warning(prog, "setattachment: can not modify free entity\n");
2457 return;
2458 }
2459
2460 if (tagentity == NULL)
2461 tagentity = prog->edicts;
2462
2463 tagindex = 0;
2464
2465 if (tagentity != NULL && tagentity != prog->edicts && tagname && tagname[0])
2466 {
2467 model = SV_GetModelFromEdict(tagentity);
2468 if (model)
2469 {
2470 tagindex = Mod_Alias_GetTagIndexForName(model, (int)PRVM_serveredictfloat(tagentity, skin), tagname);
2471 if (tagindex == 0)
2472 Con_DPrintf("setattachment(edict %i, edict %i, string \"%s\"): tried to find tag named \"%s\" on entity %i (model \"%s\") but could not find it\n", PRVM_NUM_FOR_EDICT(e), PRVM_NUM_FOR_EDICT(tagentity), tagname, tagname, PRVM_NUM_FOR_EDICT(tagentity), model->name);
2473 }
2474 else
2475 Con_DPrintf("setattachment(edict %i, edict %i, string \"%s\"): tried to find tag named \"%s\" on entity %i but it has no model\n", PRVM_NUM_FOR_EDICT(e), PRVM_NUM_FOR_EDICT(tagentity), tagname, tagname, PRVM_NUM_FOR_EDICT(tagentity));
2476 }
2477
2479 PRVM_serveredictfloat(e, tag_index) = tagindex;
2480}
2481
2483// DP_MD3_TAGINFO extension coded by VorteX
2484
2485static int SV_GetTagIndex (prvm_prog_t *prog, prvm_edict_t *e, const char *tagname)
2486{
2487 int i;
2488
2491 return -1;
2492
2494}
2495
2496static int SV_GetExtendedTagInfo (prvm_prog_t *prog, prvm_edict_t *e, int tagindex, int *parentindex, const char **tagname, matrix4x4_t *tag_localmatrix)
2497{
2498 int r;
2499 model_t *model;
2500
2501 *tagname = NULL;
2502 *parentindex = 0;
2503 Matrix4x4_CreateIdentity(tag_localmatrix);
2504
2505 if (tagindex >= 0 && (model = SV_GetModelFromEdict(e)) && model->num_bones)
2506 {
2507 r = Mod_Alias_GetExtendedTagInfoForIndex(model, (int)PRVM_serveredictfloat(e, skin), e->priv.server->frameblend, &e->priv.server->skeleton, tagindex - 1, parentindex, tagname, tag_localmatrix);
2508
2509 if(!r) // success?
2510 *parentindex += 1;
2511
2512 return r;
2513 }
2514
2515 return 1;
2516}
2517
2519{
2520 float scale;
2521 float pitchsign = 1;
2522
2524 if (!scale)
2525 scale = 1.0f;
2526
2527 if (viewmatrix)
2529 else
2530 {
2531 pitchsign = SV_GetPitchSign(prog, ent);
2533 }
2534}
2535
2536static int SV_GetEntityLocalTagMatrix(prvm_prog_t *prog, prvm_edict_t *ent, int tagindex, matrix4x4_t *out)
2537{
2538 model_t *model;
2539 if (tagindex >= 0 && (model = SV_GetModelFromEdict(ent)) && model->animscenes)
2540 {
2541 VM_GenerateFrameGroupBlend(prog, ent->priv.server->framegroupblend, ent);
2542 VM_FrameBlendFromFrameGroupBlend(ent->priv.server->frameblend, ent->priv.server->framegroupblend, model, sv.time);
2543 VM_UpdateEdictSkeleton(prog, ent, model, ent->priv.server->frameblend);
2544 return Mod_Alias_GetTagMatrix(model, ent->priv.server->frameblend, &ent->priv.server->skeleton, tagindex, out);
2545 }
2546 *out = identitymatrix;
2547 return 0;
2548}
2549
2550// Warnings/errors code:
2551// 0 - normal (everything all-right)
2552// 1 - world entity
2553// 2 - free entity
2554// 3 - null or non-precached model
2555// 4 - no tags with requested index
2556// 5 - runaway loop at attachment chain
2557static int SV_GetTagMatrix (prvm_prog_t *prog, matrix4x4_t *out, prvm_edict_t *ent, int tagindex)
2558{
2559 int ret;
2560 int modelindex, attachloop;
2561 matrix4x4_t entitymatrix, tagmatrix, attachmatrix;
2562 model_t *model;
2563
2564 *out = identitymatrix; // warnings and errors return identical matrix
2565
2566 if (ent == prog->edicts)
2567 return 1;
2568 if (ent->free)
2569 return 2;
2570
2573 return 3;
2574
2576
2577 VM_GenerateFrameGroupBlend(prog, ent->priv.server->framegroupblend, ent);
2578 VM_FrameBlendFromFrameGroupBlend(ent->priv.server->frameblend, ent->priv.server->framegroupblend, model, sv.time);
2579 VM_UpdateEdictSkeleton(prog, ent, model, ent->priv.server->frameblend);
2580
2581 tagmatrix = identitymatrix;
2582 // DP_GFX_QUAKE3MODELTAGS, scan all chain and stop on unattached entity
2583 attachloop = 0;
2584 for (;;)
2585 {
2586 if (attachloop >= 256) // prevent runaway looping
2587 return 5;
2588 // apply transformation by child's tagindex on parent entity and then
2589 // by parent entity itself
2590 ret = SV_GetEntityLocalTagMatrix(prog, ent, tagindex - 1, &attachmatrix);
2591 if (ret && attachloop == 0)
2592 return ret;
2593 SV_GetEntityMatrix(prog, ent, &entitymatrix, false);
2594 Matrix4x4_Concat(&tagmatrix, &attachmatrix, out);
2595 Matrix4x4_Concat(out, &entitymatrix, &tagmatrix);
2596 // next iteration we process the parent entity
2598 {
2599 tagindex = (int)PRVM_serveredictfloat(ent, tag_index);
2601 }
2602 else
2603 break;
2604 attachloop++;
2605 }
2606
2607 // RENDER_VIEWMODEL magic
2609 {
2610 Matrix4x4_Copy(&tagmatrix, out);
2612
2613 SV_GetEntityMatrix(prog, ent, &entitymatrix, true);
2614 Matrix4x4_Concat(out, &entitymatrix, &tagmatrix);
2615 }
2616 return 0;
2617}
2618
2619//float(entity ent, string tagname) gettagindex;
2620
2622{
2623 prvm_edict_t *ent;
2624 const char *tag_name;
2625 int tag_index;
2626
2628
2629 ent = PRVM_G_EDICT(OFS_PARM0);
2630 tag_name = PRVM_G_STRING(OFS_PARM1);
2631
2632 if (ent == prog->edicts)
2633 {
2634 VM_Warning(prog, "VM_SV_gettagindex(entity #%i): can't affect world entity\n", PRVM_NUM_FOR_EDICT(ent));
2635 return;
2636 }
2637 if (ent->free)
2638 {
2639 VM_Warning(prog, "VM_SV_gettagindex(entity #%i): can't affect free entity\n", PRVM_NUM_FOR_EDICT(ent));
2640 return;
2641 }
2642
2643 tag_index = 0;
2644 if (!SV_GetModelFromEdict(ent))
2645 Con_DPrintf("VM_SV_gettagindex(entity #%i): null or non-precached model\n", PRVM_NUM_FOR_EDICT(ent));
2646 else
2647 {
2648 tag_index = SV_GetTagIndex(prog, ent, tag_name);
2649 if (tag_index == 0)
2651 Con_DPrintf("VM_SV_gettagindex(entity #%i): tag \"%s\" not found\n", PRVM_NUM_FOR_EDICT(ent), tag_name);
2652 }
2654}
2655
2656//vector(entity ent, float tagindex) gettaginfo;
2658{
2659 prvm_edict_t *e;
2660 int tagindex;
2661 matrix4x4_t tag_matrix;
2662 matrix4x4_t tag_localmatrix;
2663 int parentindex;
2664 const char *tagname;
2665 int returncode;
2666 vec3_t forward, left, up, origin;
2667 const model_t *model;
2668
2670
2672 tagindex = (int)PRVM_G_FLOAT(OFS_PARM1);
2673
2674 returncode = SV_GetTagMatrix(prog, &tag_matrix, e, tagindex);
2675 Matrix4x4_ToVectors(&tag_matrix, forward, left, up, origin);
2681 VM_GenerateFrameGroupBlend(prog, e->priv.server->framegroupblend, e);
2682 VM_FrameBlendFromFrameGroupBlend(e->priv.server->frameblend, e->priv.server->framegroupblend, model, sv.time);
2683 VM_UpdateEdictSkeleton(prog, e, model, e->priv.server->frameblend);
2684 SV_GetExtendedTagInfo(prog, e, tagindex, &parentindex, &tagname, &tag_localmatrix);
2685 Matrix4x4_ToVectors(&tag_localmatrix, forward, left, up, origin);
2686
2688 PRVM_serverglobalstring(gettaginfo_name) = tagname ? PRVM_SetTempString(prog, tagname, strlen(tagname)) : 0;
2693
2694 switch(returncode)
2695 {
2696 case 1:
2697 VM_Warning(prog, "gettagindex: can't affect world entity\n");
2698 break;
2699 case 2:
2700 VM_Warning(prog, "gettagindex: can't affect free entity\n");
2701 break;
2702 case 3:
2703 Con_DPrintf("SV_GetTagMatrix(entity #%i): null or non-precached model\n", PRVM_NUM_FOR_EDICT(e));
2704 break;
2705 case 4:
2706 Con_DPrintf("SV_GetTagMatrix(entity #%i): model has no tag with requested index %i\n", PRVM_NUM_FOR_EDICT(e), tagindex);
2707 break;
2708 case 5:
2709 Con_DPrintf("SV_GetTagMatrix(entity #%i): runaway loop at attachment chain\n", PRVM_NUM_FOR_EDICT(e));
2710 break;
2711 }
2712}
2713
2714//void(entity clent) dropclient (DP_SV_DROPCLIENT)
2716{
2717 int clientnum;
2718 client_t *oldhostclient;
2720 clientnum = PRVM_G_EDICTNUM(OFS_PARM0) - 1;
2721 if (clientnum < 0 || clientnum >= svs.maxclients)
2722 {
2723 VM_Warning(prog, "dropclient: not a client\n");
2724 return;
2725 }
2726 if (!svs.clients[clientnum].active)
2727 {
2728 VM_Warning(prog, "dropclient: that client slot is not connected\n");
2729 return;
2730 }
2731 oldhostclient = host_client;
2732 host_client = svs.clients + clientnum;
2733 SV_DropClient(false, "Client dropped");
2734 host_client = oldhostclient;
2735}
2736
2737//entity() spawnclient (DP_SV_BOTCLIENT)
2739{
2740 int i;
2741 prvm_edict_t *ed;
2743 prog->xfunction->builtinsprofile += 2;
2744 ed = prog->edicts;
2745 for (i = 0;i < svs.maxclients;i++)
2746 {
2747 if (!svs.clients[i].active)
2748 {
2749 prog->xfunction->builtinsprofile += 100;
2751 // this has to be set or else ClientDisconnect won't be called
2752 // we assume the qc will call ClientConnect...
2753 svs.clients[i].clientconnectcalled = true;
2754 ed = PRVM_EDICT_NUM(i + 1);
2755 break;
2756 }
2757 }
2758 VM_RETURN_EDICT(ed);
2759}
2760
2761//float(entity clent) clienttype (DP_SV_BOTCLIENT)
2763{
2764 int clientnum;
2766 clientnum = PRVM_G_EDICTNUM(OFS_PARM0) - 1;
2767 if (clientnum < 0 || clientnum >= svs.maxclients)
2768 PRVM_G_FLOAT(OFS_RETURN) = 3; // CLIENTTYPE_NOTACLIENT
2769 else if (!svs.clients[clientnum].active)
2770 PRVM_G_FLOAT(OFS_RETURN) = 0; // CLIENTTYPE_DISCONNECTED
2771 else if (svs.clients[clientnum].netconnection)
2772 PRVM_G_FLOAT(OFS_RETURN) = 1; // CLIENTTYPE_REAL
2773 else
2774 PRVM_G_FLOAT(OFS_RETURN) = 2; // CLIENTTYPE_BOT
2775}
2776
2777/*
2778===============
2779VM_SV_serverkey
2780
2781string(string key) serverkey
2782===============
2783*/
2785{
2786 char string[VM_TEMPSTRING_MAXSIZE];
2787
2789 InfoString_GetValue(svs.serverinfo, PRVM_G_STRING(OFS_PARM0), string, sizeof(string));
2790 PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, string, strlen(string));
2791}
2792
2793//#333 void(entity e, float mdlindex) setmodelindex (EXT_CSQC)
2795{
2796 prvm_edict_t *e;
2797 model_t *mod;
2798 int i;
2800
2802 if (e == prog->edicts)
2803 {
2804 VM_Warning(prog, "setmodelindex: can not modify world entity\n");
2805 return;
2806 }
2807 if (e->free)
2808 {
2809 VM_Warning(prog, "setmodelindex: can not modify free entity\n");
2810 return;
2811 }
2814 {
2815 VM_Warning(prog, "setmodelindex: invalid modelindex\n");
2816 return;
2817 }
2818 if (!sv.model_precache[i][0])
2819 {
2820 VM_Warning(prog, "setmodelindex: model not precached\n");
2821 return;
2822 }
2823
2826
2828
2829 if (mod)
2830 {
2832 SetMinMaxSize(prog, e, mod->normalmins, mod->normalmaxs, true);
2833 else
2834 SetMinMaxSize(prog, e, quakemins, quakemaxs, true);
2835 }
2836 else
2837 SetMinMaxSize(prog, e, vec3_origin, vec3_origin, true);
2838}
2839
2840//#334 string(float mdlindex) modelnameforindex (EXT_CSQC)
2842{
2843 int i;
2845
2847
2850 {
2851 VM_Warning(prog, "modelnameforindex: invalid modelindex\n");
2852 return;
2853 }
2854 if (!sv.model_precache[i][0])
2855 {
2856 VM_Warning(prog, "modelnameforindex: model not precached\n");
2857 return;
2858 }
2859
2861}
2862
2863//#335 float(string effectname) particleeffectnum (EXT_CSQC)
2865{
2866 int i;
2869 if (i == 0)
2870 i = -1;
2872}
2873
2874// #336 void(entity ent, float effectnum, vector start, vector end) trailparticles (EXT_CSQC)
2892
2893//#337 void(float effectnum, vector origin, vector dir, float count) pointparticles (EXT_CSQC)
2895{
2896 int effectnum, count;
2897 vec3_t org, vel;
2899
2900 if ((int)PRVM_G_FLOAT(OFS_PARM0) < 0)
2901 return;
2902
2903 effectnum = (int)PRVM_G_FLOAT(OFS_PARM0);
2906 count = bound(0, (int)PRVM_G_FLOAT(OFS_PARM3), 65535);
2907 if (count == 1 && !VectorLength2(vel))
2908 {
2909 // 1+2+12=15 bytes
2911 MSG_WriteShort(&sv.datagram, effectnum);
2913 }
2914 else
2915 {
2916 // 1+2+12+12+2=29 bytes
2918 MSG_WriteShort(&sv.datagram, effectnum);
2922 }
2923
2925}
2926
2927qbool SV_VM_ConsoleCommand(const char *text, size_t textlen)
2928{
2929 prvm_prog_t *prog = SVVM_prog;
2930 return PRVM_ConsoleCommand(prog, text, textlen, &prog->funcoffsets.ConsoleCmd, true, PRVM_EDICT_TO_PROG(sv.world.prog->edicts), sv.time, "QC function ConsoleCmd is missing");
2931}
2932
2933// #352 void(string cmdname) registercommand (EXT_CSQC)
2935{
2936 VM_SAFEPARMCOUNT(1, VM_SV_registercmd);
2937 Cmd_AddCommand(CF_SERVER, PRVM_G_STRING(OFS_PARM0), NULL, "console command created by QuakeC");
2938}
2939
2940//PF_setpause, // void(float pause) setpause = #531;
2941static void VM_SV_setpause(prvm_prog_t *prog) {
2942 int pauseValue;
2943 pauseValue = (int)PRVM_G_FLOAT(OFS_PARM0);
2944 if (pauseValue != 0) { //pause the game
2945 sv.paused = 1;
2947 } else { //disable pause, in case it was enabled
2948 if (sv.paused != 0) {
2949 sv.paused = 0;
2950 sv.pausedstart = 0;
2951 }
2952 }
2953 // send notification to all clients
2956}
2957
2958// #263 float(float modlindex) skel_create = #263; // (FTE_CSQC_SKELETONOBJECTS) 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.
2960{
2963 skeleton_t *skeleton;
2964 int i;
2966 if (!model || !model->num_bones)
2967 return;
2968 for (i = 0;i < MAX_EDICTS;i++)
2969 if (!prog->skeletons[i])
2970 break;
2971 if (i == MAX_EDICTS)
2972 return;
2973 prog->skeletons[i] = skeleton = (skeleton_t *)Mem_Alloc(prog->progs_mempool, sizeof(skeleton_t) + model->num_bones * sizeof(matrix4x4_t));
2974 PRVM_G_FLOAT(OFS_RETURN) = i + 1;
2975 skeleton->model = model;
2976 skeleton->relativetransforms = (matrix4x4_t *)(skeleton+1);
2977 // initialize to identity matrices
2978 for (i = 0;i < skeleton->model->num_bones;i++)
2979 skeleton->relativetransforms[i] = identitymatrix;
2980}
2981
2982// #264 float(float skel, entity ent, float modlindex, float retainfrac, float firstbone, float lastbone) skel_build = #264; // (FTE_CSQC_SKELETONOBJECTS) 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
2984{
2986 skeleton_t *skeleton;
2989 float retainfrac = PRVM_G_FLOAT(OFS_PARM3);
2990 int firstbone = PRVM_G_FLOAT(OFS_PARM4) - 1;
2991 int lastbone = PRVM_G_FLOAT(OFS_PARM5) - 1;
2993 int numblends;
2994 int bonenum;
2995 int blendindex;
2996 framegroupblend_t framegroupblend[MAX_FRAMEGROUPBLENDS];
2997 frameblend_t frameblend[MAX_FRAMEBLENDS];
2998 matrix4x4_t bonematrix;
2999 matrix4x4_t matrix;
3002 return;
3003 firstbone = max(0, firstbone);
3004 lastbone = min(lastbone, model->num_bones - 1);
3005 lastbone = min(lastbone, skeleton->model->num_bones - 1);
3006 VM_GenerateFrameGroupBlend(prog, framegroupblend, ed);
3007 VM_FrameBlendFromFrameGroupBlend(frameblend, framegroupblend, model, sv.time);
3008 for (numblends = 0;numblends < MAX_FRAMEBLENDS && frameblend[numblends].lerp;numblends++)
3009 ;
3010 for (bonenum = firstbone;bonenum <= lastbone;bonenum++)
3011 {
3012 memset(&bonematrix, 0, sizeof(bonematrix));
3013 for (blendindex = 0;blendindex < numblends;blendindex++)
3014 {
3015 Matrix4x4_FromBonePose7s(&matrix, model->num_posescale, model->data_poses7s + 7 * (frameblend[blendindex].subframe * model->num_bones + bonenum));
3016 Matrix4x4_Accumulate(&bonematrix, &matrix, frameblend[blendindex].lerp);
3017 }
3018 Matrix4x4_Normalize3(&bonematrix, &bonematrix);
3019 Matrix4x4_Interpolate(&skeleton->relativetransforms[bonenum], &bonematrix, &skeleton->relativetransforms[bonenum], retainfrac);
3020 }
3022}
3023
3024// #265 float(float skel) skel_get_numbones = #265; // (FTE_CSQC_SKELETONOBJECTS) returns how many bones exist in the created skeleton
3026{
3028 skeleton_t *skeleton;
3031 return;
3032 PRVM_G_FLOAT(OFS_RETURN) = skeleton->model->num_bones;
3033}
3034
3035// #266 string(float skel, float bonenum) skel_get_bonename = #266; // (FTE_CSQC_SKELETONOBJECTS) returns name of bone (as a tempstring)
3037{
3039 int bonenum = (int)PRVM_G_FLOAT(OFS_PARM1) - 1;
3040 skeleton_t *skeleton;
3043 return;
3044 if (bonenum < 0 || bonenum >= skeleton->model->num_bones)
3045 return;
3046 PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, skeleton->model->data_bones[bonenum].name, strlen(skeleton->model->data_bones[bonenum].name));
3047}
3048
3049// #267 float(float skel, float bonenum) skel_get_boneparent = #267; // (FTE_CSQC_SKELETONOBJECTS) 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)
3051{
3053 int bonenum = (int)PRVM_G_FLOAT(OFS_PARM1) - 1;
3054 skeleton_t *skeleton;
3057 return;
3058 if (bonenum < 0 || bonenum >= skeleton->model->num_bones)
3059 return;
3060 PRVM_G_FLOAT(OFS_RETURN) = skeleton->model->data_bones[bonenum].parent + 1;
3061}
3062
3063// #268 float(float skel, string tagname) skel_find_bone = #268; // (FTE_CSQC_SKELETONOBJECTS) get number of bone with specified name, 0 on failure, tagindex (bonenum+1) on success, same as using gettagindex on the modelindex
3065{
3067 const char *tagname = PRVM_G_STRING(OFS_PARM1);
3068 skeleton_t *skeleton;
3071 return;
3072 PRVM_G_FLOAT(OFS_RETURN) = Mod_Alias_GetTagIndexForName(skeleton->model, 0, tagname) + 1;
3073}
3074
3075// #269 vector(float skel, float bonenum) skel_get_bonerel = #269; // (FTE_CSQC_SKELETONOBJECTS) get matrix of bone in skeleton relative to its parent - sets v_forward, v_right, v_up, returns origin (relative to parent bone)
3077{
3079 int bonenum = (int)PRVM_G_FLOAT(OFS_PARM1) - 1;
3080 skeleton_t *skeleton;
3081 matrix4x4_t matrix;
3082 vec3_t forward, left, up, origin;
3088 return;
3089 if (bonenum < 0 || bonenum >= skeleton->model->num_bones)
3090 return;
3091 matrix = skeleton->relativetransforms[bonenum];
3092 Matrix4x4_ToVectors(&matrix, forward, left, up, origin);
3097}
3098
3099// #270 vector(float skel, float bonenum) skel_get_boneabs = #270; // (FTE_CSQC_SKELETONOBJECTS) get matrix of bone in skeleton in model space - sets v_forward, v_right, v_up, returns origin (relative to entity)
3101{
3103 int bonenum = (int)PRVM_G_FLOAT(OFS_PARM1) - 1;
3104 skeleton_t *skeleton;
3105 matrix4x4_t matrix;
3106 matrix4x4_t temp;
3107 vec3_t forward, left, up, origin;
3113 return;
3114 if (bonenum < 0 || bonenum >= skeleton->model->num_bones)
3115 return;
3116 matrix = skeleton->relativetransforms[bonenum];
3117 // convert to absolute
3118 while ((bonenum = skeleton->model->data_bones[bonenum].parent) >= 0)
3119 {
3120 temp = matrix;
3121 Matrix4x4_Concat(&matrix, &skeleton->relativetransforms[bonenum], &temp);
3122 }
3123 Matrix4x4_ToVectors(&matrix, forward, left, up, origin);
3128}
3129
3130// #271 void(float skel, float bonenum, vector org) skel_set_bone = #271; // (FTE_CSQC_SKELETONOBJECTS) set matrix of bone relative to its parent, reads v_forward, v_right, v_up, takes origin as parameter (relative to parent bone)
3132{
3134 int bonenum = (int)PRVM_G_FLOAT(OFS_PARM1) - 1;
3135 vec3_t forward, left, up, origin;
3136 skeleton_t *skeleton;
3137 matrix4x4_t matrix;
3139 return;
3140 if (bonenum < 0 || bonenum >= skeleton->model->num_bones)
3141 return;
3146 Matrix4x4_FromVectors(&matrix, forward, left, up, origin);
3147 skeleton->relativetransforms[bonenum] = matrix;
3148}
3149
3150// #272 void(float skel, float bonenum, vector org) skel_mul_bone = #272; // (FTE_CSQC_SKELETONOBJECTS) 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)
3152{
3154 int bonenum = (int)PRVM_G_FLOAT(OFS_PARM1) - 1;
3155 vec3_t forward, left, up, origin;
3156 skeleton_t *skeleton;
3157 matrix4x4_t matrix;
3158 matrix4x4_t temp;
3160 return;
3161 if (bonenum < 0 || bonenum >= skeleton->model->num_bones)
3162 return;
3167 Matrix4x4_FromVectors(&matrix, forward, left, up, origin);
3168 temp = skeleton->relativetransforms[bonenum];
3169 Matrix4x4_Concat(&skeleton->relativetransforms[bonenum], &matrix, &temp);
3170}
3171
3172// #273 void(float skel, float startbone, float endbone, vector org) skel_mul_bones = #273; // (FTE_CSQC_SKELETONOBJECTS) 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)
3174{
3176 int firstbone = PRVM_G_FLOAT(OFS_PARM1) - 1;
3177 int lastbone = PRVM_G_FLOAT(OFS_PARM2) - 1;
3178 int bonenum;
3179 vec3_t forward, left, up, origin;
3180 skeleton_t *skeleton;
3181 matrix4x4_t matrix;
3182 matrix4x4_t temp;
3184 return;
3189 Matrix4x4_FromVectors(&matrix, forward, left, up, origin);
3190 firstbone = max(0, firstbone);
3191 lastbone = min(lastbone, skeleton->model->num_bones - 1);
3192 for (bonenum = firstbone;bonenum <= lastbone;bonenum++)
3193 {
3194 temp = skeleton->relativetransforms[bonenum];
3195 Matrix4x4_Concat(&skeleton->relativetransforms[bonenum], &matrix, &temp);
3196 }
3197}
3198
3199// #274 void(float skeldst, float skelsrc, float startbone, float endbone) skel_copybones = #274; // (FTE_CSQC_SKELETONOBJECTS) copy bone matrices (relative to their parents) from one skeleton to another, useful for copying a skeleton to a corpse
3201{
3202 int skeletonindexdst = (int)PRVM_G_FLOAT(OFS_PARM0) - 1;
3203 int skeletonindexsrc = (int)PRVM_G_FLOAT(OFS_PARM1) - 1;
3204 int firstbone = PRVM_G_FLOAT(OFS_PARM2) - 1;
3205 int lastbone = PRVM_G_FLOAT(OFS_PARM3) - 1;
3206 int bonenum;
3207 skeleton_t *skeletondst;
3208 skeleton_t *skeletonsrc;
3209 if (skeletonindexdst < 0 || skeletonindexdst >= MAX_EDICTS || !(skeletondst = prog->skeletons[skeletonindexdst]))
3210 return;
3211 if (skeletonindexsrc < 0 || skeletonindexsrc >= MAX_EDICTS || !(skeletonsrc = prog->skeletons[skeletonindexsrc]))
3212 return;
3213 firstbone = max(0, firstbone);
3214 lastbone = min(lastbone, skeletondst->model->num_bones - 1);
3215 lastbone = min(lastbone, skeletonsrc->model->num_bones - 1);
3216 for (bonenum = firstbone;bonenum <= lastbone;bonenum++)
3217 skeletondst->relativetransforms[bonenum] = skeletonsrc->relativetransforms[bonenum];
3218}
3219
3220// #275 void(float skel) skel_delete = #275; // (FTE_CSQC_SKELETONOBJECTS) deletes skeleton at the beginning of the next frame (you can add the entity, delete the skeleton, renderscene, and it will still work)
3222{
3224 skeleton_t *skeleton;
3226 return;
3227 Mem_Free(skeleton);
3228 prog->skeletons[skeletonindex] = NULL;
3229}
3230
3231// #276 float(float modlindex, string framename) frameforname = #276; // (FTE_CSQC_SKELETONOBJECTS) finds number of a specified frame in the animation, returns -1 if no match found
3233{
3236 const char *name = PRVM_G_STRING(OFS_PARM1);
3237 int i;
3239 if (!model || !model->animscenes)
3240 return;
3241 for (i = 0;i < model->numframes;i++)
3242 {
3243 if (!strcasecmp(model->animscenes[i].name, name))
3244 {
3246 break;
3247 }
3248 }
3249}
3250
3251// #277 float(float modlindex, float framenum) frameduration = #277; // (FTE_CSQC_SKELETONOBJECTS) 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.
3253{
3256 int framenum = (int)PRVM_G_FLOAT(OFS_PARM1);
3258 if (!model || !model->animscenes || framenum < 0 || framenum >= model->numframes)
3259 return;
3260 if (model->animscenes[framenum].framerate)
3261 PRVM_G_FLOAT(OFS_RETURN) = model->animscenes[framenum].framecount / model->animscenes[framenum].framerate;
3262}
3263
3264
3266NULL, // #0 NULL function (not callable) (QUAKE)
3267VM_makevectors, // #1 void(vector ang) makevectors (QUAKE)
3268VM_SV_setorigin, // #2 void(entity e, vector o) setorigin (QUAKE)
3269VM_SV_setmodel, // #3 void(entity e, string m) setmodel (QUAKE)
3270VM_SV_setsize, // #4 void(entity e, vector min, vector max) setsize (QUAKE)
3271NULL, // #5 void(entity e, vector min, vector max) setabssize (QUAKE)
3272VM_break, // #6 void() break (QUAKE)
3273VM_random, // #7 float() random (QUAKE)
3274VM_SV_sound, // #8 void(entity e, float chan, string samp, float volume[, float atten[, float pitchchange[, float flags]]]) sound (QUAKE)
3275VM_normalize, // #9 vector(vector v) normalize (QUAKE)
3276VM_error, // #10 void(string e) error (QUAKE)
3277VM_objerror, // #11 void(string e) objerror (QUAKE)
3278VM_vlen, // #12 float(vector v) vlen (QUAKE)
3279VM_vectoyaw, // #13 float(vector v) vectoyaw (QUAKE)
3280VM_spawn, // #14 entity() spawn (QUAKE)
3281VM_remove, // #15 void(entity e) remove (QUAKE)
3282VM_SV_traceline, // #16 void(vector v1, vector v2, float tryents) traceline (QUAKE)
3283VM_SV_checkclient, // #17 entity() checkclient (QUAKE)
3284VM_find, // #18 entity(entity start, .string fld, string match) find (QUAKE)
3285VM_SV_precache_sound, // #19 void(string s) precache_sound (QUAKE)
3286VM_SV_precache_model, // #20 void(string s) precache_model (QUAKE)
3287VM_SV_stuffcmd, // #21 void(entity client, string s, ...) stuffcmd (QUAKE)
3288VM_SV_findradius, // #22 entity(vector org, float rad) findradius (QUAKE)
3289VM_bprint, // #23 void(string s, ...) bprint (QUAKE)
3290VM_SV_sprint, // #24 void(entity client, string s, ...) sprint (QUAKE)
3291VM_dprint, // #25 void(string s, ...) dprint (QUAKE)
3292VM_ftos, // #26 string(float f) ftos (QUAKE)
3293VM_vtos, // #27 string(vector v) vtos (QUAKE)
3294VM_coredump, // #28 void() coredump (QUAKE)
3295VM_traceon, // #29 void() traceon (QUAKE)
3296VM_traceoff, // #30 void() traceoff (QUAKE)
3297VM_eprint, // #31 void(entity e) eprint (QUAKE)
3298VM_SV_walkmove, // #32 float(float yaw, float dist) walkmove (QUAKE)
3299NULL, // #33 (QUAKE)
3300VM_SV_droptofloor, // #34 float() droptofloor (QUAKE)
3301VM_SV_lightstyle, // #35 void(float style, string value) lightstyle (QUAKE)
3302VM_rint, // #36 float(float v) rint (QUAKE)
3303VM_floor, // #37 float(float v) floor (QUAKE)
3304VM_ceil, // #38 float(float v) ceil (QUAKE)
3305NULL, // #39 (QUAKE)
3306VM_SV_checkbottom, // #40 float(entity e) checkbottom (QUAKE)
3307VM_SV_pointcontents, // #41 float(vector v) pointcontents (QUAKE)
3308NULL, // #42 (QUAKE)
3309VM_fabs, // #43 float(float f) fabs (QUAKE)
3310VM_SV_aim, // #44 vector(entity e, float speed) aim (QUAKE)
3311VM_cvar, // #45 float(string s) cvar (QUAKE)
3312VM_localcmd, // #46 void(string s) localcmd (QUAKE)
3313VM_nextent, // #47 entity(entity e) nextent (QUAKE)
3314VM_SV_particle, // #48 void(vector o, vector d, float color, float count) particle (QUAKE)
3315VM_changeyaw, // #49 void() ChangeYaw (QUAKE)
3316NULL, // #50 (QUAKE)
3317VM_vectoangles, // #51 vector(vector v) vectoangles (QUAKE)
3318VM_SV_WriteByte, // #52 void(float to, float f) WriteByte (QUAKE)
3319VM_SV_WriteChar, // #53 void(float to, float f) WriteChar (QUAKE)
3320VM_SV_WriteShort, // #54 void(float to, float f) WriteShort (QUAKE)
3321VM_SV_WriteLong, // #55 void(float to, float f) WriteLong (QUAKE)
3322VM_SV_WriteCoord, // #56 void(float to, float f) WriteCoord (QUAKE)
3323VM_SV_WriteAngle, // #57 void(float to, float f) WriteAngle (QUAKE)
3324VM_SV_WriteString, // #58 void(float to, string s) WriteString (QUAKE)
3325VM_SV_WriteEntity, // #59 void(float to, entity e) WriteEntity (QUAKE)
3326VM_sin, // #60 float(float f) sin (DP_QC_SINCOSSQRTPOW) (QUAKE)
3327VM_cos, // #61 float(float f) cos (DP_QC_SINCOSSQRTPOW) (QUAKE)
3328VM_sqrt, // #62 float(float f) sqrt (DP_QC_SINCOSSQRTPOW) (QUAKE)
3329VM_changepitch, // #63 void(entity ent) changepitch (DP_QC_CHANGEPITCH) (QUAKE)
3330VM_SV_tracetoss, // #64 void(entity e, entity ignore) tracetoss (DP_QC_TRACETOSS) (QUAKE)
3331VM_etos, // #65 string(entity ent) etos (DP_QC_ETOS) (QUAKE)
3332NULL, // #66 (QUAKE)
3333VM_SV_MoveToGoal, // #67 void(float step) movetogoal (QUAKE)
3334VM_precache_file, // #68 string(string s) precache_file (QUAKE)
3335VM_SV_makestatic, // #69 void(entity e) makestatic (QUAKE)
3336VM_changelevel, // #70 void(string s) changelevel (QUAKE)
3337NULL, // #71 (QUAKE)
3338VM_cvar_set, // #72 void(string var, string val) cvar_set (QUAKE)
3339VM_SV_centerprint, // #73 void(entity client, strings) centerprint (QUAKE)
3340VM_SV_ambientsound, // #74 void(vector pos, string samp, float vol, float atten) ambientsound (QUAKE)
3341VM_SV_precache_model, // #75 string(string s) precache_model2 (QUAKE)
3342VM_SV_precache_sound, // #76 string(string s) precache_sound2 (QUAKE)
3343VM_precache_file, // #77 string(string s) precache_file2 (QUAKE)
3344VM_SV_setspawnparms, // #78 void(entity e) setspawnparms (QUAKE)
3345NULL, // #79 void(entity killer, entity killee) logfrag (QUAKEWORLD)
3346NULL, // #80 string(entity e, string keyname) infokey (QUAKEWORLD)
3347VM_stof, // #81 float(string s) stof (FRIK_FILE)
3348NULL, // #82 void(vector where, float set) multicast (QUAKEWORLD)
3349NULL, // #83 (QUAKE)
3350NULL, // #84 (QUAKE)
3351NULL, // #85 (QUAKE)
3352NULL, // #86 (QUAKE)
3353NULL, // #87 (QUAKE)
3354NULL, // #88 (QUAKE)
3355NULL, // #89 (QUAKE)
3356VM_SV_tracebox, // #90 void(vector v1, vector min, vector max, vector v2, float nomonsters, entity forent) tracebox (DP_QC_TRACEBOX)
3357VM_randomvec, // #91 vector() randomvec (DP_QC_RANDOMVEC)
3358VM_SV_getlight, // #92 vector(vector org) getlight (DP_QC_GETLIGHT)
3359VM_registercvar, // #93 float(string name, string value) registercvar (DP_REGISTERCVAR)
3360VM_min, // #94 float(float a, floats) min (DP_QC_MINMAXBOUND)
3361VM_max, // #95 float(float a, floats) max (DP_QC_MINMAXBOUND)
3362VM_bound, // #96 float(float minimum, float val, float maximum) bound (DP_QC_MINMAXBOUND)
3363VM_pow, // #97 float(float f, float f) pow (DP_QC_SINCOSSQRTPOW)
3364VM_findfloat, // #98 entity(entity start, .float fld, float match) findfloat (DP_QC_FINDFLOAT)
3365VM_checkextension, // #99 float(string s) checkextension (the basis of the extension system)
3366// FrikaC and Telejano range #100-#199
3367NULL, // #100
3368NULL, // #101
3369NULL, // #102
3370NULL, // #103
3371NULL, // #104
3372NULL, // #105
3373NULL, // #106
3374NULL, // #107
3375NULL, // #108
3376NULL, // #109
3377VM_fopen, // #110 float(string filename, float mode) fopen (FRIK_FILE)
3378VM_fclose, // #111 void(float fhandle) fclose (FRIK_FILE)
3379VM_fgets, // #112 string(float fhandle) fgets (FRIK_FILE)
3380VM_fputs, // #113 void(float fhandle, string s) fputs (FRIK_FILE)
3381VM_strlen, // #114 float(string s) strlen (FRIK_FILE)
3382VM_strcat, // #115 string(string s, string...) strcat (FRIK_FILE)
3383VM_substring, // #116 string(string s, float start, float length) substring (FRIK_FILE)
3384VM_stov, // #117 vector(string) stov (FRIK_FILE)
3385VM_strzone, // #118 string(string s) strzone (FRIK_FILE)
3386VM_strunzone, // #119 void(string s) strunzone (FRIK_FILE)
3387NULL, // #120
3388NULL, // #121
3389NULL, // #122
3390NULL, // #123
3391NULL, // #124
3392NULL, // #125
3393NULL, // #126
3394NULL, // #127
3395NULL, // #128
3396NULL, // #129
3397NULL, // #130
3398NULL, // #131
3399NULL, // #132
3400NULL, // #133
3401NULL, // #134
3402NULL, // #135
3403NULL, // #136
3404NULL, // #137
3405NULL, // #138
3406NULL, // #139
3407NULL, // #140
3408NULL, // #141
3409NULL, // #142
3410NULL, // #143
3411NULL, // #144
3412NULL, // #145
3413NULL, // #146
3414NULL, // #147
3415NULL, // #148
3416NULL, // #149
3417NULL, // #150
3418NULL, // #151
3419NULL, // #152
3420NULL, // #153
3421NULL, // #154
3422NULL, // #155
3423NULL, // #156
3424NULL, // #157
3425NULL, // #158
3426NULL, // #159
3427NULL, // #160
3428NULL, // #161
3429NULL, // #162
3430NULL, // #163
3431NULL, // #164
3432NULL, // #165
3433NULL, // #166
3434NULL, // #167
3435NULL, // #168
3436NULL, // #169
3437NULL, // #170
3438NULL, // #171
3439NULL, // #172
3440NULL, // #173
3441NULL, // #174
3442NULL, // #175
3443NULL, // #176
3444NULL, // #177
3445NULL, // #178
3446NULL, // #179
3447NULL, // #180
3448NULL, // #181
3449NULL, // #182
3450NULL, // #183
3451NULL, // #184
3452NULL, // #185
3453NULL, // #186
3454NULL, // #187
3455NULL, // #188
3456NULL, // #189
3457NULL, // #190
3458NULL, // #191
3459NULL, // #192
3460NULL, // #193
3461NULL, // #194
3462NULL, // #195
3463NULL, // #196
3464NULL, // #197
3465NULL, // #198
3466NULL, // #199
3467// FTEQW range #200-#299
3468NULL, // #200
3469NULL, // #201
3470NULL, // #202
3471NULL, // #203
3472NULL, // #204
3473NULL, // #205
3474NULL, // #206
3475NULL, // #207
3476NULL, // #208
3477NULL, // #209
3478NULL, // #210
3479NULL, // #211
3480NULL, // #212
3481NULL, // #213
3482NULL, // #214
3483NULL, // #215
3484NULL, // #216
3485NULL, // #217
3486VM_bitshift, // #218 float(float number, float quantity) bitshift (EXT_BITSHIFT)
3487NULL, // #219
3488NULL, // #220
3489VM_strstrofs, // #221 float(string str, string sub[, float startpos]) strstrofs (FTE_STRINGS)
3490VM_str2chr, // #222 float(string str, float ofs) str2chr (FTE_STRINGS)
3491VM_chr2str, // #223 string(float c, ...) chr2str (FTE_STRINGS)
3492VM_strconv, // #224 string(float ccase, float calpha, float cnum, string s, ...) strconv (FTE_STRINGS)
3493VM_strpad, // #225 string(float chars, string s, ...) strpad (FTE_STRINGS)
3494VM_infoadd, // #226 string(string info, string key, string value, ...) infoadd (FTE_STRINGS)
3495VM_infoget, // #227 string(string info, string key) infoget (FTE_STRINGS)
3496VM_strncmp, // #228 float(string s1, string s2, float len) strncmp (FTE_STRINGS)
3497VM_strncasecmp, // #229 float(string s1, string s2) strcasecmp (FTE_STRINGS)
3498VM_strncasecmp, // #230 float(string s1, string s2, float len) strncasecmp (FTE_STRINGS)
3499NULL, // #231
3500VM_SV_AddStat, // #232 void(float index, float type, .void field) SV_AddStat (EXT_CSQC)
3501NULL, // #233
3502NULL, // #234
3503NULL, // #235
3504NULL, // #236
3505NULL, // #237
3506NULL, // #238
3507NULL, // #239
3508VM_SV_checkpvs, // #240 float(vector viewpos, entity viewee) checkpvs;
3509NULL, // #241
3510NULL, // #242
3511NULL, // #243
3512NULL, // #244
3513VM_modulo, // #245
3514NULL, // #246
3515NULL, // #247
3516NULL, // #248
3517NULL, // #249
3518NULL, // #250
3519NULL, // #251
3520NULL, // #252
3521NULL, // #253
3522NULL, // #254
3523NULL, // #255
3524NULL, // #256
3525NULL, // #257
3526NULL, // #258
3527NULL, // #259
3528NULL, // #260
3529NULL, // #261
3530NULL, // #262
3531VM_SV_skel_create, // #263 float(float modlindex) skel_create = #263; // (DP_SKELETONOBJECTS) 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.
3532VM_SV_skel_build, // #264 float(float skel, entity ent, float modlindex, float retainfrac, float firstbone, float lastbone) skel_build = #264; // (DP_SKELETONOBJECTS) 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
3533VM_SV_skel_get_numbones, // #265 float(float skel) skel_get_numbones = #265; // (DP_SKELETONOBJECTS) returns how many bones exist in the created skeleton
3534VM_SV_skel_get_bonename, // #266 string(float skel, float bonenum) skel_get_bonename = #266; // (DP_SKELETONOBJECTS) returns name of bone (as a tempstring)
3535VM_SV_skel_get_boneparent, // #267 float(float skel, float bonenum) skel_get_boneparent = #267; // (DP_SKELETONOBJECTS) returns parent num for supplied bonenum, -1 if bonenum has no parent or bone does not exist (returned value is always less than bonenum, you can loop on this)
3536VM_SV_skel_find_bone, // #268 float(float skel, string tagname) skel_find_bone = #268; // (DP_SKELETONOBJECTS) get number of bone with specified name, 0 on failure, tagindex (bonenum+1) on success, same as using gettagindex on the modelindex
3537VM_SV_skel_get_bonerel, // #269 vector(float skel, float bonenum) skel_get_bonerel = #269; // (DP_SKELETONOBJECTS) get matrix of bone in skeleton relative to its parent - sets v_forward, v_right, v_up, returns origin (relative to parent bone)
3538VM_SV_skel_get_boneabs, // #270 vector(float skel, float bonenum) skel_get_boneabs = #270; // (DP_SKELETONOBJECTS) get matrix of bone in skeleton in model space - sets v_forward, v_right, v_up, returns origin (relative to entity)
3539VM_SV_skel_set_bone, // #271 void(float skel, float bonenum, vector org) skel_set_bone = #271; // (DP_SKELETONOBJECTS) set matrix of bone relative to its parent, reads v_forward, v_right, v_up, takes origin as parameter (relative to parent bone)
3540VM_SV_skel_mul_bone, // #272 void(float skel, float bonenum, vector org) skel_mul_bone = #272; // (DP_SKELETONOBJECTS) 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)
3541VM_SV_skel_mul_bones, // #273 void(float skel, float startbone, float endbone, vector org) skel_mul_bones = #273; // (DP_SKELETONOBJECTS) 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)
3542VM_SV_skel_copybones, // #274 void(float skeldst, float skelsrc, float startbone, float endbone) skel_copybones = #274; // (DP_SKELETONOBJECTS) copy bone matrices (relative to their parents) from one skeleton to another, useful for copying a skeleton to a corpse
3543VM_SV_skel_delete, // #275 void(float skel) skel_delete = #275; // (DP_SKELETONOBJECTS) deletes skeleton at the beginning of the next frame (you can add the entity, delete the skeleton, renderscene, and it will still work)
3544VM_SV_frameforname, // #276 float(float modlindex, string framename) frameforname = #276; // (DP_SKELETONOBJECTS) finds number of a specified frame in the animation, returns -1 if no match found
3545VM_SV_frameduration, // #277 float(float modlindex, float framenum) frameduration = #277; // (DP_SKELETONOBJECTS) 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.
3546NULL, // #278
3547NULL, // #279
3548NULL, // #280
3549NULL, // #281
3550NULL, // #282
3551NULL, // #283
3552NULL, // #284
3553NULL, // #285
3554NULL, // #286
3555NULL, // #287
3556NULL, // #288
3557NULL, // #289
3558NULL, // #290
3559NULL, // #291
3560NULL, // #292
3561NULL, // #293
3562NULL, // #294
3563NULL, // #295
3564NULL, // #296
3565NULL, // #297
3566NULL, // #298
3567NULL, // #299
3568// CSQC range #300-#399
3569NULL, // #300 void() clearscene (EXT_CSQC)
3570NULL, // #301 void(float mask) addentities (EXT_CSQC)
3571NULL, // #302 void(entity ent) addentity (EXT_CSQC)
3572NULL, // #303 float(float property, ...) setproperty (EXT_CSQC)
3573NULL, // #304 void() renderscene (EXT_CSQC)
3574NULL, // #305 void(vector org, float radius, vector lightcolours) adddynamiclight (EXT_CSQC)
3575NULL, // #306 void(string texturename, float flag[, float is2d, float lines]) R_BeginPolygon
3576NULL, // #307 void(vector org, vector texcoords, vector rgb, float alpha) R_PolygonVertex
3577NULL, // #308 void() R_EndPolygon
3578NULL, // #309
3579NULL, // #310 vector (vector v) cs_unproject (EXT_CSQC)
3580NULL, // #311 vector (vector v) cs_project (EXT_CSQC)
3581NULL, // #312
3582NULL, // #313
3583NULL, // #314
3584NULL, // #315 void(float width, vector pos1, vector pos2, float flag) drawline (EXT_CSQC)
3585NULL, // #316 float(string name) iscachedpic (EXT_CSQC)
3586NULL, // #317 string(string name, float trywad) precache_pic (EXT_CSQC)
3587NULL, // #318 vector(string picname) draw_getimagesize (EXT_CSQC)
3588NULL, // #319 void(string name) freepic (EXT_CSQC)
3589NULL, // #320 float(vector position, float character, vector scale, vector rgb, float alpha, float flag) drawcharacter (EXT_CSQC)
3590NULL, // #321 float(vector position, string text, vector scale, vector rgb, float alpha, float flag) drawstring (EXT_CSQC)
3591NULL, // #322 float(vector position, string pic, vector size, vector rgb, float alpha, float flag) drawpic (EXT_CSQC)
3592NULL, // #323 float(vector position, vector size, vector rgb, float alpha, float flag) drawfill (EXT_CSQC)
3593NULL, // #324 void(float x, float y, float width, float height) drawsetcliparea
3594NULL, // #325 void(void) drawresetcliparea
3595NULL, // #326
3596NULL, // #327
3597NULL, // #328
3598NULL, // #329
3599NULL, // #330 float(float stnum) getstatf (EXT_CSQC)
3600NULL, // #331 float(float stnum) getstati (EXT_CSQC)
3601NULL, // #332 string(float firststnum) getstats (EXT_CSQC)
3602VM_SV_setmodelindex, // #333 void(entity e, float mdlindex) setmodelindex (EXT_CSQC)
3603VM_SV_modelnameforindex, // #334 string(float mdlindex) modelnameforindex (EXT_CSQC)
3604VM_SV_particleeffectnum, // #335 float(string effectname) particleeffectnum (EXT_CSQC)
3605VM_SV_trailparticles, // #336 void(entity ent, float effectnum, vector start, vector end) trailparticles (EXT_CSQC)
3606VM_SV_pointparticles, // #337 void(float effectnum, vector origin [, vector dir, float count]) pointparticles (EXT_CSQC)
3607NULL, // #338 void(string s, ...) centerprint (EXT_CSQC)
3608VM_print, // #339 void(string s, ...) print (EXT_CSQC, DP_SV_PRINT)
3609NULL, // #340 string(float keynum) keynumtostring (EXT_CSQC)
3610NULL, // #341 float(string keyname) stringtokeynum (EXT_CSQC)
3611NULL, // #342 string(float keynum) getkeybind (EXT_CSQC)
3612NULL, // #343 void(float usecursor) setcursormode (EXT_CSQC)
3613NULL, // #344 vector() getmousepos (EXT_CSQC)
3614NULL, // #345 float(float framenum) getinputstate (EXT_CSQC)
3615NULL, // #346 void(float sens) setsensitivityscaler (EXT_CSQC)
3616NULL, // #347 void() runstandardplayerphysics (EXT_CSQC)
3617NULL, // #348 string(float playernum, string keyname) getplayerkeyvalue (EXT_CSQC)
3618NULL, // #349 float() isdemo (EXT_CSQC)
3619VM_isserver, // #350 float() isserver (EXT_CSQC)
3620NULL, // #351 void(vector origin, vector forward, vector right, vector up) SetListener (EXT_CSQC)
3621VM_SV_registercommand, // #352 void(string cmdname) registercommand (EXT_CSQC)
3622VM_wasfreed, // #353 float(entity ent) wasfreed (EXT_CSQC) (should be availabe on server too)
3623VM_SV_serverkey, // #354 string(string key) serverkey (EXT_CSQC)
3624NULL, // #355
3625NULL, // #356
3626NULL, // #357
3627NULL, // #358
3628NULL, // #359
3629NULL, // #360 float() readbyte (EXT_CSQC)
3630NULL, // #361 float() readchar (EXT_CSQC)
3631NULL, // #362 float() readshort (EXT_CSQC)
3632NULL, // #363 float() readlong (EXT_CSQC)
3633NULL, // #364 float() readcoord (EXT_CSQC)
3634NULL, // #365 float() readangle (EXT_CSQC)
3635NULL, // #366 string() readstring (EXT_CSQC)
3636NULL, // #367 float() readfloat (EXT_CSQC)
3637NULL, // #368
3638NULL, // #369
3639NULL, // #370
3640NULL, // #371
3641NULL, // #372
3642NULL, // #373
3643NULL, // #374
3644NULL, // #375
3645NULL, // #376
3646NULL, // #377
3647NULL, // #378
3648NULL, // #379
3649NULL, // #380
3650NULL, // #381
3651NULL, // #382
3652NULL, // #383
3653NULL, // #384
3654NULL, // #385
3655NULL, // #386
3656NULL, // #387
3657NULL, // #388
3658NULL, // #389
3659NULL, // #390
3660NULL, // #391
3661NULL, // #392
3662NULL, // #393
3663NULL, // #394
3664NULL, // #395
3665NULL, // #396
3666NULL, // #397
3667NULL, // #398
3668NULL, // #399
3669// LadyHavoc's range #400-#499
3670VM_SV_copyentity, // #400 void(entity from, entity to) copyentity (DP_QC_COPYENTITY)
3671VM_SV_setcolor, // #401 void(entity ent, float colors) setcolor (DP_QC_SETCOLOR)
3672VM_findchain, // #402 entity(.string fld, string match) findchain (DP_QC_FINDCHAIN)
3673VM_findchainfloat, // #403 entity(.float fld, float match) findchainfloat (DP_QC_FINDCHAINFLOAT)
3674VM_SV_effect, // #404 void(vector org, string modelname, float startframe, float endframe, float framerate) effect (DP_SV_EFFECT)
3675VM_SV_te_blood, // #405 void(vector org, vector velocity, float howmany) te_blood (DP_TE_BLOOD)
3676VM_SV_te_bloodshower, // #406 void(vector mincorner, vector maxcorner, float explosionspeed, float howmany) te_bloodshower (DP_TE_BLOODSHOWER)
3677VM_SV_te_explosionrgb, // #407 void(vector org, vector color) te_explosionrgb (DP_TE_EXPLOSIONRGB)
3678VM_SV_te_particlecube, // #408 void(vector mincorner, vector maxcorner, vector vel, float howmany, float color, float gravityflag, float randomveljitter) te_particlecube (DP_TE_PARTICLECUBE)
3679VM_SV_te_particlerain, // #409 void(vector mincorner, vector maxcorner, vector vel, float howmany, float color) te_particlerain (DP_TE_PARTICLERAIN)
3680VM_SV_te_particlesnow, // #410 void(vector mincorner, vector maxcorner, vector vel, float howmany, float color) te_particlesnow (DP_TE_PARTICLESNOW)
3681VM_SV_te_spark, // #411 void(vector org, vector vel, float howmany) te_spark (DP_TE_SPARK)
3682VM_SV_te_gunshotquad, // #412 void(vector org) te_gunshotquad (DP_QUADEFFECTS1)
3683VM_SV_te_spikequad, // #413 void(vector org) te_spikequad (DP_QUADEFFECTS1)
3684VM_SV_te_superspikequad, // #414 void(vector org) te_superspikequad (DP_QUADEFFECTS1)
3685VM_SV_te_explosionquad, // #415 void(vector org) te_explosionquad (DP_QUADEFFECTS1)
3686VM_SV_te_smallflash, // #416 void(vector org) te_smallflash (DP_TE_SMALLFLASH)
3687VM_SV_te_customflash, // #417 void(vector org, float radius, float lifetime, vector color) te_customflash (DP_TE_CUSTOMFLASH)
3688VM_SV_te_gunshot, // #418 void(vector org) te_gunshot (DP_TE_STANDARDEFFECTBUILTINS)
3689VM_SV_te_spike, // #419 void(vector org) te_spike (DP_TE_STANDARDEFFECTBUILTINS)
3690VM_SV_te_superspike, // #420 void(vector org) te_superspike (DP_TE_STANDARDEFFECTBUILTINS)
3691VM_SV_te_explosion, // #421 void(vector org) te_explosion (DP_TE_STANDARDEFFECTBUILTINS)
3692VM_SV_te_tarexplosion, // #422 void(vector org) te_tarexplosion (DP_TE_STANDARDEFFECTBUILTINS)
3693VM_SV_te_wizspike, // #423 void(vector org) te_wizspike (DP_TE_STANDARDEFFECTBUILTINS)
3694VM_SV_te_knightspike, // #424 void(vector org) te_knightspike (DP_TE_STANDARDEFFECTBUILTINS)
3695VM_SV_te_lavasplash, // #425 void(vector org) te_lavasplash (DP_TE_STANDARDEFFECTBUILTINS)
3696VM_SV_te_teleport, // #426 void(vector org) te_teleport (DP_TE_STANDARDEFFECTBUILTINS)
3697VM_SV_te_explosion2, // #427 void(vector org, float colorstart, float colorlength) te_explosion2 (DP_TE_STANDARDEFFECTBUILTINS)
3698VM_SV_te_lightning1, // #428 void(entity own, vector start, vector end) te_lightning1 (DP_TE_STANDARDEFFECTBUILTINS)
3699VM_SV_te_lightning2, // #429 void(entity own, vector start, vector end) te_lightning2 (DP_TE_STANDARDEFFECTBUILTINS)
3700VM_SV_te_lightning3, // #430 void(entity own, vector start, vector end) te_lightning3 (DP_TE_STANDARDEFFECTBUILTINS)
3701VM_SV_te_beam, // #431 void(entity own, vector start, vector end) te_beam (DP_TE_STANDARDEFFECTBUILTINS)
3702VM_vectorvectors, // #432 void(vector dir) vectorvectors (DP_QC_VECTORVECTORS)
3703VM_SV_te_plasmaburn, // #433 void(vector org) te_plasmaburn (DP_TE_PLASMABURN)
3704VM_getsurfacenumpoints, // #434 float(entity e, float s) getsurfacenumpoints (DP_QC_GETSURFACE)
3705VM_getsurfacepoint, // #435 vector(entity e, float s, float n) getsurfacepoint (DP_QC_GETSURFACE)
3706VM_getsurfacenormal, // #436 vector(entity e, float s) getsurfacenormal (DP_QC_GETSURFACE)
3707VM_getsurfacetexture, // #437 string(entity e, float s) getsurfacetexture (DP_QC_GETSURFACE)
3708VM_getsurfacenearpoint, // #438 float(entity e, vector p) getsurfacenearpoint (DP_QC_GETSURFACE)
3709VM_getsurfaceclippedpoint, // #439 vector(entity e, float s, vector p) getsurfaceclippedpoint (DP_QC_GETSURFACE)
3710VM_SV_clientcommand, // #440 void(entity e, string s) clientcommand (KRIMZON_SV_PARSECLIENTCOMMAND)
3711VM_tokenize, // #441 float(string s) tokenize (KRIMZON_SV_PARSECLIENTCOMMAND)
3712VM_argv, // #442 string(float n) argv (KRIMZON_SV_PARSECLIENTCOMMAND)
3713VM_SV_setattachment, // #443 void(entity e, entity tagentity, string tagname) setattachment (DP_GFX_QUAKE3MODELTAGS)
3714VM_search_begin, // #444 float(string pattern, float caseinsensitive, float quiet) search_begin (DP_QC_FS_SEARCH)
3715VM_search_end, // #445 void(float handle) search_end (DP_QC_FS_SEARCH)
3716VM_search_getsize, // #446 float(float handle) search_getsize (DP_QC_FS_SEARCH)
3717VM_search_getfilename, // #447 string(float handle, float num) search_getfilename (DP_QC_FS_SEARCH)
3718VM_cvar_string, // #448 string(string s) cvar_string (DP_QC_CVAR_STRING)
3719VM_findflags, // #449 entity(entity start, .float fld, float match) findflags (DP_QC_FINDFLAGS)
3720VM_findchainflags, // #450 entity(.float fld, float match) findchainflags (DP_QC_FINDCHAINFLAGS)
3721VM_SV_gettagindex, // #451 float(entity ent, string tagname) gettagindex (DP_QC_GETTAGINFO)
3722VM_SV_gettaginfo, // #452 vector(entity ent, float tagindex) gettaginfo (DP_QC_GETTAGINFO)
3723VM_SV_dropclient, // #453 void(entity clent) dropclient (DP_SV_DROPCLIENT)
3724VM_SV_spawnclient, // #454 entity() spawnclient (DP_SV_BOTCLIENT)
3725VM_SV_clienttype, // #455 float(entity clent) clienttype (DP_SV_BOTCLIENT)
3726VM_SV_WriteUnterminatedString, // #456 void(float to, string s) WriteUnterminatedString (DP_SV_WRITEUNTERMINATEDSTRING)
3727VM_SV_te_flamejet, // #457 void(vector org, vector vel, float howmany) te_flamejet = #457 (DP_TE_FLAMEJET)
3728NULL, // #458
3729VM_ftoe, // #459 entity(float num) entitybyindex (DP_QC_EDICT_NUM)
3730VM_buf_create, // #460 float() buf_create (DP_QC_STRINGBUFFERS)
3731VM_buf_del, // #461 void(float bufhandle) buf_del (DP_QC_STRINGBUFFERS)
3732VM_buf_getsize, // #462 float(float bufhandle) buf_getsize (DP_QC_STRINGBUFFERS)
3733VM_buf_copy, // #463 void(float bufhandle_from, float bufhandle_to) buf_copy (DP_QC_STRINGBUFFERS)
3734VM_buf_sort, // #464 void(float bufhandle, float sortpower, float backward) buf_sort (DP_QC_STRINGBUFFERS)
3735VM_buf_implode, // #465 string(float bufhandle, string glue) buf_implode (DP_QC_STRINGBUFFERS)
3736VM_bufstr_get, // #466 string(float bufhandle, float string_index) bufstr_get (DP_QC_STRINGBUFFERS)
3737VM_bufstr_set, // #467 void(float bufhandle, float string_index, string str) bufstr_set (DP_QC_STRINGBUFFERS)
3738VM_bufstr_add, // #468 float(float bufhandle, string str, float order) bufstr_add (DP_QC_STRINGBUFFERS)
3739VM_bufstr_free, // #469 void(float bufhandle, float string_index) bufstr_free (DP_QC_STRINGBUFFERS)
3740NULL, // #470
3741VM_asin, // #471 float(float s) VM_asin (DP_QC_ASINACOSATANATAN2TAN)
3742VM_acos, // #472 float(float c) VM_acos (DP_QC_ASINACOSATANATAN2TAN)
3743VM_atan, // #473 float(float t) VM_atan (DP_QC_ASINACOSATANATAN2TAN)
3744VM_atan2, // #474 float(float c, float s) VM_atan2 (DP_QC_ASINACOSATANATAN2TAN)
3745VM_tan, // #475 float(float a) VM_tan (DP_QC_ASINACOSATANATAN2TAN)
3746VM_strlennocol, // #476 float(string s) : DRESK - String Length (not counting color codes) (DP_QC_STRINGCOLORFUNCTIONS)
3747VM_strdecolorize, // #477 string(string s) : DRESK - Decolorized String (DP_SV_STRINGCOLORFUNCTIONS)
3748VM_strftime, // #478 string(float uselocaltime, string format, ...) (DP_QC_STRFTIME)
3749VM_tokenizebyseparator, // #479 float(string s) tokenizebyseparator (DP_QC_TOKENIZEBYSEPARATOR)
3750VM_strtolower, // #480 string(string s) VM_strtolower (DP_QC_STRING_CASE_FUNCTIONS)
3751VM_strtoupper, // #481 string(string s) VM_strtoupper (DP_QC_STRING_CASE_FUNCTIONS)
3752VM_cvar_defstring, // #482 string(string s) cvar_defstring (DP_QC_CVAR_DEFSTRING)
3753VM_SV_pointsound, // #483 void(vector origin, string sample, float volume, float attenuation) (DP_SV_POINTSOUND)
3754VM_strreplace, // #484 string(string search, string replace, string subject) strreplace (DP_QC_STRREPLACE)
3755VM_strireplace, // #485 string(string search, string replace, string subject) strireplace (DP_QC_STRREPLACE)
3756VM_getsurfacepointattribute,// #486 vector(entity e, float s, float n, float a) getsurfacepointattribute = #486;
3757NULL, // #487
3758NULL, // #488
3759NULL, // #489
3760NULL, // #490
3761NULL, // #491
3762NULL, // #492
3763NULL, // #493
3764VM_crc16, // #494 float(float caseinsensitive, string s, ...) crc16 = #494 (DP_QC_CRC16)
3765VM_cvar_type, // #495 float(string name) cvar_type = #495; (DP_QC_CVAR_TYPE)
3766VM_numentityfields, // #496 float() numentityfields = #496; (DP_QC_ENTITYDATA)
3767VM_entityfieldname, // #497 string(float fieldnum) entityfieldname = #497; (DP_QC_ENTITYDATA)
3768VM_entityfieldtype, // #498 float(float fieldnum) entityfieldtype = #498; (DP_QC_ENTITYDATA)
3769VM_getentityfieldstring, // #499 string(float fieldnum, entity ent) getentityfieldstring = #499; (DP_QC_ENTITYDATA)
3770VM_putentityfieldstring, // #500 float(float fieldnum, entity ent, string s) putentityfieldstring = #500; (DP_QC_ENTITYDATA)
3771VM_SV_WritePicture, // #501
3772NULL, // #502
3773VM_whichpack, // #503 string(string) whichpack = #503;
3774NULL, // #504
3775NULL, // #505
3776NULL, // #506
3777NULL, // #507
3778NULL, // #508
3779NULL, // #509
3780VM_uri_escape, // #510 string(string in) uri_escape = #510;
3781VM_uri_unescape, // #511 string(string in) uri_unescape = #511;
3782VM_etof, // #512 float(entity ent) num_for_edict = #512 (DP_QC_NUM_FOR_EDICT)
3783VM_uri_get, // #513 float(string uri, float id, [string post_contenttype, string post_delim, [float buf]]) uri_get = #513; (DP_QC_URI_GET, DP_QC_URI_POST)
3784VM_tokenize_console, // #514 float(string str) tokenize_console = #514; (DP_QC_TOKENIZE_CONSOLE)
3785VM_argv_start_index, // #515 float(float idx) argv_start_index = #515; (DP_QC_TOKENIZE_CONSOLE)
3786VM_argv_end_index, // #516 float(float idx) argv_end_index = #516; (DP_QC_TOKENIZE_CONSOLE)
3787VM_buf_cvarlist, // #517 void(float buf, string prefix, string antiprefix) buf_cvarlist = #517; (DP_QC_STRINGBUFFERS_CVARLIST)
3788VM_cvar_description, // #518 float(string name) cvar_description = #518; (DP_QC_CVAR_DESCRIPTION)
3789VM_gettime, // #519 float(float timer) gettime = #519; (DP_QC_GETTIME)
3790NULL, // #520
3791NULL, // #521
3792NULL, // #522
3793NULL, // #523
3794NULL, // #524
3795NULL, // #525
3796NULL, // #526
3797NULL, // #527
3798NULL, // #528
3799VM_loadfromdata, // #529
3800VM_loadfromfile, // #530
3801VM_SV_setpause, // #531 void(float pause) setpause = #531;
3802VM_log, // #532
3803VM_getsoundtime, // #533 float(entity e, float channel) getsoundtime = #533; (DP_SND_GETSOUNDTIME)
3804VM_soundlength, // #534 float(string sample) soundlength = #534; (DP_SND_GETSOUNDTIME)
3805VM_buf_loadfile, // #535 float(string filename, float bufhandle) buf_loadfile (DP_QC_STRINGBUFFERS_EXT_WIP)
3806VM_buf_writefile, // #536 float(float filehandle, float bufhandle, float startpos, float numstrings) buf_writefile (DP_QC_STRINGBUFFERS_EXT_WIP)
3807VM_bufstr_find, // #537 float(float bufhandle, string match, float matchrule, float startpos) bufstr_find (DP_QC_STRINGBUFFERS_EXT_WIP)
3808VM_matchpattern, // #538 float(string s, string pattern, float matchrule) matchpattern (DP_QC_STRINGBUFFERS_EXT_WIP)
3809NULL, // #539
3810VM_physics_enable, // #540 void(entity e, float physics_enabled) physics_enable = #540; (DP_PHYSICS_ODE)
3811VM_physics_addforce, // #541 void(entity e, vector force, vector relative_ofs) physics_addforce = #541; (DP_PHYSICS_ODE)
3812VM_physics_addtorque, // #542 void(entity e, vector torque) physics_addtorque = #542; (DP_PHYSICS_ODE)
3813NULL, // #543
3814NULL, // #544
3815NULL, // #545
3816NULL, // #546
3817NULL, // #547
3818NULL, // #548
3819NULL, // #549
3820NULL, // #550
3821NULL, // #551
3822NULL, // #552
3823NULL, // #553
3824NULL, // #554
3825NULL, // #555
3826NULL, // #556
3827NULL, // #557
3828NULL, // #558
3829NULL, // #559
3830NULL, // #560
3831NULL, // #561
3832NULL, // #562
3833NULL, // #563
3834NULL, // #564
3835NULL, // #565
3836VM_SV_findbox, // #566 entity(vector mins, vector maxs) findbox = #566; (DP_QC_FINDBOX)
3837VM_nudgeoutofsolid, // #567 float(entity ent) nudgeoutofsolid = #567; (DP_QC_NUDGEOUTOFSOLID)
3838NULL, // #568
3839NULL, // #569
3840NULL, // #570
3841NULL, // #571
3842NULL, // #572
3843NULL, // #573
3844NULL, // #574
3845NULL, // #575
3846NULL, // #576
3847NULL, // #577
3848NULL, // #578
3849NULL, // #579
3850NULL, // #580
3851NULL, // #581
3852NULL, // #582
3853NULL, // #583
3854NULL, // #584
3855NULL, // #585
3856NULL, // #586
3857NULL, // #587
3858NULL, // #588
3859NULL, // #589
3860NULL, // #590
3861NULL, // #591
3862NULL, // #592
3863NULL, // #593
3864NULL, // #594
3865NULL, // #595
3866NULL, // #596
3867NULL, // #597
3868NULL, // #598
3869NULL, // #599
3870NULL, // #600
3871NULL, // #601
3872NULL, // #602
3873NULL, // #603
3874NULL, // #604
3875VM_callfunction, // #605
3876VM_writetofile, // #606
3877VM_isfunction, // #607
3878NULL, // #608
3879NULL, // #609
3880NULL, // #610
3881NULL, // #611
3882NULL, // #612
3883VM_parseentitydata, // #613
3884NULL, // #614
3885NULL, // #615
3886NULL, // #616
3887NULL, // #617
3888NULL, // #618
3889NULL, // #619
3890NULL, // #620
3891NULL, // #621
3892NULL, // #622
3893NULL, // #623
3894VM_SV_getextresponse, // #624 string getextresponse(void)
3895NULL, // #625
3896NULL, // #626
3897VM_sprintf, // #627 string sprintf(string format, ...)
3898VM_getsurfacenumtriangles, // #628 float(entity e, float s) getsurfacenumpoints (DP_QC_GETSURFACETRIANGLE)
3899VM_getsurfacetriangle, // #629 vector(entity e, float s, float n) getsurfacepoint (DP_QC_GETSURFACETRIANGLE)
3900NULL, // #630
3901NULL, // #631
3902NULL, // #632
3903NULL, // #633
3904NULL, // #634
3905NULL, // #635
3906NULL, // #636
3907NULL, // #637
3908NULL, // #638
3909VM_digest_hex, // #639
3910NULL, // #640
3911NULL, // #641
3912VM_coverage, // #642
3913NULL, // #643
3914};
3915
3917
3919{
3920 VM_Cmd_Init(prog);
3921}
3922
3924{
3925 World_End(&sv.world);
3926 VM_Cmd_Reset(prog);
3927}
#define SUPERCONTENTS_BODY
Definition bspfile.h:201
#define SUPERCONTENTS_SOLID
Definition bspfile.h:196
#define MAX_FRAMEBLENDS
Definition client.h:309
void Cmd_AddCommand(unsigned flags, const char *cmd_name, xcommand_t function, const char *description)
called by the init functions of other parts of the program to register commands and functions to call...
Definition cmd.c:1661
void Cmd_ExecuteString(cmd_state_t *cmd, const char *text, size_t textlen, cmd_source_t src, qbool lockmutex)
Parses a single line of text into arguments and tries to execute it.
Definition cmd.c:2068
cmd_state_t * cmd_serverfromclient
command interpreter for server commands received over network from clients uses cmddefs_null
Definition cmd.c:26
@ src_client
came in over a net connection as a clc_stringcmd host_client will be valid during this state.
Definition cmd.h:73
#define CF_SERVER
cvar/command that only the server can change/execute
Definition cmd.h:49
cvar_t collision_extendmovelength
Definition collision.c:14
cvar_t collision_extendtracelinelength
Definition collision.c:16
cvar_t collision_extendtraceboxlength
Definition collision.c:15
size_t InfoString_GetValue(const char *buffer, const char *key, char *value, size_t valuesize)
Returns the number of bytes written to *value excluding the \0 terminator.
void MSG_WriteShort(sizebuf_t *sb, int c)
Definition com_msg.c:138
void MSG_WriteString(sizebuf_t *sb, const char *s)
Definition com_msg.c:173
void MSG_WriteLong(sizebuf_t *sb, int c)
Definition com_msg.c:147
void MSG_WriteCoord(sizebuf_t *sb, float f, protocolversion_t protocol)
Definition com_msg.c:202
void MSG_WriteByte(sizebuf_t *sb, int c)
Definition com_msg.c:130
void MSG_WriteVector(sizebuf_t *sb, const vec3_t v, protocolversion_t protocol)
Definition com_msg.c:214
void MSG_WriteAngle(sizebuf_t *sb, float f, protocolversion_t protocol)
Definition com_msg.c:237
void MSG_WriteUnterminatedString(sizebuf_t *sb, const char *s)
Definition com_msg.c:181
void MSG_WriteChar(sizebuf_t *sb, int c)
Definition com_msg.c:122
void SZ_Write(sizebuf_t *buf, const unsigned char *data, int length)
Definition common.c:72
@ PROTOCOL_NEHAHRABJP2
same as NEHAHRABJP but with 16bit soundindex
Definition common.h:147
@ PROTOCOL_NEHAHRABJP
same as QUAKEDP but with 16bit modelindex
Definition common.h:146
@ PROTOCOL_NEHAHRABJP3
same as NEHAHRABJP2 but with some changes
Definition common.h:148
#define dp_strlcpy(dst, src, dsize)
Definition common.h:303
void Con_Print(const char *msg)
Prints to all appropriate console targets, and adds timestamps.
Definition console.c:1504
void Con_DPrintf(const char *fmt,...)
A Con_Printf that only shows up if the "developer" cvar is set.
Definition console.c:1544
void Con_Printf(const char *fmt,...)
Prints to all appropriate console targets.
Definition console.c:1514
vector v_up
vector size
string classname
float flags
float modelindex
float gettaginfo_parent
entity self
vector avelocity
float mod(float dividend, float divisor)
vector mins
vector velocity
entity chain
vector gettaginfo_forward
string gettaginfo_name
float skin
float skeletonindex
vector v_right
vector maxs
vector angles
float colormap
vector absmax
vector v_forward
float entnum
vector origin
vector gettaginfo_right
vector gettaginfo_up
string model
vector gettaginfo_offset
entity() spawn
float solid
vector absmin
float frame
float scale
float style
entity viewmodelforclient
entity tag_entity
vector color
float tag_index
float clientcolors
#define n(x, y)
static int(ZEXPORT *qz_inflate)(z_stream *strm
GLfloat GLfloat GLfloat v2
Definition glquake.h:747
GLenum GLenum GLsizei count
Definition glquake.h:656
GLfloat GLfloat v1
Definition glquake.h:743
GLuint GLuint GLintptr offset
Definition glquake.h:632
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition glquake.h:657
const GLchar * name
Definition glquake.h:601
GLenum type
Definition glquake.h:656
host_static_t host
Definition host.c:41
cvar_t developer_extra
Definition host.c:49
qbool Image_Compress(const char *imagename, size_t maxsize, void **buf, size_t *size)
Definition jpeg.c:1047
vec3_t vec3_origin
Definition mathlib.c:26
#define max(A, B)
Definition mathlib.h:38
#define VectorNegate(a, b)
Definition mathlib.h:95
#define min(A, B)
Definition mathlib.h:37
#define VectorNormalize(v)
Definition mathlib.h:104
#define VectorClear(a)
Definition mathlib.h:97
#define bound(min, num, max)
Definition mathlib.h:34
#define VectorMAMAM(scale1, b1, scale2, b2, scale3, b3, out)
Definition mathlib.h:117
#define VectorLength2(a)
Definition mathlib.h:110
#define VectorSubtract(a, b, out)
Definition mathlib.h:99
#define DotProduct(a, b)
Definition mathlib.h:98
#define VectorCopy(in, out)
Definition mathlib.h:101
#define VectorScale(in, scale, out)
Definition mathlib.h:111
#define VectorAdd(a, b, out)
Definition mathlib.h:100
#define M_PI
Definition mathlib.h:28
#define VectorMA(a, scale, b, out)
Definition mathlib.h:114
void Matrix4x4_Concat(matrix4x4_t *out, const matrix4x4_t *in1, const matrix4x4_t *in2)
Definition matrixlib.c:83
void Matrix4x4_CreateIdentity(matrix4x4_t *out)
Definition matrixlib.c:564
void Matrix4x4_FromBonePose7s(matrix4x4_t *m, float originscale, const short *pose7s)
Definition matrixlib.c:1599
void Matrix4x4_CreateFromQuakeEntity(matrix4x4_t *out, double x, double y, double z, double pitch, double yaw, double roll, double scale)
Definition matrixlib.c:715
void Matrix4x4_Normalize3(matrix4x4_t *out, matrix4x4_t *in1)
Definition matrixlib.c:508
void Matrix4x4_Interpolate(matrix4x4_t *out, matrix4x4_t *in1, matrix4x4_t *in2, double frac)
Definition matrixlib.c:475
void Matrix4x4_FromVectors(matrix4x4_t *out, const float vx[3], const float vy[3], const float vz[3], const float t[3])
Definition matrixlib.c:970
void Matrix4x4_Accumulate(matrix4x4_t *out, matrix4x4_t *in, double weight)
Definition matrixlib.c:491
void Matrix4x4_ToVectors(const matrix4x4_t *in, float vx[3], float vy[3], float vz[3], float t[3])
Definition matrixlib.c:939
const matrix4x4_t identitymatrix
Definition matrixlib.c:9
void Matrix4x4_Copy(matrix4x4_t *out, const matrix4x4_t *in)
Definition matrixlib.c:19
float strlen(string s)
float cos(float f)
float sin(float f)
int Mod_Alias_GetExtendedTagInfoForIndex(const model_t *model, unsigned int skin, const frameblend_t *frameblend, const skeleton_t *skeleton, int tagindex, int *parentindex, const char **tagname, matrix4x4_t *tag_localmatrix)
int Mod_Alias_GetTagMatrix(const model_t *model, const frameblend_t *frameblend, const skeleton_t *skeleton, int tagindex, matrix4x4_t *outmatrix)
int Mod_Alias_GetTagIndexForName(const model_t *model, unsigned int skin, const char *tagname)
int Mod_Q1BSP_NativeContentsFromSuperContents(int supercontents)
@ mod_alias
unstickresult_t PHYS_NudgeOutOfSolid(prvm_prog_t *prog, prvm_edict_t *ent)
Definition phys.c:136
#define OFS_NULL
Definition pr_comp.h:32
#define OFS_PARM4
Definition pr_comp.h:38
#define OFS_PARM2
Definition pr_comp.h:36
#define OFS_PARM3
Definition pr_comp.h:37
#define OFS_RETURN
Definition pr_comp.h:33
#define OFS_PARM5
Definition pr_comp.h:39
#define OFS_PARM6
Definition pr_comp.h:40
#define OFS_PARM0
Definition pr_comp.h:34
#define OFS_PARM1
Definition pr_comp.h:35
float parm1
Definition progsdefs.qc:45
float team
Definition progsdefs.qc:172
entity msg_entity
Definition progsdefs.qc:63
vector v_angle
Definition progsdefs.qc:161
vector view_ofs
Definition progsdefs.qc:151
float health
Definition progsdefs.qc:137
entity groundentity
Definition progsdefs.qc:134
float teamplay
Definition progsdefs.qc:31
float takedamage
Definition progsdefs.qc:147
#define PRVM_gameedictvector(ed, fieldname)
Definition progsvm.h:161
#define PRVM_serveredictvector(ed, fieldname)
Definition progsvm.h:173
int PRVM_SetTempString(prvm_prog_t *prog, const char *s, size_t slen)
Takes an strlen (not a buffer size).
void VM_Cmd_Init(prvm_prog_t *prog)
Definition prvm_cmds.c:5265
void VM_Warning(prvm_prog_t *prog, const char *fmt,...) DP_FUNC_PRINTF(2)
Definition prvm_cmds.c:25
#define PRVM_serverglobaledict(fieldname)
Definition progsvm.h:180
#define PRVM_serveredictedict(ed, fieldname)
Definition progsvm.h:175
void VM_UpdateEdictSkeleton(prvm_prog_t *prog, prvm_edict_t *ed, const struct model_s *edmodel, const struct frameblend_s *frameblend)
#define PRVM_E_FLOAT(e, o)
Definition progsvm.h:891
#define PRVM_EDICT_TO_PROG(e)
Definition progsvm.h:875
#define PRVM_gameedictstring(ed, fieldname)
Definition progsvm.h:162
int PRVM_SetEngineString(prvm_prog_t *prog, const char *s)
void VM_Cmd_Reset(prvm_prog_t *prog)
Definition prvm_cmds.c:5274
#define PRVM_G_EDICTNUM(o)
Definition progsvm.h:885
#define PRVM_EDICT_NUM(n)
Definition progsvm.h:867
#define PRVM_NEXT_EDICT(e)
Definition progsvm.h:873
void(* prvm_builtin_t)(struct prvm_prog_s *prog)
Definition progsvm.h:256
const char * PRVM_GetString(prvm_prog_t *prog, int num)
#define PRVM_EDICT_MARK_SETORIGIN_CAUGHT
Definition progsvm.h:79
#define PRVM_EDICTFIELDEDICT(ed, fieldoffset)
Definition progsvm.h:213
void VM_GenerateFrameGroupBlend(prvm_prog_t *prog, struct framegroupblend_s *framegroupblend, const prvm_edict_t *ed)
#define PRVM_NUM_FOR_EDICT(e)
Definition progsvm.h:870
#define PRVM_PROG_TO_EDICT(n)
Definition progsvm.h:877
#define PRVM_serverglobalfloat(fieldname)
Definition progsvm.h:177
#define PRVM_serveredictfloat(ed, fieldname)
Definition progsvm.h:172
#define PRVM_clientglobalvector(fieldname)
Definition progsvm.h:190
#define PRVM_serverglobalstring(fieldname)
Definition progsvm.h:179
#define PRVM_serveredictstring(ed, fieldname)
Definition progsvm.h:174
void VM_FrameBlendFromFrameGroupBlend(struct frameblend_s *frameblend, const struct framegroupblend_s *framegroupblend, const struct model_s *model, double curtime)
#define PRVM_EDICT_MARK_WAIT_FOR_SETORIGIN
Definition progsvm.h:78
#define PRVM_G_STRING(o)
Definition progsvm.h:887
void PRVM_ED_Free(prvm_prog_t *prog, prvm_edict_t *ed)
Definition prvm_edict.c:314
#define PRVM_E_STRING(e, o)
Definition progsvm.h:894
#define PRVM_G_FLOAT(o)
Definition progsvm.h:882
#define PRVM_G_EDICT(o)
Definition progsvm.h:884
#define PRVM_serverglobalvector(fieldname)
Definition progsvm.h:178
#define PRVM_G_VECTOR(o)
Definition progsvm.h:886
#define SVVM_prog
Definition progsvm.h:766
#define PRVM_G_INT(o)
Definition progsvm.h:883
#define svc_pointparticles1
Definition protocol.h:282
#define TE_CUSTOMFLASH
Definition protocol.h:345
#define svc_print
Definition protocol.h:222
#define TE_EXPLOSION
Definition protocol.h:311
#define svc_setpause
Definition protocol.h:246
#define svc_spawnstaticsound2
Definition protocol.h:279
#define svc_spawnstaticsound
Definition protocol.h:254
#define TE_WIZSPIKE
Definition protocol.h:315
#define svc_temp_entity
Definition protocol.h:244
#define TE_GUNSHOTQUAD
Definition protocol.h:338
#define MAX_FRAMEGROUPBLENDS
Definition protocol.h:408
#define TE_TAREXPLOSION
Definition protocol.h:312
#define TE_GUNSHOT
Definition protocol.h:310
#define svc_spawnstatic2
Definition protocol.h:276
#define TE_SPIKEQUAD
Definition protocol.h:339
#define TE_PARTICLERAIN
Definition protocol.h:336
#define TE_BEAM
Definition protocol.h:323
#define TE_PLASMABURN
Definition protocol.h:347
#define TE_PARTICLESNOW
Definition protocol.h:337
#define TE_LAVASPLASH
Definition protocol.h:318
#define TE_SMALLFLASH
Definition protocol.h:344
#define TE_EXPLOSION2
Definition protocol.h:320
#define TE_TELEPORT
Definition protocol.h:319
#define TE_SUPERSPIKEQUAD
Definition protocol.h:340
#define TE_LIGHTNING2
Definition protocol.h:314
#define TE_BLOODSHOWER
Definition protocol.h:333
#define TE_KNIGHTSPIKE
Definition protocol.h:316
#define svc_spawnstatic
Definition protocol.h:240
#define svc_pointparticles
Definition protocol.h:281
#define svc_trailparticles
Definition protocol.h:280
#define TE_FLAMEJET
Definition protocol.h:346
#define svc_lightstyle
Definition protocol.h:231
#define TE_PARTICLECUBE
Definition protocol.h:335
#define svc_updatecolors
Definition protocol.h:236
#define TE_LIGHTNING1
Definition protocol.h:313
#define TE_BLOOD
Definition protocol.h:331
#define TE_SUPERSPIKE
Definition protocol.h:309
#define TE_EXPLOSIONRGB
Definition protocol.h:334
#define TE_LIGHTNING3
Definition protocol.h:317
#define TE_SPARK
Definition protocol.h:332
#define TE_EXPLOSIONQUAD
Definition protocol.h:342
#define svc_centerprint
Definition protocol.h:249
#define TE_SPIKE
Definition protocol.h:308
void VM_strunzone(prvm_prog_t *prog)
Definition prvm_cmds.c:2642
void VM_vectorvectors(prvm_prog_t *prog)
Definition prvm_cmds.c:3582
size_t VM_VarString(prvm_prog_t *prog, int first, char *out, size_t outsize)
Returns the length of the *out string excluding the \0 terminator.
Definition prvm_cmds.c:280
void VM_substring(prvm_prog_t *prog)
Definition prvm_cmds.c:2397
void VM_entityfieldname(prvm_prog_t *prog)
Definition prvm_cmds.c:2129
void VM_buf_writefile(prvm_prog_t *prog)
Definition prvm_cmds.c:4401
void VM_getsoundtime(prvm_prog_t *prog)
Definition prvm_cmds.c:2994
void VM_objerror(prvm_prog_t *prog)
Definition prvm_cmds.c:403
void VM_fabs(prvm_prog_t *prog)
Definition prvm_cmds.c:899
void VM_isserver(prvm_prog_t *prog)
Definition prvm_cmds.c:2864
void VM_nudgeoutofsolid(prvm_prog_t *prog)
Definition prvm_cmds.c:5644
void VM_dprint(prvm_prog_t *prog)
Definition prvm_cmds.c:854
void VM_uri_get(prvm_prog_t *prog)
Definition prvm_cmds.c:5427
void VM_chr2str(prvm_prog_t *prog)
Definition prvm_cmds.c:4918
void VM_digest_hex(prvm_prog_t *prog)
Definition prvm_cmds.c:5175
void VM_soundlength(prvm_prog_t *prog)
Definition prvm_cmds.c:3023
void VM_strncmp(prvm_prog_t *prog)
Definition prvm_cmds.c:5127
void VM_strtolower(prvm_prog_t *prog)
Definition prvm_cmds.c:2329
void VM_fgets(prvm_prog_t *prog)
Definition prvm_cmds.c:1996
void VM_physics_addtorque(prvm_prog_t *prog)
Definition prvm_cmds.c:6613
void VM_search_getsize(prvm_prog_t *prog)
Definition prvm_cmds.c:3238
void VM_tan(prvm_prog_t *prog)
Definition prvm_cmds.c:1704
void VM_modulo(prvm_prog_t *prog)
Definition prvm_cmds.c:3116
void VM_sqrt(prvm_prog_t *prog)
Definition prvm_cmds.c:1643
void VM_stov(prvm_prog_t *prog)
Definition prvm_cmds.c:2603
void VM_random(prvm_prog_t *prog)
Definition prvm_cmds.c:611
void VM_eprint(prvm_prog_t *prog)
Definition prvm_cmds.c:1494
void VM_bitshift(prvm_prog_t *prog)
Definition prvm_cmds.c:3594
void VM_buf_getsize(prvm_prog_t *prog)
Definition prvm_cmds.c:4016
void VM_getsurfacetexture(prvm_prog_t *prog)
Definition prvm_cmds.c:6416
void VM_search_end(prvm_prog_t *prog)
Definition prvm_cmds.c:3207
void VM_getentityfieldstring(prvm_prog_t *prog)
Definition prvm_cmds.c:2177
void VM_bufstr_get(prvm_prog_t *prog)
Definition prvm_cmds.c:4172
void VM_cvar_type(prvm_prog_t *prog)
Definition prvm_cmds.c:722
void VM_makevectors(prvm_prog_t *prog)
Definition prvm_cmds.c:3563
void VM_vlen(prvm_prog_t *prog)
Definition prvm_cmds.c:544
void VM_physics_addforce(prvm_prog_t *prog)
Definition prvm_cmds.c:6584
void VM_search_getfilename(prvm_prog_t *prog)
Definition prvm_cmds.c:3266
void VM_coverage(prvm_prog_t *prog)
Definition prvm_cmds.c:6641
void VM_break(prvm_prog_t *prog)
Definition prvm_cmds.c:661
void VM_strlennocol(prvm_prog_t *prog)
Definition prvm_cmds.c:2305
void VM_tokenize(prvm_prog_t *prog)
Definition prvm_cmds.c:2663
void VM_numentityfields(prvm_prog_t *prog)
Definition prvm_cmds.c:2115
void VM_SetTraceGlobals(prvm_prog_t *prog, const trace_t *trace)
Definition prvm_cmds.c:5228
void VM_vtos(prvm_prog_t *prog)
Definition prvm_cmds.c:917
void VM_getsurfacenumpoints(prvm_prog_t *prog)
Definition prvm_cmds.c:6282
void VM_argv_start_index(prvm_prog_t *prog)
Definition prvm_cmds.c:2822
void VM_getsurfacepointattribute(prvm_prog_t *prog)
Definition prvm_cmds.c:6326
void VM_registercvar(prvm_prog_t *prog)
Definition prvm_cmds.c:1736
void VM_uri_unescape(prvm_prog_t *prog)
Definition prvm_cmds.c:5317
void VM_infoget(prvm_prog_t *prog)
Definition prvm_cmds.c:5110
void VM_randomvec(prvm_prog_t *prog)
Definition prvm_cmds.c:1719
void VM_matchpattern(prvm_prog_t *prog)
Definition prvm_cmds.c:4619
void VM_atan2(prvm_prog_t *prog)
Definition prvm_cmds.c:1692
void VM_etos(prvm_prog_t *prog)
Definition prvm_cmds.c:936
void VM_cvar_defstring(prvm_prog_t *prog)
Definition prvm_cmds.c:786
void VM_asin(prvm_prog_t *prog)
Definition prvm_cmds.c:1656
void VM_vectoyaw(prvm_prog_t *prog)
Definition prvm_cmds.c:557
void VM_strlen(prvm_prog_t *prog)
Definition prvm_cmds.c:2265
void VM_strconv(prvm_prog_t *prog)
Definition prvm_cmds.c:5022
void VM_rint(prvm_prog_t *prog)
Definition prvm_cmds.c:1508
void VM_bound(prvm_prog_t *prog)
Definition prvm_cmds.c:1829
void VM_argv_end_index(prvm_prog_t *prog)
Definition prvm_cmds.c:2840
void VM_buf_implode(prvm_prog_t *prog)
Definition prvm_cmds.c:4128
void VM_precache_file(prvm_prog_t *prog)
Definition prvm_cmds.c:1407
void VM_spawn(prvm_prog_t *prog)
Definition prvm_cmds.c:1063
void VM_tokenize_console(prvm_prog_t *prog)
Definition prvm_cmds.c:2694
void VM_sprintf(prvm_prog_t *prog)
Definition prvm_cmds.c:5772
void VM_buf_cvarlist(prvm_prog_t *prog)
Definition prvm_cmds.c:4659
void VM_find(prvm_prog_t *prog)
Definition prvm_cmds.c:1110
void VM_stof(prvm_prog_t *prog)
Definition prvm_cmds.c:954
void VM_getsurfacetriangle(prvm_prog_t *prog)
Definition prvm_cmds.c:6512
void VM_fputs(prvm_prog_t *prog)
Definition prvm_cmds.c:2049
void VM_bufstr_add(prvm_prog_t *prog)
Definition prvm_cmds.c:4235
void VM_strdecolorize(prvm_prog_t *prog)
Definition prvm_cmds.c:2282
void VM_uri_escape(prvm_prog_t *prog)
Definition prvm_cmds.c:5284
void VM_findchainflags(prvm_prog_t *prog)
Definition prvm_cmds.c:1334
void VM_writetofile(prvm_prog_t *prog)
Definition prvm_cmds.c:2082
void VM_physics_enable(prvm_prog_t *prog)
Definition prvm_cmds.c:6557
void VM_putentityfieldstring(prvm_prog_t *prog)
Definition prvm_cmds.c:2229
void VM_etof(prvm_prog_t *prog)
Definition prvm_cmds.c:1001
void VM_nextent(prvm_prog_t *prog)
Definition prvm_cmds.c:1556
void VM_parseentitydata(prvm_prog_t *prog)
Definition prvm_cmds.c:3054
void VM_fclose(prvm_prog_t *prog)
Definition prvm_cmds.c:1963
void VM_ftoe(prvm_prog_t *prog)
Definition prvm_cmds.c:982
void VM_findfloat(prvm_prog_t *prog)
Definition prvm_cmds.c:1155
void VM_strcat(prvm_prog_t *prog)
Definition prvm_cmds.c:2377
void VM_atan(prvm_prog_t *prog)
Definition prvm_cmds.c:1680
void VM_ceil(prvm_prog_t *prog)
Definition prvm_cmds.c:1541
void VM_buf_del(prvm_prog_t *prog)
Definition prvm_cmds.c:3995
void VM_strpad(prvm_prog_t *prog)
Definition prvm_cmds.c:5070
void VM_strtoupper(prvm_prog_t *prog)
Definition prvm_cmds.c:2352
void VM_normalize(prvm_prog_t *prog)
Definition prvm_cmds.c:515
void VM_changeyaw(prvm_prog_t *prog)
Definition prvm_cmds.c:4747
void VM_tokenizebyseparator(prvm_prog_t *prog)
Definition prvm_cmds.c:2738
void VM_strftime(prvm_prog_t *prog)
Definition prvm_cmds.c:1014
void VM_floor(prvm_prog_t *prog)
Definition prvm_cmds.c:1527
void VM_cos(prvm_prog_t *prog)
Definition prvm_cmds.c:1630
void VM_whichpack(prvm_prog_t *prog)
Definition prvm_cmds.c:5364
void VM_buf_sort(prvm_prog_t *prog)
Definition prvm_cmds.c:4093
void VM_bufstr_find(prvm_prog_t *prog)
Definition prvm_cmds.c:4564
void VM_strzone(prvm_prog_t *prog)
Definition prvm_cmds.c:2621
void VM_cvar_set(prvm_prog_t *prog)
Definition prvm_cmds.c:823
void VM_isfunction(prvm_prog_t *prog)
Definition prvm_cmds.c:5745
void VM_bprint(prvm_prog_t *prog)
Definition prvm_cmds.c:442
void VM_argv(prvm_prog_t *prog)
Definition prvm_cmds.c:2804
void VM_strreplace(prvm_prog_t *prog)
Definition prvm_cmds.c:2469
void VM_min(prvm_prog_t *prog)
Definition prvm_cmds.c:1777
void VM_changepitch(prvm_prog_t *prog)
Definition prvm_cmds.c:4805
qbool PRVM_ConsoleCommand(prvm_prog_t *prog, const char *text, size_t textlen, int *func, qbool preserve_self, int curself, double ptime, const char *error_message)
Definition prvm_cmds.c:68
void VM_checkextension(prvm_prog_t *prog)
Definition prvm_cmds.c:363
void VM_ftos(prvm_prog_t *prog)
Definition prvm_cmds.c:874
void VM_bufstr_set(prvm_prog_t *prog)
Definition prvm_cmds.c:4202
void VM_findflags(prvm_prog_t *prog)
Definition prvm_cmds.c:1294
void VM_getsurfacenumtriangles(prvm_prog_t *prog)
Definition prvm_cmds.c:6497
void VM_acos(prvm_prog_t *prog)
Definition prvm_cmds.c:1668
void VM_loadfromfile(prvm_prog_t *prog)
Definition prvm_cmds.c:3082
void VM_gettime(prvm_prog_t *prog)
Definition prvm_cmds.c:2948
void VM_findchainfloat(prvm_prog_t *prog)
Definition prvm_cmds.c:1248
void VM_findchain(prvm_prog_t *prog)
Definition prvm_cmds.c:1193
void VM_getsurfaceclippedpoint(prvm_prog_t *prog)
Definition prvm_cmds.c:6478
void VM_traceon(prvm_prog_t *prog)
Definition prvm_cmds.c:1466
void VM_strstrofs(prvm_prog_t *prog)
Definition prvm_cmds.c:4872
void VM_fopen(prvm_prog_t *prog)
Definition prvm_cmds.c:1899
void VM_max(prvm_prog_t *prog)
Definition prvm_cmds.c:1803
void VM_bufstr_free(prvm_prog_t *prog)
Definition prvm_cmds.c:4282
void VM_getsurfacepoint(prvm_prog_t *prog)
Definition prvm_cmds.c:6298
void VM_getsurfacenearpoint(prvm_prog_t *prog)
Definition prvm_cmds.c:6428
void VM_buf_copy(prvm_prog_t *prog)
Definition prvm_cmds.c:4039
void VM_cvar_description(prvm_prog_t *prog)
Definition prvm_cmds.c:805
void VM_search_begin(prvm_prog_t *prog)
Definition prvm_cmds.c:3161
void VM_crc16(prvm_prog_t *prog)
Definition prvm_cmds.c:5162
void VM_remove(prvm_prog_t *prog)
Definition prvm_cmds.c:1080
void VM_error(prvm_prog_t *prog)
Definition prvm_cmds.c:380
void VM_buf_create(prvm_prog_t *prog)
Definition prvm_cmds.c:3964
void VM_str2chr(prvm_prog_t *prog)
Definition prvm_cmds.c:4896
void VM_print(prvm_prog_t *prog)
Definition prvm_cmds.c:425
void VM_cvar(prvm_prog_t *prog)
Definition prvm_cmds.c:700
void VM_cvar_string(prvm_prog_t *prog)
Definition prvm_cmds.c:762
void VM_changelevel(prvm_prog_t *prog)
Definition prvm_cmds.c:1592
void VM_SV_getextresponse(prvm_prog_t *prog)
Definition prvm_cmds.c:5627
void VM_traceoff(prvm_prog_t *prog)
Definition prvm_cmds.c:1480
void VM_callfunction(prvm_prog_t *prog)
Definition prvm_cmds.c:5705
void VM_infoadd(prvm_prog_t *prog)
Definition prvm_cmds.c:5090
void VM_wasfreed(prvm_prog_t *prog)
Definition prvm_cmds.c:5222
void VM_buf_loadfile(prvm_prog_t *prog)
Definition prvm_cmds.c:4318
void VM_localcmd(prvm_prog_t *prog)
Definition prvm_cmds.c:678
void VM_sin(prvm_prog_t *prog)
Definition prvm_cmds.c:1618
void VM_getsurfacenormal(prvm_prog_t *prog)
Definition prvm_cmds.c:6397
void VM_pow(prvm_prog_t *prog)
Definition prvm_cmds.c:1844
void VM_log(prvm_prog_t *prog)
Definition prvm_cmds.c:1850
void VM_coredump(prvm_prog_t *prog)
Definition prvm_cmds.c:1421
void VM_strireplace(prvm_prog_t *prog)
Definition prvm_cmds.c:2536
void VM_strncasecmp(prvm_prog_t *prog)
Definition prvm_cmds.c:5145
void VM_loadfromdata(prvm_prog_t *prog)
Definition prvm_cmds.c:3040
void VM_vectoangles(prvm_prog_t *prog)
Definition prvm_cmds.c:586
void VM_entityfieldtype(prvm_prog_t *prog)
Definition prvm_cmds.c:2153
#define VM_RETURN_EDICT(e)
Definition prvm_cmds.h:213
#define VM_TEMPSTRING_MAXSIZE
Definition prvm_cmds.h:215
#define VM_SAFEPARMCOUNT(p, f)
Definition prvm_cmds.h:207
#define VM_SAFEPARMCOUNTRANGE(p1, p2, f)
Definition prvm_cmds.h:206
int i
#define MAX_EDICTS
max number of objects in game world at once (32768 protocol limit)
Definition qdefs.h:105
#define MAX_LIGHTSTYLES
max flickering light styles in level (note: affects savegame format)
Definition qdefs.h:108
#define MAX_MODELS
max number of models loaded at once (including during level transitions)
Definition qdefs.h:106
#define MAX_VM_STAT
stat range available to VM_SV_AddStat
Definition qstats.h:29
#define MIN_VM_STAT
stat range available to VM_SV_AddStat
Definition qstats.h:28
#define MAX_CL_STATS
Definition qstats.h:7
#define NULL
Definition qtypes.h:12
float vec_t
Definition qtypes.h:68
vec_t vec3_t[3]
Definition qtypes.h:71
bool qbool
Definition qtypes.h:9
float prvm_vec_t
Definition qtypes.h:55
cvar_t cl_viewmodel_scale
Definition view.c:82
server_t sv
local server
Definition sv_main.c:223
int SV_SoundIndex(const char *s, int precachemode)
Definition sv_main.c:1474
cvar_t sv_gameplayfix_droptofloorstartsolid_nudgetocorrect
Definition sv_main.c:108
#define NUM_SPAWN_PARMS
Definition server.h:180
void SV_StartPointSound(vec3_t origin, const char *sample, int volume, float attenuation, float speed)
Definition sv_send.c:320
#define FL_FLY
Definition server.h:357
void SV_StartParticle(vec3_t org, vec3_t dir, int color, int count)
Definition sv_send.c:158
qbool SV_CheckBottom(prvm_edict_t *ent)
Definition sv_move.c:36
void SV_FlushBroadcastMessages(void)
Definition sv_send.c:1371
void SV_StartEffect(vec3_t org, int modelindex, int startframe, int framecount, int framerate)
Definition sv_send.c:182
void SV_StartSound(prvm_edict_t *entity, int channel, const char *sample, int volume, float attenuation, qbool reliable, float speed)
Definition sv_send.c:228
#define DAMAGE_AIM
Definition server.h:354
cvar_t sv_aim
Definition sv_main.c:56
int SV_ModelIndex(const char *s, int precachemode)
Definition sv_main.c:1411
model_t * SV_GetModelByIndex(int modelindex)
Definition sv_main.c:1607
cvar_t sv_gameplayfix_findradiusdistancetobox
Definition sv_main.c:110
mempool_t * sv_mempool
Definition sv_main.c:226
trace_t SV_TraceLine(const vec3_t start, const vec3_t end, int type, prvm_edict_t *passedict, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask, float extend)
Definition sv_phys.c:256
void VM_SV_MoveToGoal(prvm_prog_t *prog)
Definition sv_move.c:420
void SV_LinkEdict(prvm_edict_t *ent)
Definition sv_phys.c:804
@ ss_active
Definition server.h:52
#define SOLID_NOT
no interaction with other objects
Definition server.h:332
int SV_EntitiesInBox(const vec3_t mins, const vec3_t maxs, int maxedicts, prvm_edict_t **resultedicts)
Definition sv_phys.c:673
void SV_CheckVelocity(prvm_edict_t *ent)
Definition sv_phys.c:965
int SV_GetPitchSign(prvm_prog_t *prog, prvm_edict_t *ent)
Definition sv_phys.c:47
void SV_DropClient(qbool leaving, const char *reason,...)
Definition sv_main.c:1018
int SV_GenericHitSuperContentsMask(const prvm_edict_t *edict)
calculates hitsupercontentsmask for a generic qc entity
Definition sv_phys.c:73
model_t * SV_GetModelFromEdict(prvm_edict_t *ed)
Definition sv_main.c:1612
server_static_t svs
persistant server info
Definition sv_main.c:224
int SV_PointSuperContents(const vec3_t point)
Definition sv_phys.c:611
cvar_t sv_gravity
Definition sv_main.c:134
cvar_t sv_gameplayfix_droptofloorstartsolid
Definition sv_main.c:107
#define FL_NOTARGET
Definition server.h:364
#define FL_ONGROUND
Definition server.h:366
int SV_ParticleEffectIndex(const char *name)
Definition sv_main.c:1522
void SV_ClientCommands(const char *fmt,...) DP_FUNC_PRINTF(1)
Definition sv_send.c:135
client_t * host_client
Definition sv_main.c:29
void SV_ConnectClient(int clientnum, netconn_t *netconnection)
Definition sv_main.c:936
qbool SV_movestep(prvm_edict_t *ent, vec3_t move, qbool relink, qbool noenemy, qbool settrace)
Definition sv_move.c:109
trace_t SV_TraceBox(const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int type, prvm_edict_t *passedict, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask, float extend)
traces a box move against worldmodel and all entities in the specified area
Definition sv_phys.c:414
cvar_t sv_gameplayfix_blowupfallenzombies
Definition sv_main.c:104
cvar_t sv_gameplayfix_setmodelrealbox
Definition sv_main.c:121
#define FL_SWIM
Definition server.h:358
dp_FragColor r
return ret
vec2 dir
float f
#define CHANNELFLAG_FORCELOOP
Definition sound.h:39
#define CHANNELFLAG_RELIABLE
Definition sound.h:38
#define CHANNELFLAG_FULLVOLUME
Definition sound.h:42
#define CHANNELFLAG_PAUSED
Definition sound.h:41
#define CHAN_USER2ENGINE(c)
Definition sound.h:90
#define IS_CHAN(n)
Definition sound.h:82
qbool active
false = empty client slot
Definition server.h:185
int colors
Definition server.h:236
int old_colors
Definition server.h:236
prvm_vec_t spawn_parms[NUM_SPAWN_PARMS]
spawn parms are carried from level to level
Definition server.h:232
netconn_t * netconnection
communications handle
Definition server.h:210
prvm_edict_t * edict
PRVM_EDICT_NUM(clientnum+1)
Definition server.h:221
unsigned char type
Definition svvm_cmds.c:1710
Definition cvar.h:66
float value
Definition cvar.h:74
int integer
Definition cvar.h:73
float lerp
Definition client.h:313
int subframe
Definition client.h:312
double realtime
the accumulated mainloop time since application started (with filtering), without any slowmo or clamp...
Definition host.h:46
double builtinsprofile
Definition pr_comp.h:452
sizebuf_t message
writing buffer to send to peer as the next reliable message can be added to at any time,...
Definition netconn.h:161
int mark
mark for the leak detector
Definition progsvm.h:85
prvm_vec_t * fp
Definition progsvm.h:102
union prvm_edict_t::@30 fields
qbool free
true if this edict is unused
Definition progsvm.h:93
union prvm_edict_t::@29 priv
struct edict_engineprivate_s * server
FIXME: this server pointer really means world, not server (it is used by both server qc and client qc...
Definition progsvm.h:106
prvm_edict_private_t * required
Definition progsvm.h:101
int entityfields
number of vec_t fields in progs (some variables are 3)
Definition progsvm.h:548
prvm_prog_funcoffsets_t funcoffsets
Definition progsvm.h:693
const char * name
name of the prog, e.g. "Server", "Client" or "Menu" (used for text output)
Definition progsvm.h:700
void(* error_cmd)(const char *format,...) DP_FUNC_PRINTF(1) DP_FUNC_NORETURN
[INIT]
Definition progsvm.h:747
int num_edicts
copies of some vars that were former read from sv
Definition progsvm.h:671
prvm_prog_fieldoffsets_t fieldoffsets
Definition progsvm.h:691
prvm_edict_t * edicts
Definition progsvm.h:680
mempool_t * progs_mempool
all memory allocations related to this vm_prog (code, edicts, strings)
Definition progsvm.h:602
struct skeleton_s * skeletons[MAX_EDICTS]
Definition progsvm.h:640
mfunction_t * xfunction
Definition progsvm.h:620
struct client_s * clients
client slots
Definition server.h:30
char serverinfo[MAX_SERVERINFO_STRING]
server infostring
Definition server.h:36
int maxclients
number of svs.clients slots (updated by maxplayers command)
Definition server.h:28
double pausedstart
Definition server.h:69
double time
Definition server.h:76
char lightstyles[MAX_LIGHTSTYLES][64]
Definition server.h:122
double lastchecktime
Definition server.h:98
qbool paused
Definition server.h:68
int lastcheck
Definition server.h:97
world_t world
collision culling data
Definition server.h:106
sizebuf_t signon
Definition server.h:133
char model_precache[MAX_MODELS][MAX_QPATH]
Definition server.h:116
sizebuf_t datagram
Definition server.h:126
server_state_t state
some actions are only valid during load
Definition server.h:124
sizebuf_t reliable_datagram
Definition server.h:130
sizebuf_t * writeentitiestoclient_msg
Definition server.h:152
struct model_s * worldmodel
Definition server.h:112
protocolversion_t protocol
one of the PROTOCOL_ values
Definition server.h:74
const struct model_s * model
Definition protocol.h:425
struct matrix4x4_s * relativetransforms
Definition protocol.h:426
void * ent
Definition collision.h:47
double fraction
Definition collision.h:40
double endpos[3]
Definition collision.h:42
qbool allsolid
Definition collision.h:24
qbool startsolid
Definition collision.h:26
struct prvm_prog_s * prog
Definition world.h:73
static vec3_t forward
Definition sv_user.c:305
static vec3_t up
Definition sv_user.c:305
static void VM_SV_te_lightning1(prvm_prog_t *prog)
Definition svvm_cmds.c:2316
static void VM_SV_te_spike(prvm_prog_t *prog)
Definition svvm_cmds.c:2205
#define MSG_ALL
Definition svvm_cmds.c:1452
static void VM_SV_te_customflash(prvm_prog_t *prog)
Definition svvm_cmds.c:2171
static void VM_SV_WriteUnterminatedString(prvm_prog_t *prog)
Definition svvm_cmds.c:1546
static void VM_SV_centerprint(prvm_prog_t *prog)
Definition svvm_cmds.c:416
static void VM_SV_WriteByte(prvm_prog_t *prog)
Definition svvm_cmds.c:1504
static void VM_SV_WriteEntity(prvm_prog_t *prog)
Definition svvm_cmds.c:1553
static void VM_SV_WriteCoord(prvm_prog_t *prog)
Definition svvm_cmds.c:1534
static void VM_SV_setmodel(prvm_prog_t *prog)
Definition svvm_cmds.c:329
static void VM_SV_te_lavasplash(prvm_prog_t *prog)
Definition svvm_cmds.c:2277
static void VM_SV_te_spark(prvm_prog_t *prog)
Definition svvm_cmds.c:2091
static sizebuf_t * WriteDest(prvm_prog_t *prog)
Definition svvm_cmds.c:1456
static void VM_SV_copyentity(prvm_prog_t *prog)
Definition svvm_cmds.c:1835
static void VM_SV_WritePicture(prvm_prog_t *prog)
Definition svvm_cmds.c:1565
static void VM_SV_te_spikequad(prvm_prog_t *prog)
Definition svvm_cmds.c:2123
static void VM_SV_setcolor(prvm_prog_t *prog)
Definition svvm_cmds.c:1876
static int SV_GetTagMatrix(prvm_prog_t *prog, matrix4x4_t *out, prvm_edict_t *ent, int tagindex)
Definition svvm_cmds.c:2557
static void VM_SV_te_tarexplosion(prvm_prog_t *prog)
Definition svvm_cmds.c:2241
static trace_t SV_Trace_Toss(prvm_prog_t *prog, prvm_edict_t *tossent, prvm_edict_t *ignore)
Definition svvm_cmds.c:712
static void VM_SV_skel_get_boneabs(prvm_prog_t *prog)
Definition svvm_cmds.c:3100
static vec3_t quakemins
Definition svvm_cmds.c:328
static void VM_SV_skel_find_bone(prvm_prog_t *prog)
Definition svvm_cmds.c:3064
static void VM_SV_setsize(prvm_prog_t *prog)
Definition svvm_cmds.c:297
static void VM_SV_ambientsound(prvm_prog_t *prog)
Definition svvm_cmds.c:470
static void VM_SV_sprint(prvm_prog_t *prog)
Definition svvm_cmds.c:374
static void VM_SV_te_flamejet(prvm_prog_t *prog)
Definition svvm_cmds.c:2399
static void VM_SV_findradius(prvm_prog_t *prog)
Definition svvm_cmds.c:992
static void VM_SV_setpause(prvm_prog_t *prog)
Definition svvm_cmds.c:2941
static void VM_SV_te_smallflash(prvm_prog_t *prog)
Definition svvm_cmds.c:2159
static void VM_SV_AddStat(prvm_prog_t *prog)
Definition svvm_cmds.c:1773
static void VM_SV_particle(prvm_prog_t *prog)
Definition svvm_cmds.c:448
void VM_CustomStats_Clear(void)
Definition svvm_cmds.c:1717
static void VM_SV_pointsound(prvm_prog_t *prog)
Definition svvm_cmds.c:607
static void VM_SV_lightstyle(prvm_prog_t *prog)
Definition svvm_cmds.c:1285
static void VM_SV_particleeffectnum(prvm_prog_t *prog)
Definition svvm_cmds.c:2864
static void VM_SV_gettaginfo(prvm_prog_t *prog)
Definition svvm_cmds.c:2657
static void VM_SV_te_explosionrgb(prvm_prog_t *prog)
Definition svvm_cmds.c:1993
static void VM_SV_findbox(prvm_prog_t *prog)
Definition svvm_cmds.c:1069
#define MSG_INIT
Definition svvm_cmds.c:1453
int c_notvis
Definition svvm_cmds.c:841
const char * vm_sv_extensions[]
client also uses this
Definition svvm_cmds.c:11
static void VM_SV_skel_set_bone(prvm_prog_t *prog)
Definition svvm_cmds.c:3131
void VM_SV_UpdateCustomStats(client_t *client, prvm_edict_t *ent, sizebuf_t *msg, int *stats)
Definition svvm_cmds.c:1723
static void VM_SV_te_particlerain(prvm_prog_t *prog)
Definition svvm_cmds.c:2039
static void VM_SV_checkpvs(prvm_prog_t *prog)
Definition svvm_cmds.c:891
static int vm_customstats_last
Definition svvm_cmds.c:1715
static void VM_SV_WriteAngle(prvm_prog_t *prog)
Definition svvm_cmds.c:1528
static void VM_SV_makestatic(prvm_prog_t *prog)
Definition svvm_cmds.c:1594
static int VM_SV_newcheckclient(prvm_prog_t *prog, int check)
Definition svvm_cmds.c:786
prvm_builtin_t vm_sv_builtins[]
Definition svvm_cmds.c:3265
static void VM_SV_te_superspikequad(prvm_prog_t *prog)
Definition svvm_cmds.c:2135
static void VM_SV_frameduration(prvm_prog_t *prog)
Definition svvm_cmds.c:3252
static int SV_GetEntityLocalTagMatrix(prvm_prog_t *prog, prvm_edict_t *ent, int tagindex, matrix4x4_t *out)
Definition svvm_cmds.c:2536
static void VM_SV_skel_mul_bones(prvm_prog_t *prog)
Definition svvm_cmds.c:3173
static void VM_SV_skel_get_numbones(prvm_prog_t *prog)
Definition svvm_cmds.c:3025
static void VM_SV_clienttype(prvm_prog_t *prog)
Definition svvm_cmds.c:2762
static void VM_SV_setspawnparms(prvm_prog_t *prog)
Definition svvm_cmds.c:1660
static void VM_SV_WriteString(prvm_prog_t *prog)
Definition svvm_cmds.c:1540
static void VM_SV_te_explosionquad(prvm_prog_t *prog)
Definition svvm_cmds.c:2147
static void SetMinMaxSize(prvm_prog_t *prog, prvm_edict_t *e, float *min, float *max, qbool rotate)
Definition svvm_cmds.c:271
#define MSG_ONE
Definition svvm_cmds.c:1451
static void VM_SV_getlight(prvm_prog_t *prog)
Definition svvm_cmds.c:1694
static void VM_SV_frameforname(prvm_prog_t *prog)
Definition svvm_cmds.c:3232
static void VM_SV_pointcontents(prvm_prog_t *prog)
Definition svvm_cmds.c:1335
static void VM_SV_aim(prvm_prog_t *prog)
Definition svvm_cmds.c:1351
static void VM_SV_te_gunshotquad(prvm_prog_t *prog)
Definition svvm_cmds.c:2111
static void VM_SV_effect(prvm_prog_t *prog)
Definition svvm_cmds.c:1915
static void VM_SV_skel_copybones(prvm_prog_t *prog)
Definition svvm_cmds.c:3200
static void VM_SV_skel_mul_bone(prvm_prog_t *prog)
Definition svvm_cmds.c:3151
static qbool droptofloor_bsp_failcond(trace_t *trace)
Definition svvm_cmds.c:1181
static void VM_SV_gettagindex(prvm_prog_t *prog)
Definition svvm_cmds.c:2621
static void VM_SV_skel_get_boneparent(prvm_prog_t *prog)
Definition svvm_cmds.c:3050
static void VM_SV_tracetoss(prvm_prog_t *prog)
Definition svvm_cmds.c:759
static void VM_SV_skel_get_bonerel(prvm_prog_t *prog)
Definition svvm_cmds.c:3076
static void VM_SV_skel_get_bonename(prvm_prog_t *prog)
Definition svvm_cmds.c:3036
static void VM_SV_setattachment(prvm_prog_t *prog)
Definition svvm_cmds.c:2440
static void VM_SV_traceline(prvm_prog_t *prog)
Definition svvm_cmds.c:649
static void VM_SV_clientcommand(prvm_prog_t *prog)
Definition svvm_cmds.c:2419
void SV_GetEntityMatrix(prvm_prog_t *prog, prvm_edict_t *ent, matrix4x4_t *out, qbool viewmatrix)
Definition svvm_cmds.c:2518
int c_invis
Definition svvm_cmds.c:841
static void VM_SV_te_gunshot(prvm_prog_t *prog)
Definition svvm_cmds.c:2193
static void VM_SV_checkclient(prvm_prog_t *prog)
Definition svvm_cmds.c:842
static void VM_SV_WriteChar(prvm_prog_t *prog)
Definition svvm_cmds.c:1510
static void VM_SV_serverkey(prvm_prog_t *prog)
Definition svvm_cmds.c:2784
void SVVM_reset_cmd(prvm_prog_t *prog)
Definition svvm_cmds.c:3923
static void VM_SV_WriteShort(prvm_prog_t *prog)
Definition svvm_cmds.c:1516
static void VM_SV_pointparticles(prvm_prog_t *prog)
Definition svvm_cmds.c:2894
static void VM_SV_te_lightning2(prvm_prog_t *prog)
Definition svvm_cmds.c:2334
static void VM_SV_skel_create(prvm_prog_t *prog)
Definition svvm_cmds.c:2959
cvar_t sv_qcstats
Definition sv_main.c:148
static void VM_SV_te_blood(prvm_prog_t *prog)
Definition svvm_cmds.c:1951
static void VM_SV_setmodelindex(prvm_prog_t *prog)
Definition svvm_cmds.c:2794
void SVVM_init_cmd(prvm_prog_t *prog)
Definition svvm_cmds.c:3918
static void VM_SV_te_wizspike(prvm_prog_t *prog)
Definition svvm_cmds.c:2253
#define MSG_BROADCAST
Definition svvm_cmds.c:1450
static void VM_SV_walkmove(prvm_prog_t *prog)
Definition svvm_cmds.c:1124
const int vm_sv_numbuiltins
Definition svvm_cmds.c:3916
static void VM_SV_dropclient(prvm_prog_t *prog)
Definition svvm_cmds.c:2715
static void VM_SV_setorigin(prvm_prog_t *prog)
Definition svvm_cmds.c:247
static void VM_SV_te_particlecube(prvm_prog_t *prog)
Definition svvm_cmds.c:2009
static void VM_SV_droptofloor(prvm_prog_t *prog)
Definition svvm_cmds.c:1188
static void VM_SV_precache_model(prvm_prog_t *prog)
Definition svvm_cmds.c:1110
static void VM_SV_te_superspike(prvm_prog_t *prog)
Definition svvm_cmds.c:2217
static void VM_SV_te_particlesnow(prvm_prog_t *prog)
Definition svvm_cmds.c:2065
static void VM_SV_trailparticles(prvm_prog_t *prog)
Definition svvm_cmds.c:2875
static void VM_SV_te_beam(prvm_prog_t *prog)
Definition svvm_cmds.c:2370
static void VM_SV_WriteLong(prvm_prog_t *prog)
Definition svvm_cmds.c:1522
static void VM_SV_te_lightning3(prvm_prog_t *prog)
Definition svvm_cmds.c:2352
static void VM_SV_te_knightspike(prvm_prog_t *prog)
Definition svvm_cmds.c:2265
static unsigned char * checkpvs
Definition svvm_cmds.c:784
static vec3_t quakemaxs
Definition svvm_cmds.c:328
static void VM_SV_stuffcmd(prvm_prog_t *prog)
Definition svvm_cmds.c:960
static void VM_SV_te_explosion2(prvm_prog_t *prog)
Definition svvm_cmds.c:2301
static void VM_SV_tracebox(prvm_prog_t *prog)
Definition svvm_cmds.c:686
static void VM_SV_sound(prvm_prog_t *prog)
Definition svvm_cmds.c:531
static void VM_SV_te_plasmaburn(prvm_prog_t *prog)
Definition svvm_cmds.c:2388
static int SV_GetTagIndex(prvm_prog_t *prog, prvm_edict_t *e, const char *tagname)
Definition svvm_cmds.c:2485
static void VM_SV_skel_build(prvm_prog_t *prog)
Definition svvm_cmds.c:2983
static void VM_SV_skel_delete(prvm_prog_t *prog)
Definition svvm_cmds.c:3221
static void VM_SV_modelnameforindex(prvm_prog_t *prog)
Definition svvm_cmds.c:2841
static void VM_SV_registercommand(prvm_prog_t *prog)
Definition svvm_cmds.c:2934
static void VM_SV_precache_sound(prvm_prog_t *prog)
Definition svvm_cmds.c:1104
static void VM_SV_spawnclient(prvm_prog_t *prog)
Definition svvm_cmds.c:2738
static int SV_GetExtendedTagInfo(prvm_prog_t *prog, prvm_edict_t *e, int tagindex, int *parentindex, const char **tagname, matrix4x4_t *tag_localmatrix)
Definition svvm_cmds.c:2496
static customstat_t vm_customstats[MAX_CL_STATS]
Definition svvm_cmds.c:1714
qbool SV_VM_ConsoleCommand(const char *text, size_t textlen)
Definition svvm_cmds.c:2927
static void VM_SV_te_explosion(prvm_prog_t *prog)
Definition svvm_cmds.c:2229
static void VM_SV_te_teleport(prvm_prog_t *prog)
Definition svvm_cmds.c:2289
static void VM_SV_checkbottom(prvm_prog_t *prog)
Definition svvm_cmds.c:1324
#define MSG_ENTITY
Definition svvm_cmds.c:1454
static void VM_SV_te_bloodshower(prvm_prog_t *prog)
Definition svvm_cmds.c:1971
void World_End(world_t *world)
Definition world.c:69
#define MOVE_NORMAL
Definition world.h:28
#define Mem_Free(mem)
Definition zone.h:96
#define Mem_Alloc(pool, size)
Definition zone.h:92