]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - svvm_cmds.c
fix warnings in terencehill's code
[xonotic/darkplaces.git] / svvm_cmds.c
index 879f797493aa1d1d1421692330237315f378f8d7..459c73f4e745ffc797d6fbe142d7694158075fce 100644 (file)
@@ -8,7 +8,7 @@
 
 
 
-char *vm_sv_extensions =
+const char *vm_sv_extensions =
 "BX_WAL_SUPPORT "
 "DP_BUTTONCHAT "
 "DP_BUTTONUSE "
@@ -19,10 +19,14 @@ char *vm_sv_extensions =
 "DP_CON_SET "
 "DP_CON_SETA "
 "DP_CON_STARTMAP "
+"DP_CSQC_BINDMAPS "
 "DP_CSQC_ENTITYNOCULL "
 "DP_CSQC_ENTITYTRANSPARENTSORTING_OFFSET "
 "DP_CSQC_MULTIFRAME_INTERPOLATION "
+"DP_CSQC_BOXPARTICLES "
 "DP_CSQC_SPAWNPARTICLE "
+"DP_CSQC_QUERYRENDERENTITY "
+"DP_CSQC_SETPAUSE "
 "DP_EF_ADDITIVE "
 "DP_EF_BLUE "
 "DP_EF_DOUBLESIDED "
@@ -34,6 +38,7 @@ char *vm_sv_extensions =
 "DP_EF_NOSELFSHADOW "
 "DP_EF_NOSHADOW "
 "DP_EF_RED "
+"DP_EF_RESTARTANIM_BIT "
 "DP_EF_STARDUST "
 "DP_EF_TELEPORT_BIT "
 "DP_ENT_ALPHA "
@@ -53,6 +58,10 @@ char *vm_sv_extensions =
 "DP_GFX_QUAKE3MODELTAGS "
 "DP_GFX_SKINFILES "
 "DP_GFX_SKYBOX "
+"DP_GFX_FONTS "
+"DP_GFX_FONTS_FREETYPE "
+"DP_UTF8 "
+"DP_FONT_VARIABLEWIDTH "
 "DP_HALFLIFE_MAP "
 "DP_HALFLIFE_MAP_CVAR "
 "DP_HALFLIFE_SPRITE "
@@ -88,6 +97,7 @@ char *vm_sv_extensions =
 "DP_QC_FS_SEARCH "
 "DP_QC_GETLIGHT "
 "DP_QC_GETSURFACE "
+"DP_QC_GETSURFACETRIANGLE "
 "DP_QC_GETSURFACEPOINTATTRIBUTE "
 "DP_QC_GETTAGINFO "
 "DP_QC_GETTAGINFO_BONEPROPERTIES "
@@ -99,6 +109,7 @@ char *vm_sv_extensions =
 "DP_QC_NUM_FOR_EDICT "
 "DP_QC_RANDOMVEC "
 "DP_QC_SINCOSSQRTPOW "
+"DP_QC_SPRINTF "
 "DP_QC_STRFTIME "
 "DP_QC_STRINGBUFFERS "
 "DP_QC_STRINGBUFFERS_CVARLIST "
@@ -128,14 +139,19 @@ char *vm_sv_extensions =
 "DP_SND_OGGVORBIS "
 "DP_SND_SETPARAMS "
 "DP_SND_STEREOWAV "
+"DP_SND_GETSOUNDTIME "
+"DP_VIDEO_DPV "
+"DP_VIDEO_SUBTITLES "
 "DP_SOLIDCORPSE "
 "DP_SPRITE32 "
 "DP_SV_BOTCLIENT "
 "DP_SV_BOUNCEFACTOR "
+"DP_SV_CLIENTCAMERA "
 "DP_SV_CLIENTCOLORS "
 "DP_SV_CLIENTNAME "
 "DP_SV_CMD "
 "DP_SV_CUSTOMIZEENTITYFORCLIENT "
+"DP_SV_DISCARDABLEDEMO "
 "DP_SV_DRAWONLYTOCLIENT "
 "DP_SV_DROPCLIENT "
 "DP_SV_EFFECT "
