]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - clvm_cmds.c
fix a mingw warning
[xonotic/darkplaces.git] / clvm_cmds.c
index 07e6a13f804afd1233fa7516aa6989ca12bfa7af..b314ac925da285b9110946817a08414eb4c9c7c4 100644 (file)
@@ -29,7 +29,6 @@ void Sbar_SortFrags (void);
 void CL_FindNonSolidLocation(const vec3_t in, vec3_t out, vec_t radius);
 void CSQC_RelinkAllEntities (int drawmask);
 void CSQC_RelinkCSQCEntities (void);
-const char *Key_GetBind (int key);
 
 // #1 void(vector ang) makevectors
 static void VM_CL_makevectors (void)
@@ -724,7 +723,7 @@ void VM_CL_R_ClearScene (void)
        r_refdef.view.isoverlay = false;
        // FIXME: restore cl.csqc_origin
        // FIXME: restore cl.csqc_angles
-       cl.csqc_vidvars.drawworld = true;
+       cl.csqc_vidvars.drawworld = r_drawworld.integer != 0;
        cl.csqc_vidvars.drawenginesbar = false;
        cl.csqc_vidvars.drawcrosshair = false;
 }
@@ -774,18 +773,115 @@ void VM_CL_R_AddEntity (void)
 }
 
 //#303 float(float property, ...) setproperty (EXT_CSQC)
