+#include "quakedef.h"
+
#include "prvm_cmds.h"
#include "csprogs.h"
#include "cl_collision.h"
void CL_FindNonSolidLocation(const vec3_t in, vec3_t out, vec_t radius);
void CSQC_RelinkAllEntities (int drawmask);
void CSQC_RelinkCSQCEntities (void);
-char *Key_GetBind (int key);
+const char *Key_GetBind (int key);
const char *sample;
int channel;
prvm_edict_t *entity;
- int volume;
+ float volume;
float attenuation;
VM_SAFEPARMCOUNT(5, VM_CL_sound);
entity = PRVM_G_EDICT(OFS_PARM0);
channel = (int)PRVM_G_FLOAT(OFS_PARM1);
sample = PRVM_G_STRING(OFS_PARM2);
- volume = (int)(PRVM_G_FLOAT(OFS_PARM3)*255.0f);
+ volume = PRVM_G_FLOAT(OFS_PARM3);
attenuation = PRVM_G_FLOAT(OFS_PARM4);
- if (volume < 0 || volume > 255)
+ if (volume < 0 || volume > 1)
{
VM_Warning("VM_CL_sound: volume must be in range 0-1\n");
return;
S_StartSound(32768 + PRVM_NUM_FOR_EDICT(entity), channel, S_FindName(sample), entity->fields.client->origin, volume, attenuation);
}
+// #483 void(vector origin, string sample, float volume, float attenuation) pointsound
+static void VM_CL_pointsound(void)
+{
+ const char *sample;
+ float volume;
+ float attenuation;
+ vec3_t org;
+
+ VM_SAFEPARMCOUNT(4, VM_CL_pointsound);
+
+ VectorCopy( PRVM_G_VECTOR(OFS_PARM0), org);
+ sample = PRVM_G_STRING(OFS_PARM1);
+ volume = PRVM_G_FLOAT(OFS_PARM2);
+ attenuation = PRVM_G_FLOAT(OFS_PARM3);
+
+ if (volume < 0 || volume > 1)
+ {
+ VM_Warning("VM_CL_pointsound: volume must be in range 0-1\n");
+ return;
+ }
+
+ if (attenuation < 0 || attenuation > 4)
+ {
+ VM_Warning("VM_CL_pointsound: attenuation must be in range 0-4\n");
+ return;
+ }
+
+ // Send World Entity as Entity to Play Sound (for CSQC, that is 32768)
+ S_StartSound(32768, 0, S_FindName(sample), org, volume, attenuation);
+}
+
// #14 entity() spawn
static void VM_CL_spawn (void)
{
VM_SetTraceGlobals(&trace);
}
-extern cvar_t cl_gravity;
trace_t CL_Trace_Toss (prvm_edict_t *tossent, prvm_edict_t *ignore)
{
int i;
gravity = val->_float;
else
gravity = 1.0;
- gravity *= cl_gravity.value * 0.05;
+ gravity *= cl.movevars_gravity * 0.05;
for (i = 0;i < 200;i++) // LordHavoc: sanity check; never trace more than 10 seconds
{
VM_SAFEPARMCOUNT(1, VM_CL_precache_model);
name = PRVM_G_STRING(OFS_PARM0);
- for (i = 1;i < MAX_MODELS && cl.csqc_model_precache[i];i++)
+ for (i = 0;i < MAX_MODELS && cl.csqc_model_precache[i];i++)
{
if(!strcmp(cl.csqc_model_precache[i]->name, name))
{
m = Mod_ForName(name, false, false, false);
if(m && m->loaded)
{
- for (i = 1;i < MAX_MODELS;i++)
+ for (i = 0;i < MAX_MODELS;i++)
{
if (!cl.csqc_model_precache[i])
{
{
if (ent->priv.required->free)
continue;
-// VectorAdd(ent->fields.client->origin, ent->fields.client->mins, ent->fields.client->absmin);
-// VectorAdd(ent->fields.client->origin, ent->fields.client->maxs, ent->fields.client->absmax);
if(BoxesOverlap(mins, maxs, ent->fields.client->absmin, ent->fields.client->absmax))
list[k++] = ent;
}
eorg[2] -= bound(ent->fields.client->mins[2], eorg[2], ent->fields.client->maxs[2]);
}
else
- VectorMAMAM(1, eorg, 0.5f, ent->fields.client->mins, 0.5f, ent->fields.client->maxs, eorg);
+ VectorMAMAM(1, eorg, -0.5f, ent->fields.client->mins, -0.5f, ent->fields.client->maxs, eorg);
if (DotProduct(eorg, eorg) < radius2)
{
ent->fields.client->chain = PRVM_EDICT_TO_PROG(chain);
//[515]: SCENE MANAGER builtins
extern qboolean CSQC_AddRenderEdict (prvm_edict_t *ed);//csprogs.c
-matrix4x4_t csqc_listenermatrix;
-qboolean csqc_usecsqclistener = false;//[515]: per-frame
-
static void CSQC_R_RecalcView (void)
{
extern matrix4x4_t viewmodelmatrix;
- Matrix4x4_CreateFromQuakeEntity(&r_view.matrix, csqc_origin[0], csqc_origin[1], csqc_origin[2], csqc_angles[0], csqc_angles[1], csqc_angles[2], 1);
- Matrix4x4_CreateFromQuakeEntity(&viewmodelmatrix, csqc_origin[0], csqc_origin[1], csqc_origin[2], csqc_angles[0], csqc_angles[1], csqc_angles[2], cl_viewmodel_scale.value);
+ Matrix4x4_CreateFromQuakeEntity(&r_view.matrix, cl.csqc_origin[0], cl.csqc_origin[1], cl.csqc_origin[2], cl.csqc_angles[0], cl.csqc_angles[1], cl.csqc_angles[2], 1);
+ Matrix4x4_CreateFromQuakeEntity(&viewmodelmatrix, cl.csqc_origin[0], cl.csqc_origin[1], cl.csqc_origin[2], cl.csqc_angles[0], cl.csqc_angles[1], cl.csqc_angles[2], cl_viewmodel_scale.value);
}
void CL_RelinkLightFlashes(void);
// clear renderable entity and light lists
r_refdef.numentities = 0;
r_refdef.numlights = 0;
+ // FIXME: restore these to the values from VM_CL_UpdateView
+ r_view.x = 0;
+ r_view.y = 0;
+ r_view.z = 0;
+ r_view.width = vid.width;
+ r_view.height = vid.height;
+ r_view.depth = 1;
+ // FIXME: restore frustum_x/frustum_y
+ r_view.useperspective = true;
+ r_view.frustum_y = tan(scr_fov.value * M_PI / 360.0) * (3.0/4.0) * cl.viewzoom;
+ r_view.frustum_x = r_view.frustum_y * (float)r_view.width / (float)r_view.height / vid_pixelheight.value;
+ r_view.frustum_x *= r_refdef.frustumscale_x;
+ r_view.frustum_y *= r_refdef.frustumscale_y;
+ r_view.ortho_x = scr_fov.value * (3.0 / 4.0) * (float)r_view.width / (float)r_view.height / vid_pixelheight.value;
+ r_view.ortho_y = scr_fov.value * (3.0 / 4.0);
+ // FIXME: restore cl.csqc_origin
+ // FIXME: restore cl.csqc_angles
+ cl.csqc_vidvars.drawworld = true;
+ cl.csqc_vidvars.drawenginesbar = false;
+ cl.csqc_vidvars.drawcrosshair = false;
}
//#301 void(float mask) addentities (EXT_CSQC)
ed = &prog->edicts[i];
if(ed->priv.required->free)
continue;
- VectorAdd(ed->fields.client->origin, ed->fields.client->mins, ed->fields.client->absmin);
- VectorAdd(ed->fields.client->origin, ed->fields.client->maxs, ed->fields.client->absmax);
CSQC_Think(ed);
if(ed->priv.required->free)
continue;
switch(c)
{
- case VF_MIN: r_view.x = (int)f[0];
- r_view.y = (int)f[1];
+ case VF_MIN: r_view.x = (int)(f[0] * vid.width / vid_conwidth.value);
+ r_view.y = (int)(f[1] * vid.height / vid_conheight.value);
break;
- case VF_MIN_X: r_view.x = (int)k;
+ case VF_MIN_X: r_view.x = (int)(k * vid.width / vid_conwidth.value);
break;
- case VF_MIN_Y: r_view.y = (int)k;
+ case VF_MIN_Y: r_view.y = (int)(k * vid.height / vid_conheight.value);
break;
- case VF_SIZE: r_view.width = (int)f[0];
- r_view.height = (int)f[1];
+ case VF_SIZE: r_view.width = (int)(f[0] * vid.width / vid_conwidth.value);
+ r_view.height = (int)(f[1] * vid.height / vid_conheight.value);
break;
- case VF_SIZE_Y: r_view.width = (int)k;
+ case VF_SIZE_Y: r_view.width = (int)(k * vid.width / vid_conwidth.value);
break;
- case VF_SIZE_X: r_view.height = (int)k;
+ case VF_SIZE_X: r_view.height = (int)(k * vid.height / vid_conheight.value);
break;
- case VF_VIEWPORT: r_view.x = (int)f[0];
- r_view.y = (int)f[1];
- r_view.z = 0;
- // TODO: make sure that view_z and view_depth are set properly even if csqc does not set them!
+ case VF_VIEWPORT: r_view.x = (int)(f[0] * vid.width / vid_conwidth.value);
+ r_view.y = (int)(f[1] * vid.height / vid_conheight.value);
f = PRVM_G_VECTOR(OFS_PARM2);
- r_view.width = (int)f[0];
- r_view.height = (int)f[1];
- r_view.depth = 1;
+ r_view.width = (int)(f[0] * vid.width / vid_conwidth.value);
+ r_view.height = (int)(f[1] * vid.height / vid_conheight.value);
break;
- case VF_FOV: //r_refdef.fov_x = f[0]; // FIXME!
- //r_refdef.fov_y = f[1]; // FIXME!
+ case VF_FOV: r_view.frustum_x = tan(f[0] * M_PI / 360.0);r_view.ortho_x = f[0];
+ r_view.frustum_y = tan(f[1] * M_PI / 360.0);r_view.ortho_y = f[1];
break;
- case VF_FOVX: //r_refdef.fov_x = k; // FIXME!
+ case VF_FOVX: r_view.frustum_x = tan(k * M_PI / 360.0);r_view.ortho_x = k;
break;
- case VF_FOVY: //r_refdef.fov_y = k; // FIXME!
+ case VF_FOVY: r_view.frustum_y = tan(k * M_PI / 360.0);r_view.ortho_y = k;
break;
- case VF_ORIGIN: VectorCopy(f, csqc_origin);
+ case VF_ORIGIN: VectorCopy(f, cl.csqc_origin);
CSQC_R_RecalcView();
break;
- case VF_ORIGIN_X: csqc_origin[0] = k;
+ case VF_ORIGIN_X: cl.csqc_origin[0] = k;
CSQC_R_RecalcView();
break;
- case VF_ORIGIN_Y: csqc_origin[1] = k;
+ case VF_ORIGIN_Y: cl.csqc_origin[1] = k;
CSQC_R_RecalcView();
break;
- case VF_ORIGIN_Z: csqc_origin[2] = k;
+ case VF_ORIGIN_Z: cl.csqc_origin[2] = k;
CSQC_R_RecalcView();
break;
- case VF_ANGLES: VectorCopy(f, csqc_angles);
+ case VF_ANGLES: VectorCopy(f, cl.csqc_angles);
CSQC_R_RecalcView();
break;
- case VF_ANGLES_X: csqc_angles[0] = k;
+ case VF_ANGLES_X: cl.csqc_angles[0] = k;
CSQC_R_RecalcView();
break;
- case VF_ANGLES_Y: csqc_angles[1] = k;
+ case VF_ANGLES_Y: cl.csqc_angles[1] = k;
CSQC_R_RecalcView();
break;
- case VF_ANGLES_Z: csqc_angles[2] = k;
+ case VF_ANGLES_Z: cl.csqc_angles[2] = k;
CSQC_R_RecalcView();
break;
case VF_DRAWWORLD: cl.csqc_vidvars.drawworld = k;
case VF_CL_VIEWANGLES_Z:cl.viewangles[2] = k;
break;
+ case VF_PERSPECTIVE: r_view.useperspective = k != 0;
+ break;
+
default: PRVM_G_FLOAT(OFS_RETURN) = 0;
VM_Warning("VM_CL_R_SetView : unknown parm %i\n", c);
return;
PRVM_G_FLOAT(OFS_RETURN) = 1;
}
-extern void CL_UpdateNetworkEntity(entity_t *e, int recursionlimit);
//#304 void() renderscene (EXT_CSQC)
static void VM_CL_R_RenderScene (void)
{
- int i;
VM_SAFEPARMCOUNT(0, VM_CL_R_RenderScene);
// we need to update any RENDER_VIEWMODEL entities at this point because
// csqc supplies its own view matrix
- for (i = 1;i < cl.num_entities;i++)
- {
- if (cl.entities_active[i])
- {
- entity_t *ent = cl.entities + i;
- if ((ent->render.flags & RENDER_VIEWMODEL) || ent->state_current.tagentity)
- CL_UpdateNetworkEntity(ent, 32);
- }
- }
- // and of course the engine viewmodel needs updating as well
- CL_UpdateNetworkEntity(&cl.viewent, 32);
+ CL_UpdateViewEntities();
// now draw stuff!
R_RenderView();
}
static void VM_CL_getstati (void)
{
int i, index;
- VM_SAFEPARMCOUNT(1, VM_CL_getstati);
+ int firstbit, bitcount;
+
+ VM_SAFEPARMCOUNTRANGE(1, 3, VM_CL_getstati);
+
index = (int)PRVM_G_FLOAT(OFS_PARM0);
+ if (prog->argc > 1)
+ {
+ firstbit = (int)PRVM_G_FLOAT(OFS_PARM1);
+ if (prog->argc > 2)
+ bitcount = (int)PRVM_G_FLOAT(OFS_PARM2);
+ else
+ bitcount = 1;
+ }
+ else
+ {
+ firstbit = 0;
+ bitcount = 32;
+ }
if(index < 0 || index >= MAX_CL_STATS)
{
return;
}
i = cl.stats[index];
+ if (bitcount != 32) //32 causes the mask to overflow, so there's nothing to subtract from.
+ i = (((unsigned int)i)&(((1<<bitcount)-1)<<firstbit))>>firstbit;
PRVM_G_FLOAT(OFS_RETURN) = i;
}
else
if(!strcasecmp(c, "ping"))
sprintf(t, "%i", cl.scores[i].qw_ping);
+ else
+ if(!strcasecmp(c, "pl"))
+ sprintf(t, "%i", cl.scores[i].qw_packetloss);
else
if(!strcasecmp(c, "entertime"))
sprintf(t, "%f", cl.scores[i].qw_entertime);
static void VM_CL_setlistener (void)
{
VM_SAFEPARMCOUNT(4, VM_CL_setlistener);
- Matrix4x4_FromVectors(&csqc_listenermatrix, PRVM_G_VECTOR(OFS_PARM1), PRVM_G_VECTOR(OFS_PARM2), PRVM_G_VECTOR(OFS_PARM3), PRVM_G_VECTOR(OFS_PARM0));
- csqc_usecsqclistener = true; //use csqc listener at this frame
+ Matrix4x4_FromVectors(&cl.csqc_listenermatrix, PRVM_G_VECTOR(OFS_PARM1), PRVM_G_VECTOR(OFS_PARM2), PRVM_G_VECTOR(OFS_PARM3), PRVM_G_VECTOR(OFS_PARM0));
+ cl.csqc_usecsqclistener = true; //use csqc listener at this frame
}
//#352 void(string cmdname) registercommand (EXT_CSQC)
// copy it to the current state
staticent->render.model = CL_GetModelByIndex((int)ent->fields.client->modelindex);
- staticent->render.frame = staticent->render.frame1 = staticent->render.frame2 = (int)ent->fields.client->frame;
+ staticent->render.frame1 = staticent->render.frame2 = (int)ent->fields.client->frame;
staticent->render.framelerp = 0;
// make torchs play out of sync
staticent->render.frame1time = staticent->render.frame2time = lhrandom(-10, -1);
Matrix4x4_CreateFromQuakeEntity(&staticent->render.matrix, ent->fields.client->origin[0], ent->fields.client->origin[1], ent->fields.client->origin[2], ent->fields.client->angles[0], ent->fields.client->angles[1], ent->fields.client->angles[2], staticent->render.scale);
CL_UpdateRenderEntity(&staticent->render);
- // transparent stuff can't be lit during the opaque stage
- if (staticent->render.effects & (EF_ADDITIVE | EF_NODEPTHTEST) || staticent->render.alpha < 1)
- staticent->render.flags |= RENDER_TRANSPARENT;
- // double sided rendering mode causes backfaces to be visible
- // (mostly useful on transparent stuff)
- if (staticent->render.effects & EF_DOUBLESIDED)
- staticent->render.flags |= RENDER_NOCULLFACE;
// either fullbright or lit
if (!(staticent->render.effects & EF_FULLBRIGHT) && !r_fullbright.integer)
staticent->render.flags |= RENDER_LIGHT;
// turn off shadows from transparent objects
- if (!(staticent->render.effects & EF_NOSHADOW)
- && !(staticent->render.flags & RENDER_TRANSPARENT))
+ if (!(staticent->render.effects & (EF_NOSHADOW | EF_ADDITIVE | EF_NODEPTHTEST)) && (staticent->render.alpha >= 1))
staticent->render.flags |= RENDER_SHADOW;
}
else
CL_ParticleEffect(EFFECT_TE_SPARK, PRVM_G_FLOAT(OFS_PARM2), pos2, pos2, PRVM_G_VECTOR(OFS_PARM1), PRVM_G_VECTOR(OFS_PARM1), NULL, 0);
}
+extern cvar_t cl_sound_ric_gunshot;
// #412 void(vector org) te_gunshotquad (DP_QUADEFFECTS1)
static void VM_CL_te_gunshotquad (void)
{
float *pos;
vec3_t pos2;
+ int rnd;
VM_SAFEPARMCOUNT(1, VM_CL_te_gunshotquad);
pos = PRVM_G_VECTOR(OFS_PARM0);
CL_FindNonSolidLocation(pos, pos2, 4);
CL_ParticleEffect(EFFECT_TE_GUNSHOTQUAD, 1, pos2, pos2, vec3_origin, vec3_origin, NULL, 0);
+ if(cl_sound_ric_gunshot.integer >= 2)
+ {
+ if (rand() % 5) S_StartSound(-1, 0, cl.sfx_tink1, pos2, 1, 1);
+ else
+ {
+ rnd = rand() & 3;
+ if (rnd == 1) S_StartSound(-1, 0, cl.sfx_ric1, pos2, 1, 1);
+ else if (rnd == 2) S_StartSound(-1, 0, cl.sfx_ric2, pos2, 1, 1);
+ else S_StartSound(-1, 0, cl.sfx_ric3, pos2, 1, 1);
+ }
+ }
}
// #413 void(vector org) te_spikequad (DP_QUADEFFECTS1)
{
float *pos;
vec3_t pos2;
+ int rnd;
VM_SAFEPARMCOUNT(1, VM_CL_te_gunshot);
pos = PRVM_G_VECTOR(OFS_PARM0);
CL_FindNonSolidLocation(pos, pos2, 4);
CL_ParticleEffect(EFFECT_TE_GUNSHOT, 1, pos2, pos2, vec3_origin, vec3_origin, NULL, 0);
+ if(cl_sound_ric_gunshot.integer == 1 || cl_sound_ric_gunshot.integer == 3)
+ {
+ if (rand() % 5) S_StartSound(-1, 0, cl.sfx_tink1, pos2, 1, 1);
+ else
+ {
+ rnd = rand() & 3;
+ if (rnd == 1) S_StartSound(-1, 0, cl.sfx_ric1, pos2, 1, 1);
+ else if (rnd == 2) S_StartSound(-1, 0, cl.sfx_ric2, pos2, 1, 1);
+ else S_StartSound(-1, 0, cl.sfx_ric3, pos2, 1, 1);
+ }
+ }
}
// #419 void(vector org) te_spike (DP_TE_STANDARDEFFECTBUILTINS)
colorLength = (int)PRVM_G_FLOAT(OFS_PARM2);
CL_FindNonSolidLocation(pos, pos2, 10);
CL_ParticleExplosion2(pos2, colorStart, colorLength);
- tempcolor = (unsigned char *)&palette_complete[(rand()%colorLength) + colorStart];
+ tempcolor = palette_rgb[(rand()%colorLength) + colorStart];
color[0] = tempcolor[0] * (2.0f / 255.0f);
color[1] = tempcolor[1] * (2.0f / 255.0f);
color[2] = tempcolor[2] * (2.0f / 255.0f);
if (val->_float == 0)
val->_float = 1;
- Matrix4x4_CreateFromQuakeEntity(&entitymatrix, csqc_origin[0], csqc_origin[1], csqc_origin[2], csqc_angles[0], csqc_angles[1], csqc_angles[2], val->_float);
+ Matrix4x4_CreateFromQuakeEntity(&entitymatrix, cl.csqc_origin[0], cl.csqc_origin[1], cl.csqc_origin[2], cl.csqc_angles[0], cl.csqc_angles[1], cl.csqc_angles[2], val->_float);
Matrix4x4_Concat(out, &entitymatrix, &tagmatrix);
/*
// should be done in QC on the server, but oh well, quake is quake)
// LordHavoc: figured out bobup: the time at which the sin is at 180
// degrees (which allows lengthening or squishing the peak or valley)
- cycle = sv.time/cl_bobcycle.value;
+ cycle = cl.time/cl_bobcycle.value;
cycle -= (int)cycle;
if (cycle < cl_bobup.value)
cycle = sin(M_PI * cycle / cl_bobup.value);
VM_bitshift, // #218 float(float number, float quantity) bitshift (EXT_BITSHIFT)
NULL, // #219
NULL, // #220
-NULL, // #221
+VM_strstrofs, // #221 float(string str, string sub[, float startpos]) strstrofs (FTE_STRINGS)
VM_str2chr, // #222 float(string str, float ofs) str2chr (FTE_STRINGS)
VM_chr2str, // #223 string(float c, ...) chr2str (FTE_STRINGS)
-NULL, // #224
-NULL, // #225
-NULL, // #226
-NULL, // #227
+VM_strconv, // #224 string(float ccase, float calpha, float cnum, string s, ...) strconv (FTE_STRINGS)
+VM_strpad, // #225 string(float chars, string s, ...) strpad (FTE_STRINGS)
+VM_infoadd, // #226 string(string info, string key, string value, ...) infoadd (FTE_STRINGS)
+VM_infoget, // #227 string(string info, string key) infoget (FTE_STRINGS)
VM_strncmp, // #228 float(string s1, string s2, float len) strncmp (FTE_STRINGS)
-NULL, // #229
-NULL, // #230
+VM_strncasecmp, // #229 float(string s1, string s2) strcasecmp (FTE_STRINGS)
+VM_strncasecmp, // #230 float(string s1, string s2, float len) strncasecmp (FTE_STRINGS)
NULL, // #231
NULL, // #232 void(float index, float type, .void field) SV_AddStat (EXT_CSQC)
NULL, // #233
VM_drawfill, // #323 float(vector position, vector size, vector rgb, float alpha, float flag) drawfill (EXT_CSQC)
VM_drawsetcliparea, // #324 void(float x, float y, float width, float height) drawsetcliparea
VM_drawresetcliparea, // #325 void(void) drawresetcliparea
-NULL, // #326
-NULL, // #327
-NULL, // #328
+VM_drawcolorcodedstring, // #326 float drawcolorcodedstring(vector position, string text, vector scale, vector rgb, float alpha, float flag) (EXT_CSQC)
+NULL, // #327 // FIXME add stringwidth() here?
+NULL, // #328 // FIXME add drawsubpic() here?
NULL, // #329
VM_CL_getstatf, // #330 float(float stnum) getstatf (EXT_CSQC)
VM_CL_getstati, // #331 float(float stnum) getstati (EXT_CSQC)
VM_tokenize, // #441 float(string s) tokenize (KRIMZON_SV_PARSECLIENTCOMMAND)
VM_argv, // #442 string(float n) argv (KRIMZON_SV_PARSECLIENTCOMMAND)
VM_CL_setattachment, // #443 void(entity e, entity tagentity, string tagname) setattachment (DP_GFX_QUAKE3MODELTAGS)
-VM_search_begin, // #444 float(string pattern, float caseinsensitive, float quiet) search_begin (DP_FS_SEARCH)
-VM_search_end, // #445 void(float handle) search_end (DP_FS_SEARCH)
-VM_search_getsize, // #446 float(float handle) search_getsize (DP_FS_SEARCH)
-VM_search_getfilename, // #447 string(float handle, float num) search_getfilename (DP_FS_SEARCH)
+VM_search_begin, // #444 float(string pattern, float caseinsensitive, float quiet) search_begin (DP_QC_FS_SEARCH)
+VM_search_end, // #445 void(float handle) search_end (DP_QC_FS_SEARCH)
+VM_search_getsize, // #446 float(float handle) search_getsize (DP_QC_FS_SEARCH)
+VM_search_getfilename, // #447 string(float handle, float num) search_getfilename (DP_QC_FS_SEARCH)
VM_cvar_string, // #448 string(string s) cvar_string (DP_QC_CVAR_STRING)
VM_findflags, // #449 entity(entity start, .float fld, float match) findflags (DP_QC_FINDFLAGS)
VM_findchainflags, // #450 entity(.float fld, float match) findchainflags (DP_QC_FINDCHAINFLAGS)
VM_strlennocol, // #476 float(string s) : DRESK - String Length (not counting color codes) (DP_QC_STRINGCOLORFUNCTIONS)
VM_strdecolorize, // #477 string(string s) : DRESK - Decolorized String (DP_QC_STRINGCOLORFUNCTIONS)
VM_strftime, // #478 string(float uselocaltime, string format, ...) (DP_QC_STRFTIME)
-NULL, // #479
-NULL, // #480
-NULL, // #481
-NULL, // #482
-NULL, // #483
-NULL, // #484
-NULL, // #485
+VM_tokenizebyseparator, // #479 float(string s) tokenizebyseparator (DP_QC_TOKENIZEBYSEPARATOR)
+VM_strtolower, // #480 string(string s) VM_strtolower (DP_QC_STRING_CASE_FUNCTIONS)
+VM_strtoupper, // #481 string(string s) VM_strtoupper (DP_QC_STRING_CASE_FUNCTIONS)
+VM_cvar_defstring, // #482 string(string s) cvar_defstring (DP_QC_CVAR_DEFSTRING)
+VM_CL_pointsound, // #483 void(vector origin, string sample, float volume, float attenuation) (DP_SV_POINTSOUND)
+VM_strreplace, // #484 string(string search, string replace, string subject) strreplace (DP_QC_STRREPLACE)
+VM_strireplace, // #485 string(string search, string replace, string subject) strireplace (DP_QC_STRREPLACE)
NULL, // #486
-NULL, // #487
-NULL, // #488
-NULL, // #489
-NULL, // #490
-NULL, // #491
+#ifdef SUPPORT_GECKO
+VM_gecko_create, // #487
+VM_gecko_destroy, // #488
+VM_gecko_navigate, // #489
+VM_gecko_keyevent, // #490
+VM_gecko_movemouse, // #491
+#else
+NULL, // #487
+NULL, // #488
+NULL, // #489
+NULL, // #490
+NULL, // #491
+#endif
NULL, // #492
NULL, // #493
NULL, // #494