@@ -147,6 +163,7 @@ char *vm_sv_extensions =
 "DP_SV_ONENTITYNOSPAWNFUNCTION "
 "DP_SV_ONENTITYPREPOSTSPAWNFUNCTION "
 "DP_SV_PING "
+"DP_SV_PING_PACKETLOSS "
 "DP_SV_PLAYERPHYSICS "
 "DP_SV_POINTPARTICLES "
 "DP_SV_POINTSOUND "
@@ -921,7 +938,7 @@ static void VM_SV_findradius (void)
        vec3_t org, eorg, mins, maxs;
        int i;
        int numtouchedicts;
-       prvm_edict_t *touchedicts[MAX_EDICTS];
+       static prvm_edict_t *touchedicts[MAX_EDICTS];
        int chainfield;
 
        VM_SAFEPARMCOUNTRANGE(2, 3, VM_SV_findradius);
@@ -1212,7 +1229,7 @@ static void VM_SV_aim (void)
        int             i, j;
        trace_t tr;
        float   dist, bestdist;
-       float   speed;
+       //float speed;
 
        VM_SAFEPARMCOUNT(2, VM_SV_aim);
 
@@ -1233,7 +1250,7 @@ static void VM_SV_aim (void)
                VM_Warning("aim: can not use free entity\n");
                return;
        }
-       speed = PRVM_G_FLOAT(OFS_PARM1);
+       //speed = PRVM_G_FLOAT(OFS_PARM1);
 
        VectorCopy (ent->fields.server->origin, start);
        start[2] += 20;
@@ -1345,7 +1362,7 @@ sizebuf_t *WriteDest (void)
                return sv.writeentitiestoclient_msg;
        }
 
-       return NULL;
+       //return NULL;
 }
 
 static void VM_SV_WriteByte (void)
@@ -2247,257 +2264,6 @@ static void VM_SV_te_flamejet (void)
        SV_FlushBroadcastMessages();
 }
 