+//#303 float(float property) getproperty
+//#303 vector(float property) getpropertyvec
+// VorteX: make this function be able to return previously set property if new value is not given
 void VM_CL_R_SetView (void)
 {
        int             c;
        float   *f;
        float   k;
 
-       VM_SAFEPARMCOUNTRANGE(2, 3, VM_CL_R_SetView);
+       VM_SAFEPARMCOUNTRANGE(1, 3, VM_CL_R_SetView);
 
        c = (int)PRVM_G_FLOAT(OFS_PARM0);
+
+       // return value?
+       if (prog->argc < 2)
+       {
+               switch(c)
+               {
+               case VF_MIN:
+                       VectorSet(PRVM_G_VECTOR(OFS_RETURN), r_refdef.view.x, r_refdef.view.y, 0);
+                       break;
+               case VF_MIN_X:
+                       PRVM_G_FLOAT(OFS_RETURN) = r_refdef.view.x;
+                       break;
+               case VF_MIN_Y:
+                       PRVM_G_FLOAT(OFS_RETURN) = r_refdef.view.y;
+                       break;
+               case VF_SIZE:
+                       VectorSet(PRVM_G_VECTOR(OFS_RETURN), r_refdef.view.width, r_refdef.view.height, 0);
+                       break;
+               case VF_SIZE_X:
+                       PRVM_G_FLOAT(OFS_RETURN) = r_refdef.view.width;
+                       break;
+               case VF_SIZE_Y:
+                       PRVM_G_FLOAT(OFS_RETURN) = r_refdef.view.height;
+                       break;
+               case VF_VIEWPORT:
+                       VM_Warning("VM_CL_R_GetView : VF_VIEWPORT can't be retrieved, use VF_MIN/VF_SIZE instead\n");
+                       break;
+               case VF_FOV:
+                       VectorSet(PRVM_G_VECTOR(OFS_RETURN), r_refdef.view.ortho_x, r_refdef.view.ortho_y, 0);
+                       break;
+               case VF_FOVX:
+                       PRVM_G_FLOAT(OFS_RETURN) = r_refdef.view.ortho_x;
+                       break;
+               case VF_FOVY:
+                       PRVM_G_FLOAT(OFS_RETURN) = r_refdef.view.ortho_y;
+                       break;
+               case VF_ORIGIN:
+                       VectorCopy(cl.csqc_origin, PRVM_G_VECTOR(OFS_RETURN));
+                       break;
+               case VF_ORIGIN_X:
+                       PRVM_G_FLOAT(OFS_RETURN) = cl.csqc_origin[0];
+                       break;
+               case VF_ORIGIN_Y:
+                       PRVM_G_FLOAT(OFS_RETURN) = cl.csqc_origin[1];
+                       break;
+               case VF_ORIGIN_Z:
+                       PRVM_G_FLOAT(OFS_RETURN) = cl.csqc_origin[2];
+                       break;
+               case VF_ANGLES:
+                       VectorCopy(cl.csqc_angles, PRVM_G_VECTOR(OFS_RETURN));
+                       break;
+               case VF_ANGLES_X:
+                       PRVM_G_FLOAT(OFS_RETURN) = cl.csqc_angles[0];
+                       break;
+               case VF_ANGLES_Y:
+                       PRVM_G_FLOAT(OFS_RETURN) = cl.csqc_angles[1];
+                       break;
+               case VF_ANGLES_Z:
+                       PRVM_G_FLOAT(OFS_RETURN) = cl.csqc_angles[2];
+                       break;
+               case VF_DRAWWORLD:
+                       PRVM_G_FLOAT(OFS_RETURN) = cl.csqc_vidvars.drawworld;
+                       break;
+               case VF_DRAWENGINESBAR:
+                       PRVM_G_FLOAT(OFS_RETURN) = cl.csqc_vidvars.drawenginesbar;
+                       break;
+               case VF_DRAWCROSSHAIR:
+                       PRVM_G_FLOAT(OFS_RETURN) = cl.csqc_vidvars.drawcrosshair;
+                       break;
+               case VF_CL_VIEWANGLES:
+                       VectorCopy(cl.viewangles, PRVM_G_VECTOR(OFS_RETURN));;
+                       break;
+               case VF_CL_VIEWANGLES_X:
+                       PRVM_G_FLOAT(OFS_RETURN) = cl.viewangles[0];
+                       break;
+               case VF_CL_VIEWANGLES_Y:
+                       PRVM_G_FLOAT(OFS_RETURN) = cl.viewangles[1];
+                       break;
+               case VF_CL_VIEWANGLES_Z:
+                       PRVM_G_FLOAT(OFS_RETURN) = cl.viewangles[2];
+                       break;
+               case VF_PERSPECTIVE:
+                       PRVM_G_FLOAT(OFS_RETURN) = r_refdef.view.useperspective;
+                       break;
+               case VF_CLEARSCREEN:
+                       PRVM_G_FLOAT(OFS_RETURN) = r_refdef.view.isoverlay;
+                       break;
+               default:
+                       PRVM_G_FLOAT(OFS_RETURN) = 0;
+                       VM_Warning("VM_CL_R_GetView : unknown parm %i\n", c);
+                       return;
+               }
+               return;
+       }
+
        f = PRVM_G_VECTOR(OFS_PARM1);
        k = PRVM_G_FLOAT(OFS_PARM1);
-
        switch(c)
        {
        case VF_MIN:
@@ -858,7 +954,7 @@ void VM_CL_R_SetView (void)
                CSQC_R_RecalcView();
                break;
        case VF_DRAWWORLD:
-               cl.csqc_vidvars.drawworld = k != 0;
+               cl.csqc_vidvars.drawworld = ((k != 0) && r_drawworld.integer);
                break;
        case VF_DRAWENGINESBAR:
                cl.csqc_vidvars.drawenginesbar = k != 0;
@@ -1129,24 +1225,69 @@ static void VM_CL_trailparticles (void)
 
        if (i < 0)
                return;
-       CL_ParticleEffect(i, VectorDistance(start, end), start, end, t->fields.client->velocity, t->fields.client->velocity, NULL, prog->argc >= 5 ? (int)PRVM_G_FLOAT(OFS_PARM4) : 0);
+       CL_ParticleEffect(i, 1, start, end, t->fields.client->velocity, t->fields.client->velocity, NULL, prog->argc >= 5 ? (int)PRVM_G_FLOAT(OFS_PARM4) : 0);
 }
 
 //#337 void(float effectnum, vector origin, vector dir, float count[, float color]) pointparticles (EXT_CSQC)
 static void VM_CL_pointparticles (void)
 {
-       int                     i, n;
+       int                     i;
+       float n;
        float           *f, *v;
        VM_SAFEPARMCOUNTRANGE(4, 5, VM_CL_pointparticles);
        i = (int)PRVM_G_FLOAT(OFS_PARM0);
        f = PRVM_G_VECTOR(OFS_PARM1);
        v = PRVM_G_VECTOR(OFS_PARM2);
-       n = (int)PRVM_G_FLOAT(OFS_PARM3);
+       n = PRVM_G_FLOAT(OFS_PARM3);
        if (i < 0)
                return;
        CL_ParticleEffect(i, n, f, f, v, v, NULL, prog->argc >= 5 ? (int)PRVM_G_FLOAT(OFS_PARM4) : 0);
 }
 
+//#502 void(float effectnum, entity own, vector origin_from, vector origin_to, vector dir_from, vector dir_to, float count, float extflags) boxparticles (DP_CSQC_BOXPARTICLES)
+static void VM_CL_boxparticles (void)
+{
+       int effectnum;
+       prvm_edict_t *own;
+       float *origin_from, *origin_to, *dir_from, *dir_to;
+       float count;
+       int flags;
+       float tintmins[4], tintmaxs[4];
+       prvm_eval_t *val;
+       VM_SAFEPARMCOUNTRANGE(7, 8, VM_CL_boxparticles);
+
+       effectnum = (int)PRVM_G_FLOAT(OFS_PARM0);
+       own = PRVM_G_EDICT(OFS_PARM1); // TODO find use for this
+       origin_from = PRVM_G_VECTOR(OFS_PARM2);
+       origin_to = PRVM_G_VECTOR(OFS_PARM3);
+       dir_from = PRVM_G_VECTOR(OFS_PARM4);
+       dir_to = PRVM_G_VECTOR(OFS_PARM5);
+       count = PRVM_G_FLOAT(OFS_PARM6);
+       if(prog->argc >= 8)
+               flags = PRVM_G_FLOAT(OFS_PARM7);
+       else
+               flags = 0;
+       Vector4Set(tintmins, 1, 1, 1, 1);
+       Vector4Set(tintmaxs, 1, 1, 1, 1);
+       if(flags & 1) // read alpha
+       {
+               if((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.particles_alphamin)))
+                       tintmins[3] = val->_float;
+               if((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.particles_alphamax)))
+                       tintmaxs[3] = val->_float;
+       }
+       if(flags & 2) // read color
+       {
+               if((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.particles_colormin)))
+                       VectorCopy(val->vector, tintmins);
+               if((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.particles_colormax)))
+                       VectorCopy(val->vector, tintmaxs);
+       }
+       if (effectnum < 0)
+               return;
+       CL_ParticleTrail(effectnum, count, origin_from, origin_to, dir_from, dir_to, NULL, 0, true, true, tintmins, tintmaxs);
+}
+
 //#531 void(float pause) setpause
 static void VM_CL_setpause(void) 
 {
@@ -1157,13 +1298,6 @@ static void VM_CL_setpause(void)
                cl.csqc_paused = false;
 }
 
-//#342 string(float keynum) getkeybind (EXT_CSQC)
-static void VM_CL_getkeybind (void)
-{
-       VM_SAFEPARMCOUNT(1, VM_CL_getkeybind);
-       PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(Key_GetBind((int)PRVM_G_FLOAT(OFS_PARM0)));
-}
-
 //#343 void(float usecursor) setcursormode (EXT_CSQC)
 static void VM_CL_setcursormode (void)
 {
@@ -1284,13 +1418,6 @@ static void VM_CL_getplayerkey (void)
        PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(t);
 }
 
-//#349 float() isdemo (EXT_CSQC)
-static void VM_CL_isdemo (void)
-{
-       VM_SAFEPARMCOUNT(0, VM_CL_isdemo);
-       PRVM_G_FLOAT(OFS_RETURN) = cls.demoplayback;
-}
-
 //#351 void(vector origin, vector forward, vector right, vector up) SetListener (EXT_CSQC)
 static void VM_CL_setlistener (void)
 {
@@ -1413,7 +1540,7 @@ static void VM_CL_ReadPicture (void)
                        // use the attached jpeg as texture
                        buf = (unsigned char *) Mem_Alloc(tempmempool, size);
                        MSG_ReadBytes(size, buf);
-                       data = JPEG_LoadImage_BGRA(buf, size);
+                       data = JPEG_LoadImage_BGRA(buf, size, NULL);
                        Mem_Free(buf);
                        Draw_NewPic(name, image_width, image_height, false, data);
                        Mem_Free(data);
@@ -2485,8 +2612,8 @@ void VM_CL_ParticleThemeToGlobals(vmparticletheme_t *theme)
 void VM_CL_ParticleThemeFromGlobals(vmparticletheme_t *theme)
 {
        theme->typeindex = (unsigned short)*vmpartspawner.particle_type;
-       theme->blendmode = (pblend_t)*vmpartspawner.particle_blendmode;
-       theme->orientation = (porientation_t)*vmpartspawner.particle_orientation;
+       theme->blendmode = (pblend_t)(int)*vmpartspawner.particle_blendmode;
+       theme->orientation = (porientation_t)(int)*vmpartspawner.particle_orientation;
        theme->color1 = ((int)vmpartspawner.particle_color1[0] << 16) + ((int)vmpartspawner.particle_color1[1] << 8) + ((int)vmpartspawner.particle_color1[2]);
        theme->color2 = ((int)vmpartspawner.particle_color2[0] << 16) + ((int)vmpartspawner.particle_color2[1] << 8) + ((int)vmpartspawner.particle_color2[2]);
        theme->tex = (int)*vmpartspawner.particle_tex;
@@ -2658,7 +2785,7 @@ void VM_CL_SpawnParticle (void)
        
        if (prog->argc < 3) // global-set particle
        {
-               part = CL_NewParticle(org, (unsigned short)*vmpartspawner.particle_type, ((int)(vmpartspawner.particle_color1[0]) << 16) + ((int)(vmpartspawner.particle_color1[1]) << 8) + ((int)(vmpartspawner.particle_color1[2])), ((int)vmpartspawner.particle_color2[0] << 16) + ((int)vmpartspawner.particle_color2[1] << 8) + ((int)vmpartspawner.particle_color2[2]), (int)*vmpartspawner.particle_tex, *vmpartspawner.particle_size, *vmpartspawner.particle_sizeincrease, *vmpartspawner.particle_alpha*256, *vmpartspawner.particle_alphafade*256, *vmpartspawner.particle_gravity, *vmpartspawner.particle_bounce, org[0], org[1], org[2], dir[0], dir[1], dir[2], *vmpartspawner.particle_airfriction, *vmpartspawner.particle_liquidfriction, *vmpartspawner.particle_originjitter, *vmpartspawner.particle_velocityjitter, (*vmpartspawner.particle_qualityreduction) ? true : false, *vmpartspawner.particle_time, *vmpartspawner.particle_stretch, (pblend_t)*vmpartspawner.particle_blendmode, (porientation_t)*vmpartspawner.particle_orientation, (int)(vmpartspawner.particle_staincolor1[0])*65536 + (int)(vmpartspawner.particle_staincolor1[1])*256 + (int)(vmpartspawner.particle_staincolor1[2]), (int)(vmpartspawner.particle_staincolor2[0])*65536 + (int)(vmpartspawner.particle_staincolor2[1])*256 + (int)(vmpartspawner.particle_staincolor2[2]), (int)*vmpartspawner.particle_staintex, *vmpartspawner.particle_stainalpha*256, *vmpartspawner.particle_stainsize, *vmpartspawner.particle_angle, *vmpartspawner.particle_spin);
+               part = CL_NewParticle(org, (unsigned short)*vmpartspawner.particle_type, ((int)(vmpartspawner.particle_color1[0]) << 16) + ((int)(vmpartspawner.particle_color1[1]) << 8) + ((int)(vmpartspawner.particle_color1[2])), ((int)vmpartspawner.particle_color2[0] << 16) + ((int)vmpartspawner.particle_color2[1] << 8) + ((int)vmpartspawner.particle_color2[2]), (int)*vmpartspawner.particle_tex, *vmpartspawner.particle_size, *vmpartspawner.particle_sizeincrease, *vmpartspawner.particle_alpha*256, *vmpartspawner.particle_alphafade*256, *vmpartspawner.particle_gravity, *vmpartspawner.particle_bounce, org[0], org[1], org[2], dir[0], dir[1], dir[2], *vmpartspawner.particle_airfriction, *vmpartspawner.particle_liquidfriction, *vmpartspawner.particle_originjitter, *vmpartspawner.particle_velocityjitter, (*vmpartspawner.particle_qualityreduction) ? true : false, *vmpartspawner.particle_time, *vmpartspawner.particle_stretch, (pblend_t)(int)*vmpartspawner.particle_blendmode, (porientation_t)(int)*vmpartspawner.particle_orientation, (int)(vmpartspawner.particle_staincolor1[0])*65536 + (int)(vmpartspawner.particle_staincolor1[1])*256 + (int)(vmpartspawner.particle_staincolor1[2]), (int)(vmpartspawner.particle_staincolor2[0])*65536 + (int)(vmpartspawner.particle_staincolor2[1])*256 + (int)(vmpartspawner.particle_staincolor2[2]), (int)*vmpartspawner.particle_staintex, *vmpartspawner.particle_stainalpha*256, *vmpartspawner.particle_stainsize, *vmpartspawner.particle_angle, *vmpartspawner.particle_spin, NULL);
                if (!part)
                {
                        PRVM_G_FLOAT(OFS_RETURN) = 0; 
@@ -2679,7 +2806,7 @@ void VM_CL_SpawnParticle (void)
                        return;
                }
                theme = &vmpartspawner.themes[themenum];
-               part = CL_NewParticle(org, theme->typeindex, theme->color1, theme->color2, theme->tex, theme->size, theme->sizeincrease, theme->alpha, theme->alphafade, theme->gravity, theme->bounce, org[0], org[1], org[2], dir[0], dir[1], dir[2], theme->airfriction, theme->liquidfriction, theme->originjitter, theme->velocityjitter, theme->qualityreduction, theme->lifetime, theme->stretch, theme->blendmode, theme->orientation, theme->staincolor1, theme->staincolor2, theme->staintex, theme->stainalpha, theme->stainsize, theme->angle, theme->spin);
+               part = CL_NewParticle(org, theme->typeindex, theme->color1, theme->color2, theme->tex, theme->size, theme->sizeincrease, theme->alpha, theme->alphafade, theme->gravity, theme->bounce, org[0], org[1], org[2], dir[0], dir[1], dir[2], theme->airfriction, theme->liquidfriction, theme->originjitter, theme->velocityjitter, theme->qualityreduction, theme->lifetime, theme->stretch, theme->blendmode, theme->orientation, theme->staincolor1, theme->staincolor2, theme->staintex, theme->stainalpha, theme->stainsize, theme->angle, theme->spin, NULL);
                if (!part)
                {
                        PRVM_G_FLOAT(OFS_RETURN) = 0; 
@@ -2712,7 +2839,7 @@ void VM_CL_SpawnParticleDelayed (void)
        org = PRVM_G_VECTOR(OFS_PARM0);
        dir = PRVM_G_VECTOR(OFS_PARM1);
        if (prog->argc < 5) // global-set particle
-               part = CL_NewParticle(org, (unsigned short)*vmpartspawner.particle_type, ((int)vmpartspawner.particle_color1[0] << 16) + ((int)vmpartspawner.particle_color1[1] << 8) + ((int)vmpartspawner.particle_color1[2]), ((int)vmpartspawner.particle_color2[0] << 16) + ((int)vmpartspawner.particle_color2[1] << 8) + ((int)vmpartspawner.particle_color2[2]), (int)*vmpartspawner.particle_tex, *vmpartspawner.particle_size, *vmpartspawner.particle_sizeincrease, *vmpartspawner.particle_alpha*256, *vmpartspawner.particle_alphafade*256, *vmpartspawner.particle_gravity, *vmpartspawner.particle_bounce, org[0], org[1], org[2], dir[0], dir[1], dir[2], *vmpartspawner.particle_airfriction, *vmpartspawner.particle_liquidfriction, *vmpartspawner.particle_originjitter, *vmpartspawner.particle_velocityjitter, (*vmpartspawner.particle_qualityreduction) ? true : false, *vmpartspawner.particle_time, *vmpartspawner.particle_stretch, (pblend_t)*vmpartspawner.particle_blendmode, (porientation_t)*vmpartspawner.particle_orientation, ((int)vmpartspawner.particle_staincolor1[0] << 16) + ((int)vmpartspawner.particle_staincolor1[1] << 8) + ((int)vmpartspawner.particle_staincolor1[2]), ((int)vmpartspawner.particle_staincolor2[0] << 16) + ((int)vmpartspawner.particle_staincolor2[1] << 8) + ((int)vmpartspawner.particle_staincolor2[2]), (int)*vmpartspawner.particle_staintex, *vmpartspawner.particle_stainalpha*256, *vmpartspawner.particle_stainsize, *vmpartspawner.particle_angle, *vmpartspawner.particle_spin);
+               part = CL_NewParticle(org, (unsigned short)*vmpartspawner.particle_type, ((int)vmpartspawner.particle_color1[0] << 16) + ((int)vmpartspawner.particle_color1[1] << 8) + ((int)vmpartspawner.particle_color1[2]), ((int)vmpartspawner.particle_color2[0] << 16) + ((int)vmpartspawner.particle_color2[1] << 8) + ((int)vmpartspawner.particle_color2[2]), (int)*vmpartspawner.particle_tex, *vmpartspawner.particle_size, *vmpartspawner.particle_sizeincrease, *vmpartspawner.particle_alpha*256, *vmpartspawner.particle_alphafade*256, *vmpartspawner.particle_gravity, *vmpartspawner.particle_bounce, org[0], org[1], org[2], dir[0], dir[1], dir[2], *vmpartspawner.particle_airfriction, *vmpartspawner.particle_liquidfriction, *vmpartspawner.particle_originjitter, *vmpartspawner.particle_velocityjitter, (*vmpartspawner.particle_qualityreduction) ? true : false, *vmpartspawner.particle_time, *vmpartspawner.particle_stretch, (pblend_t)(int)*vmpartspawner.particle_blendmode, (porientation_t)(int)*vmpartspawner.particle_orientation, ((int)vmpartspawner.particle_staincolor1[0] << 16) + ((int)vmpartspawner.particle_staincolor1[1] << 8) + ((int)vmpartspawner.particle_staincolor1[2]), ((int)vmpartspawner.particle_staincolor2[0] << 16) + ((int)vmpartspawner.particle_staincolor2[1] << 8) + ((int)vmpartspawner.particle_staincolor2[2]), (int)*vmpartspawner.particle_staintex, *vmpartspawner.particle_stainalpha*256, *vmpartspawner.particle_stainsize, *vmpartspawner.particle_angle, *vmpartspawner.particle_spin, NULL);
        else // themed particle
        {
                themenum = (int)PRVM_G_FLOAT(OFS_PARM4);
@@ -2723,7 +2850,7 @@ void VM_CL_SpawnParticleDelayed (void)
                        return;
                }
                theme = &vmpartspawner.themes[themenum];
-               part = CL_NewParticle(org, theme->typeindex, theme->color1, theme->color2, theme->tex, theme->size, theme->sizeincrease, theme->alpha, theme->alphafade, theme->gravity, theme->bounce, org[0], org[1], org[2], dir[0], dir[1], dir[2], theme->airfriction, theme->liquidfriction, theme->originjitter, theme->velocityjitter, theme->qualityreduction, theme->lifetime, theme->stretch, theme->blendmode, theme->orientation, theme->staincolor1, theme->staincolor2, theme->staintex, theme->stainalpha, theme->stainsize, theme->angle, theme->spin);
+               part = CL_NewParticle(org, theme->typeindex, theme->color1, theme->color2, theme->tex, theme->size, theme->sizeincrease, theme->alpha, theme->alphafade, theme->gravity, theme->bounce, org[0], org[1], org[2], dir[0], dir[1], dir[2], theme->airfriction, theme->liquidfriction, theme->originjitter, theme->velocityjitter, theme->qualityreduction, theme->lifetime, theme->stretch, theme->blendmode, theme->orientation, theme->staincolor1, theme->staincolor2, theme->staintex, theme->stainalpha, theme->stainsize, theme->angle, theme->spin, NULL);
        }
        if (!part) 
        { 
@@ -2936,9 +3063,7 @@ static void VM_DrawPolygonCallback (const entity_render_t *ent, const rtlight_t
        R_Mesh_ResetTextureState();
        R_EntityMatrix(&identitymatrix);
        GL_CullFace(GL_NONE);
-       R_Mesh_VertexPointer(polys->data_vertex3f, 0, 0);
-       R_Mesh_ColorPointer(polys->data_color4f, 0, 0);
-       R_Mesh_TexCoordPointer(0, 2, polys->data_texcoord2f, 0, 0);
+       R_Mesh_PrepareVertices_Generic_Arrays(polys->num_vertices, polys->data_vertex3f, polys->data_color4f, polys->data_texcoord2f);
 
        for (surfacelistindex = 0;surfacelistindex < numsurfaces;)
        {
@@ -2966,7 +3091,7 @@ static void VM_DrawPolygonCallback (const entity_render_t *ent, const rtlight_t
                        VectorCopy(polys->data_triangles[surfacelist[surfacelistindex]].elements, polys->data_sortedelement3s + 3*numtriangles);
                        numtriangles++;
                }
-               R_Mesh_Draw(0, polys->num_vertices, 0, numtriangles, NULL, polys->data_sortedelement3s, 0, 0);
+               R_Mesh_Draw(0, polys->num_vertices, 0, numtriangles, NULL, NULL, 0, polys->data_sortedelement3s, NULL, 0);
        }
 }
 
@@ -3552,7 +3677,7 @@ static void VM_CL_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);
@@ -3653,7 +3778,7 @@ static void VM_CL_skel_find_bone(void)
        PRVM_G_FLOAT(OFS_RETURN) = 0;
        if (skeletonindex < 0 || skeletonindex >= MAX_EDICTS || !(skeleton = prog->skeletons[skeletonindex]))
                return;
-       PRVM_G_FLOAT(OFS_RETURN) = Mod_Alias_GetTagIndexForName(skeleton->model, 0, tagname) + 1;
+       PRVM_G_FLOAT(OFS_RETURN) = Mod_Alias_GetTagIndexForName(skeleton->model, 0, tagname);
 }
 
 // #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)
@@ -4200,7 +4325,7 @@ VM_centerprint,                                   // #338 void(string s, ...) centerprint (EXT_CSQC)
 VM_print,                                              // #339 void(string s, ...) print (EXT_CSQC, DP_SV_PRINT)
 VM_keynumtostring,                             // #340 string(float keynum) keynumtostring (EXT_CSQC)
 VM_stringtokeynum,                             // #341 float(string keyname) stringtokeynum (EXT_CSQC)
-VM_CL_getkeybind,                              // #342 string(float keynum) getkeybind (EXT_CSQC)
+VM_getkeybind,                                 // #342 string(float keynum[, float bindmap]) getkeybind (EXT_CSQC)
 VM_CL_setcursormode,                   // #343 void(float usecursor) setcursormode (EXT_CSQC)
 VM_CL_getmousepos,                             // #344 vector() getmousepos (EXT_CSQC)
 VM_CL_getinputstate,                   // #345 float(float framenum) getinputstate (EXT_CSQC)
@@ -4213,9 +4338,9 @@ VM_CL_setlistener,                                // #351 void(vector origin, vector forward, vector right,
 VM_CL_registercmd,                             // #352 void(string cmdname) registercommand (EXT_CSQC)
 VM_wasfreed,                                   // #353 float(entity ent) wasfreed (EXT_CSQC) (should be availabe on server too)
 VM_CL_serverkey,                               // #354 string(string key) serverkey (EXT_CSQC)
-NULL,                                                  // #355
-NULL,                                                  // #356
-NULL,                                                  // #357
+VM_CL_videoplaying,                            // #355
+VM_findfont,                                   // #356 float(string fontname) loadfont (DP_GFX_FONTS)
+VM_loadfont,                                   // #357 float(string fontname, string fontmaps, string sizes, float slot) loadfont (DP_GFX_FONTS)
 NULL,                                                  // #358
 NULL,                                                  // #359
 VM_CL_ReadByte,                                        // #360 float() readbyte (EXT_CSQC)
@@ -4361,7 +4486,7 @@ VM_entityfieldtype,                               // #498 float(float fieldnum) entityfieldtype = #498; (DP
 VM_getentityfieldstring,               // #499 string(float fieldnum, entity ent) getentityfieldstring = #499; (DP_QC_ENTITYDATA)
 VM_putentityfieldstring,               // #500 float(float fieldnum, entity ent, string s) putentityfieldstring = #500; (DP_QC_ENTITYDATA)
 VM_CL_ReadPicture,                             // #501 string() ReadPicture = #501;
-NULL,                                                  // #502
+VM_CL_boxparticles,                            // #502 void(float effectnum, entity own, vector origin_from, vector origin_to, vector dir_from, vector dir_to, float count) boxparticles (DP_CSQC_BOXPARTICLES)
 VM_whichpack,                                  // #503 string(string) whichpack = #503;
 VM_CL_GetEntity,                               // #504 float(float entitynum, float fldnum) getentity = #504; vector(float entitynum, float fldnum) getentityvec = #504;
 NULL,                                                  // #505
@@ -4380,7 +4505,7 @@ VM_buf_cvarlist,                                          // #517 void(float buf, string prefix, string antiprefix)
 VM_cvar_description,                                   // #518 float(string name) cvar_description = #518; (DP_QC_CVAR_DESCRIPTION)
 VM_gettime,                                            // #519 float(float timer) gettime = #519; (DP_QC_GETTIME)
 VM_keynumtostring,                             // #520 string keynumtostring(float keynum)
-VM_findkeysforcommand,                 // #521 string findkeysforcommand(string command)
+VM_findkeysforcommand,                 // #521 string findkeysforcommand(string command[, float bindmap])
 VM_CL_InitParticleSpawner,             // #522 void(float max_themes) initparticlespawner (DP_CSQC_SPAWNPARTICLE)
 VM_CL_ResetParticle,                   // #523 void() resetparticle (DP_CSQC_SPAWNPARTICLE)
 VM_CL_ParticleTheme,                   // #524 void(float theme) particletheme (DP_CSQC_SPAWNPARTICLE)
@@ -4392,8 +4517,8 @@ VM_loadfromdata,                          // #529
 VM_loadfromfile,                               // #530
 VM_CL_setpause,                                        // #531 float(float ispaused) setpause = #531 (DP_CSQC_SETPAUSE)
 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
@@ -4469,7 +4594,7 @@ VM_writetofile,                                   // #606
 VM_isfunction,                                 // #607
 NULL,                                                  // #608
 NULL,                                                  // #609
-NULL,                                                  // #610
+VM_findkeysforcommand,                 // #610 string findkeysforcommand(string command[, float bindmap])
 NULL,                                                  // #611
 NULL,                                                  // #612
 VM_parseentitydata,                            // #613
@@ -4489,7 +4614,10 @@ 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
+VM_setkeybind,                                         // #630 float(float key, string bind[, float bindmap]) setkeybind
+VM_getbindmaps,                                                // #631 vector(void) getbindmap
+VM_setbindmaps,                                                // #632 float(vector bm) setbindmap
+NULL,                                                  // #633
 };
 
 const int vm_cl_numbuiltins = sizeof(vm_cl_builtins) / sizeof(prvm_builtin_t);