-void clippointtosurface(dp_model_t *model, msurface_t *surface, vec3_t p, vec3_t out)
-{
-       int i, j, k;
-       float *v[3], facenormal[3], edgenormal[3], sidenormal[3], temp[3], offsetdist, dist, bestdist;
-       const int *e;
-       bestdist = 1000000000;
-       VectorCopy(p, out);
-       for (i = 0, e = (model->surfmesh.data_element3i + 3 * surface->num_firsttriangle);i < surface->num_triangles;i++, e += 3)
-       {
-               // clip original point to each triangle of the surface and find the
-               // triangle that is closest
-               v[0] = model->surfmesh.data_vertex3f + e[0] * 3;
-               v[1] = model->surfmesh.data_vertex3f + e[1] * 3;
-               v[2] = model->surfmesh.data_vertex3f + e[2] * 3;
-               TriangleNormal(v[0], v[1], v[2], facenormal);
-               VectorNormalize(facenormal);
-               offsetdist = DotProduct(v[0], facenormal) - DotProduct(p, facenormal);
-               VectorMA(p, offsetdist, facenormal, temp);
-               for (j = 0, k = 2;j < 3;k = j, j++)
-               {
-                       VectorSubtract(v[k], v[j], edgenormal);
-                       CrossProduct(edgenormal, facenormal, sidenormal);
-                       VectorNormalize(sidenormal);
-                       offsetdist = DotProduct(v[k], sidenormal) - DotProduct(temp, sidenormal);
-                       if (offsetdist < 0)
-                               VectorMA(temp, offsetdist, sidenormal, temp);
-               }
-               dist = VectorDistance2(temp, p);
-               if (bestdist > dist)
-               {
-                       bestdist = dist;
-                       VectorCopy(temp, out);
-               }
-       }
-}
-
-#define getmodel SV_GetModelFromEdict
-
-static msurface_t *getsurface(dp_model_t *model, int surfacenum)
-{
-       if (surfacenum < 0 || surfacenum >= model->nummodelsurfaces)
-               return NULL;
-       return model->data_surfaces + surfacenum + model->firstmodelsurface;
-}
-
-
-//PF_getsurfacenumpoints, // #434 float(entity e, float s) getsurfacenumpoints = #434;
-static void VM_SV_getsurfacenumpoints(void)
-{
-       dp_model_t *model;
-       msurface_t *surface;
-       VM_SAFEPARMCOUNT(2, VM_SV_getsurfacenumpoints);
-       // return 0 if no such surface
-       if (!(model = getmodel(PRVM_G_EDICT(OFS_PARM0))) || !(surface = getsurface(model, (int)PRVM_G_FLOAT(OFS_PARM1))))
-       {
-               PRVM_G_FLOAT(OFS_RETURN) = 0;
-               return;
-       }
-
-       // note: this (incorrectly) assumes it is a simple polygon
-       PRVM_G_FLOAT(OFS_RETURN) = surface->num_vertices;
-}
-//PF_getsurfacepoint,     // #435 vector(entity e, float s, float n) getsurfacepoint = #435;
-static void VM_SV_getsurfacepoint(void)
-{
-       prvm_edict_t *ed;
-       dp_model_t *model;
-       msurface_t *surface;
-       int pointnum;
-       VM_SAFEPARMCOUNT(3, VM_SV_getsurfacepoint);
-       VectorClear(PRVM_G_VECTOR(OFS_RETURN));
-       ed = PRVM_G_EDICT(OFS_PARM0);
-       if (!(model = getmodel(ed)) || !(surface = getsurface(model, (int)PRVM_G_FLOAT(OFS_PARM1))))
-               return;
-       // note: this (incorrectly) assumes it is a simple polygon
-       pointnum = (int)PRVM_G_FLOAT(OFS_PARM2);
-       if (pointnum < 0 || pointnum >= surface->num_vertices)
-               return;
-       // FIXME: implement rotation/scaling
-       VectorAdd(&(model->surfmesh.data_vertex3f + 3 * surface->num_firstvertex)[pointnum * 3], ed->fields.server->origin, PRVM_G_VECTOR(OFS_RETURN));
-}
-//PF_getsurfacepointattribute,     // #486 vector(entity e, float s, float n, float a) getsurfacepointattribute = #486;
-// float SPA_POSITION = 0;
-// float SPA_S_AXIS = 1;
-// float SPA_T_AXIS = 2;
-// float SPA_R_AXIS = 3; // same as SPA_NORMAL
-// float SPA_TEXCOORDS0 = 4;
-// float SPA_LIGHTMAP0_TEXCOORDS = 5;
-// float SPA_LIGHTMAP0_COLOR = 6;
-static void VM_SV_getsurfacepointattribute(void)
-{
-       prvm_edict_t *ed;
-       dp_model_t *model;
-       msurface_t *surface;
-       int pointnum;
-       int attributetype;
-
-       VM_SAFEPARMCOUNT(4, VM_SV_getsurfacepoint);
-       VectorClear(PRVM_G_VECTOR(OFS_RETURN));
-       ed = PRVM_G_EDICT(OFS_PARM0);
-       if (!(model = getmodel(ed)) || !(surface = getsurface(model, (int)PRVM_G_FLOAT(OFS_PARM1))))
-               return;
-       // note: this (incorrectly) assumes it is a simple polygon
-       pointnum = (int)PRVM_G_FLOAT(OFS_PARM2);
-       if (pointnum < 0 || pointnum >= surface->num_vertices)
-               return;
-       // FIXME: implement rotation/scaling
-       attributetype = (int) PRVM_G_FLOAT(OFS_PARM3);
-
-       switch( attributetype ) {
-               // float SPA_POSITION = 0;
-               case 0:
-                       VectorAdd(&(model->surfmesh.data_vertex3f + 3 * surface->num_firstvertex)[pointnum * 3], ed->fields.server->origin, PRVM_G_VECTOR(OFS_RETURN));
-                       break;
-               // float SPA_S_AXIS = 1;
-               case 1:
-                       VectorCopy(&(model->surfmesh.data_svector3f + 3 * surface->num_firstvertex)[pointnum * 3], PRVM_G_VECTOR(OFS_RETURN));
-                       break;
-               // float SPA_T_AXIS = 2;
-               case 2:
-                       VectorCopy(&(model->surfmesh.data_tvector3f + 3 * surface->num_firstvertex)[pointnum * 3], PRVM_G_VECTOR(OFS_RETURN));
-                       break;
-               // float SPA_R_AXIS = 3; // same as SPA_NORMAL
-               case 3:
-                       VectorCopy(&(model->surfmesh.data_normal3f + 3 * surface->num_firstvertex)[pointnum * 3], PRVM_G_VECTOR(OFS_RETURN));
-                       break;
-               // float SPA_TEXCOORDS0 = 4;
-               case 4: {
-                       float *ret = PRVM_G_VECTOR(OFS_RETURN);
-                       float *texcoord = &(model->surfmesh.data_texcoordtexture2f + 2 * surface->num_firstvertex)[pointnum * 2];
-                       ret[0] = texcoord[0];
-                       ret[1] = texcoord[1];
-                       ret[2] = 0.0f;
-                       break;
-               }
-               // float SPA_LIGHTMAP0_TEXCOORDS = 5;
-               case 5: {
-                       float *ret = PRVM_G_VECTOR(OFS_RETURN);
-                       float *texcoord = &(model->surfmesh.data_texcoordlightmap2f + 2 * surface->num_firstvertex)[pointnum * 2];
-                       ret[0] = texcoord[0];
-                       ret[1] = texcoord[1];
-                       ret[2] = 0.0f;
-                       break;
-               }
-               // float SPA_LIGHTMAP0_COLOR = 6;
-               case 6:
-                       // ignore alpha for now..
-                       VectorCopy( &(model->surfmesh.data_lightmapcolor4f + 4 * surface->num_firstvertex)[pointnum * 4], PRVM_G_VECTOR(OFS_RETURN));
-                       break;
-               default:
-                       VectorSet( PRVM_G_VECTOR(OFS_RETURN), 0.0f, 0.0f, 0.0f );
-                       break;
-       }
-}
-//PF_getsurfacenormal,    // #436 vector(entity e, float s) getsurfacenormal = #436;
-static void VM_SV_getsurfacenormal(void)
-{
-       dp_model_t *model;
-       msurface_t *surface;
-       vec3_t normal;
-       VM_SAFEPARMCOUNT(2, VM_SV_getsurfacenormal);
-       VectorClear(PRVM_G_VECTOR(OFS_RETURN));
-       if (!(model = getmodel(PRVM_G_EDICT(OFS_PARM0))) || !(surface = getsurface(model, (int)PRVM_G_FLOAT(OFS_PARM1))))
-               return;
-       // FIXME: implement rotation/scaling
-       // note: this (incorrectly) assumes it is a simple polygon
-       // note: this only returns the first triangle, so it doesn't work very
-       // well for curved surfaces or arbitrary meshes
-       TriangleNormal((model->surfmesh.data_vertex3f + 3 * surface->num_firstvertex), (model->surfmesh.data_vertex3f + 3 * surface->num_firstvertex) + 3, (model->surfmesh.data_vertex3f + 3 * surface->num_firstvertex) + 6, normal);
-       VectorNormalize(normal);
-       VectorCopy(normal, PRVM_G_VECTOR(OFS_RETURN));
-}
-//PF_getsurfacetexture,   // #437 string(entity e, float s) getsurfacetexture = #437;
-static void VM_SV_getsurfacetexture(void)
-{
-       dp_model_t *model;
-       msurface_t *surface;
-       VM_SAFEPARMCOUNT(2, VM_SV_getsurfacetexture);
-       PRVM_G_INT(OFS_RETURN) = OFS_NULL;
-       if (!(model = getmodel(PRVM_G_EDICT(OFS_PARM0))) || !(surface = getsurface(model, (int)PRVM_G_FLOAT(OFS_PARM1))))
-               return;
-       PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(surface->texture->name);
-}
-//PF_getsurfacenearpoint, // #438 float(entity e, vector p) getsurfacenearpoint = #438;
-static void VM_SV_getsurfacenearpoint(void)
-{
-       int surfacenum, best;
-       vec3_t clipped, p;
-       vec_t dist, bestdist;
-       prvm_edict_t *ed;
-       dp_model_t *model;
-       msurface_t *surface;
-       vec_t *point;
-       VM_SAFEPARMCOUNT(2, VM_SV_getsurfacenearpoint);
-       PRVM_G_FLOAT(OFS_RETURN) = -1;
-       ed = PRVM_G_EDICT(OFS_PARM0);
-       point = PRVM_G_VECTOR(OFS_PARM1);
-
-       if (!ed || ed->priv.server->free)
-               return;
-       model = getmodel(ed);
-       if (!model || !model->num_surfaces)
-               return;
-
-       // FIXME: implement rotation/scaling
-       VectorSubtract(point, ed->fields.server->origin, p);
-       best = -1;
-       bestdist = 1000000000;
-       for (surfacenum = 0;surfacenum < model->nummodelsurfaces;surfacenum++)
-       {
-               surface = model->data_surfaces + surfacenum + model->firstmodelsurface;
-               // first see if the nearest point on the surface's box is closer than the previous match
-               clipped[0] = bound(surface->mins[0], p[0], surface->maxs[0]) - p[0];
-               clipped[1] = bound(surface->mins[1], p[1], surface->maxs[1]) - p[1];
-               clipped[2] = bound(surface->mins[2], p[2], surface->maxs[2]) - p[2];
-               dist = VectorLength2(clipped);
-               if (dist < bestdist)
-               {
-                       // it is, check the nearest point on the actual geometry
-                       clippointtosurface(model, surface, p, clipped);
-                       VectorSubtract(clipped, p, clipped);
-                       dist += VectorLength2(clipped);
-                       if (dist < bestdist)
-                       {
-                               // that's closer too, store it as the best match
-                               best = surfacenum;
-                               bestdist = dist;
-                       }
-               }
-       }
-       PRVM_G_FLOAT(OFS_RETURN) = best;
-}
-//PF_getsurfaceclippedpoint, // #439 vector(entity e, float s, vector p) getsurfaceclippedpoint = #439;
-static void VM_SV_getsurfaceclippedpoint(void)
-{
-       prvm_edict_t *ed;
-       dp_model_t *model;
-       msurface_t *surface;
-       vec3_t p, out;
-       VM_SAFEPARMCOUNT(3, VM_SV_te_getsurfaceclippedpoint);
-       VectorClear(PRVM_G_VECTOR(OFS_RETURN));
-       ed = PRVM_G_EDICT(OFS_PARM0);
-       if (!(model = getmodel(ed)) || !(surface = getsurface(model, (int)PRVM_G_FLOAT(OFS_PARM1))))
-               return;
-       // FIXME: implement rotation/scaling
-       VectorSubtract(PRVM_G_VECTOR(OFS_PARM2), ed->fields.server->origin, p);
-       clippointtosurface(model, surface, p, out);
-       // FIXME: implement rotation/scaling
-       VectorAdd(out, ed->fields.server->origin, PRVM_G_VECTOR(OFS_RETURN));
-}
-
 //void(entity e, string s) clientcommand = #440; // executes a command string as if it came from the specified client
 //this function originally written by KrimZon, made shorter by LordHavoc
 static void VM_SV_clientcommand (void)
@@ -2624,7 +2390,7 @@ void SV_GetEntityMatrix (prvm_edict_t *ent, matrix4x4_t *out, qboolean viewmatri
 int SV_GetEntityLocalTagMatrix(prvm_edict_t *ent, int tagindex, matrix4x4_t *out)
 {
        dp_model_t *model;
-       if (tagindex >= 0 && (model = SV_GetModelFromEdict(ent)) && model->num_bones)
+       if (tagindex >= 0 && (model = SV_GetModelFromEdict(ent)) && model->animscenes)
        {
                VM_GenerateFrameGroupBlend(ent->priv.server->framegroupblend, ent);
                VM_FrameBlendFromFrameGroupBlend(ent->priv.server->frameblend, ent->priv.server->framegroupblend, model);
@@ -2762,8 +2528,8 @@ static void VM_SV_gettagindex (void)
        {
                tag_index = SV_GetTagIndex(ent, tag_name);
                if (tag_index == 0)
-                       if(developer.integer >= 100)
-                               Con_Printf("VM_SV_gettagindex(entity #%i): tag \"%s\" not found\n", PRVM_NUM_FOR_EDICT(ent), tag_name);
+                       if(developer_extra.integer)
+                               Con_DPrintf("VM_SV_gettagindex(entity #%i): tag \"%s\" not found\n", PRVM_NUM_FOR_EDICT(ent), tag_name);
        }
        PRVM_G_FLOAT(OFS_RETURN) = tag_index;
 }
@@ -3072,13 +2838,13 @@ static void VM_SV_skel_create(void)
                        break;
        if (i == MAX_EDICTS)
                return;
-       prog->skeletons[i] = skeleton = Mem_Alloc(cls.levelmempool, sizeof(skeleton_t) + model->num_bones * sizeof(matrix4x4_t));
+       prog->skeletons[i] = skeleton = (skeleton_t *)Mem_Alloc(cls.levelmempool, sizeof(skeleton_t) + model->num_bones * sizeof(matrix4x4_t));
+       PRVM_G_FLOAT(OFS_RETURN) = i + 1;
        skeleton->model = model;
        skeleton->relativetransforms = (matrix4x4_t *)(skeleton+1);
        // initialize to identity matrices
        for (i = 0;i < skeleton->model->num_bones;i++)
                skeleton->relativetransforms[i] = identitymatrix;
-       PRVM_G_FLOAT(OFS_RETURN) = i + 1;
 }
 
 // #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
@@ -3089,8 +2855,8 @@ static void VM_SV_skel_build(void)
        prvm_edict_t *ed = PRVM_G_EDICT(OFS_PARM1);
        int modelindex = (int)PRVM_G_FLOAT(OFS_PARM2);
        float retainfrac = PRVM_G_FLOAT(OFS_PARM3);
-       int firstbone = PRVM_G_FLOAT(OFS_PARM4);
-       int lastbone = PRVM_G_FLOAT(OFS_PARM5);
+       int firstbone = PRVM_G_FLOAT(OFS_PARM4) - 1;
+       int lastbone = PRVM_G_FLOAT(OFS_PARM5) - 1;
        dp_model_t *model = SV_GetModelByIndex(modelindex);
        float blendfrac;
        int numblends;
@@ -3117,12 +2883,12 @@ static void VM_SV_skel_build(void)
                Matrix4x4_Accumulate(&blendedmatrix, &skeleton->relativetransforms[bonenum], retainfrac);
                for (blendindex = 0;blendindex < numblends;blendindex++)
                {
-                       Matrix4x4_FromArray12FloatD3D(&matrix, model->data_poses + 12 * (frameblend[blendindex].subframe * model->num_bones + bonenum));
+                       Matrix4x4_FromBonePose6s(&matrix, model->num_posescale, model->data_poses6s + 6 * (frameblend[blendindex].subframe * model->num_bones + bonenum));
                        Matrix4x4_Accumulate(&blendedmatrix, &matrix, frameblend[blendindex].lerp);
                }
                skeleton->relativetransforms[bonenum] = blendedmatrix;
        }
-       PRVM_G_FLOAT(OFS_RETURN) = skeletonindex;
+       PRVM_G_FLOAT(OFS_RETURN) = skeletonindex + 1;
 }
 
 // #265 float(float skel) skel_get_numbones = #265; // (FTE_CSQC_SKELETONOBJECTS) returns how many bones exist in the created skeleton
@@ -3805,12 +3571,12 @@ VM_SV_te_lightning3,                    // #430 void(entity own, vector start, vector end) te_lig
 VM_SV_te_beam,                                 // #431 void(entity own, vector start, vector end) te_beam (DP_TE_STANDARDEFFECTBUILTINS)
 VM_vectorvectors,                              // #432 void(vector dir) vectorvectors (DP_QC_VECTORVECTORS)
 VM_SV_te_plasmaburn,                   // #433 void(vector org) te_plasmaburn (DP_TE_PLASMABURN)
-VM_SV_getsurfacenumpoints,             // #434 float(entity e, float s) getsurfacenumpoints (DP_QC_GETSURFACE)
-VM_SV_getsurfacepoint,                 // #435 vector(entity e, float s, float n) getsurfacepoint (DP_QC_GETSURFACE)
-VM_SV_getsurfacenormal,                        // #436 vector(entity e, float s) getsurfacenormal (DP_QC_GETSURFACE)
-VM_SV_getsurfacetexture,               // #437 string(entity e, float s) getsurfacetexture (DP_QC_GETSURFACE)
-VM_SV_getsurfacenearpoint,             // #438 float(entity e, vector p) getsurfacenearpoint (DP_QC_GETSURFACE)
-VM_SV_getsurfaceclippedpoint,  // #439 vector(entity e, float s, vector p) getsurfaceclippedpoint (DP_QC_GETSURFACE)
+VM_getsurfacenumpoints,                // #434 float(entity e, float s) getsurfacenumpoints (DP_QC_GETSURFACE)
+VM_getsurfacepoint,                    // #435 vector(entity e, float s, float n) getsurfacepoint (DP_QC_GETSURFACE)
+VM_getsurfacenormal,                   // #436 vector(entity e, float s) getsurfacenormal (DP_QC_GETSURFACE)
+VM_getsurfacetexture,          // #437 string(entity e, float s) getsurfacetexture (DP_QC_GETSURFACE)
+VM_getsurfacenearpoint,                // #438 float(entity e, vector p) getsurfacenearpoint (DP_QC_GETSURFACE)
+VM_getsurfaceclippedpoint,     // #439 vector(entity e, float s, vector p) getsurfaceclippedpoint (DP_QC_GETSURFACE)
 VM_SV_clientcommand,                   // #440 void(entity e, string s) clientcommand (KRIMZON_SV_PARSECLIENTCOMMAND)
 VM_tokenize,                                   // #441 float(string s) tokenize (KRIMZON_SV_PARSECLIENTCOMMAND)
 VM_argv,                                               // #442 string(float n) argv (KRIMZON_SV_PARSECLIENTCOMMAND)
@@ -3857,7 +3623,7 @@ VM_cvar_defstring,                                // #482 string(string s) cvar_defstring (DP_QC_CVAR_DEFSTR
 VM_SV_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)
-VM_SV_getsurfacepointattribute,// #486 vector(entity e, float s, float n, float a) getsurfacepointattribute = #486;
+VM_getsurfacepointattribute,// #486 vector(entity e, float s, float n, float a) getsurfacepointattribute = #486;
 NULL,                                                  // #487
 NULL,                                                  // #488
 NULL,                                                  // #489
@@ -3904,8 +3670,8 @@ VM_loadfromdata,                          // #529
 VM_loadfromfile,                               // #530
 VM_SV_setpause,                                        // #531 void(float pause) setpause = #531;
 VM_log,                                                        // #532
-NULL,                                                  // #533
-NULL,                                                  // #534
+VM_getsoundtime,                               // #533 float(entity e, float channel) getsoundtime = #533; (DP_SND_GETSOUNDTIME)
+VM_soundlength,                                        // #534 float(string sample) soundlength = #534; (DP_SND_GETSOUNDTIME)
 NULL,                                                  // #535
 NULL,                                                  // #536
 NULL,                                                  // #537
@@ -3997,6 +3763,11 @@ NULL,                                                    // #622
 NULL,                                                  // #623
 VM_SV_getextresponse,                  // #624 string getextresponse(void)
 NULL,                                                  // #625
+NULL,                                                  // #626
+VM_sprintf,                     // #627 string sprintf(string format, ...)
+VM_getsurfacenumtriangles,             // #628 float(entity e, float s) getsurfacenumpoints (DP_QC_GETSURFACETRIANGLE)
+VM_getsurfacetriangle,                 // #629 vector(entity e, float s, float n) getsurfacepoint (DP_QC_GETSURFACETRIANGLE)
+NULL,                                                  // #630
 };
 
 const int vm_sv_numbuiltins = sizeof(vm_sv_builtins) / sizeof(prvm_builtin_t);