]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - prvm_cmds.c
added sv_waterfriction, sv_airaccelerate, sv_wateraccelerate cvars (and corresponding...
[xonotic/darkplaces.git] / prvm_cmds.c
index aadcabc8c18a9846faf0eb9c657d0dfe1d92ad74..8533991a62ac01d2c343093174a72f30824258d0 100644 (file)
@@ -116,14 +116,14 @@ void VM_error (void)
        char string[VM_STRINGTEMP_LENGTH];
 
        VM_VarString(0, string, sizeof(string));
-       Con_Printf("======%S ERROR in %s:\n%s\n", PRVM_NAME, PRVM_GetString(prog->xfunction->s_name), string);
+       Con_Printf("======%s ERROR in %s:\n%s\n", PRVM_NAME, PRVM_GetString(prog->xfunction->s_name), string);
        if(prog->self)
        {
                ed = PRVM_G_EDICT(prog->self->ofs);
                PRVM_ED_Print(ed);
        }
 
-       PRVM_ERROR ("%s: Program error", PRVM_NAME);
+       PRVM_ERROR ("%s: Program error in function %s:\n%s\n", PRVM_NAME, PRVM_GetString(prog->xfunction->s_name), string);
 }
 
 /*
@@ -142,7 +142,7 @@ void VM_objerror (void)
        char string[VM_STRINGTEMP_LENGTH];
 
        VM_VarString(0, string, sizeof(string));
-       Con_Printf("======%s OBJECT ERROR in %s:\n%s\n", PRVM_NAME, PRVM_GetString(prog->xfunction->s_name), string);
+       Con_Printf("======OBJECT ERROR======\n", PRVM_NAME, PRVM_GetString(prog->xfunction->s_name), string);
        if(prog->self)
        {
                ed = PRVM_G_EDICT (prog->self->ofs);
@@ -153,6 +153,7 @@ void VM_objerror (void)
        else
                // objerror has to display the object fields -> else call
                PRVM_ERROR ("VM_objecterror: self not defined !");
+       Con_Printf("%s OBJECT ERROR in %s:\n%s\n", PRVM_NAME, PRVM_GetString(prog->xfunction->s_name), string);
 }
 
 /*
@@ -211,7 +212,7 @@ void VM_sprint (void)
        char string[VM_STRINGTEMP_LENGTH];
 
        //find client for this entity
-       clientnum = PRVM_G_FLOAT(OFS_PARM0);
+       clientnum = (int)PRVM_G_FLOAT(OFS_PARM0);
        if (!sv.active  || clientnum < 0 || clientnum >= svs.maxclients || !svs.clients[clientnum].active)
        {
                Con_Printf("VM_sprint: %s: invalid client or server is not active !\n", PRVM_NAME);
@@ -219,9 +220,12 @@ void VM_sprint (void)
        }
 
        client = svs.clients + clientnum;
+       if (!client->netconnection)
+               return;
+
        VM_VarString(1, string, sizeof(string));
-       MSG_WriteChar(&client->message,svc_print);
-       MSG_WriteString(&client->message, string);
+       MSG_WriteChar(&client->netconnection->message,svc_print);
+       MSG_WriteString(&client->netconnection->message, string);
 }
 
 /*
@@ -706,7 +710,7 @@ void VM_ftoi(void)
        int ent;
        VM_SAFEPARMCOUNT(1, VM_ftoi);
 
-       ent = PRVM_G_FLOAT(OFS_PARM0);
+       ent = (int)PRVM_G_FLOAT(OFS_PARM0);
        if(PRVM_PROG_TO_EDICT(ent)->priv.required->free)
                PRVM_ERROR ("VM_ftoe: %s tried to access a freed entity (entity %i)!", PRVM_NAME, ent);
 
@@ -779,12 +783,11 @@ void VM_find (void)
        f = PRVM_G_INT(OFS_PARM1);
        s = PRVM_G_STRING(OFS_PARM2);
 
-       if (!s || !s[0])
-       {
-               // return reserved edict 0 (could be used for whatever the prog wants)
-               VM_RETURN_EDICT(prog->edicts);
-               return;
-       }
+       // LordHavoc: apparently BloodMage does a find(world, weaponmodel, "") and
+       // expects it to find all the monsters, so we must be careful to support
+       // searching for ""
+       if (!s)
+               s = "";
 
        for (e++ ; e < prog->num_edicts ; e++)
        {
@@ -794,7 +797,7 @@ void VM_find (void)
                        continue;
                t = PRVM_E_STRING(ed,f);
                if (!t)
-                       continue;
+                       t = "";
                if (!strcmp(t,s))
                {
                        VM_RETURN_EDICT(ed);
@@ -872,11 +875,12 @@ void VM_findchain (void)
 
        f = PRVM_G_INT(OFS_PARM0);
        s = PRVM_G_STRING(OFS_PARM1);
-       if (!s || !s[0])
-       {
-               VM_RETURN_EDICT(prog->edicts);
-               return;
-       }
+
+       // LordHavoc: apparently BloodMage does a find(world, weaponmodel, "") and
+       // expects it to find all the monsters, so we must be careful to support
+       // searching for ""
+       if (!s)
+               s = "";
 
        ent = PRVM_NEXT_EDICT(prog->edicts);
        for (i = 1;i < prog->num_edicts;i++, ent = PRVM_NEXT_EDICT(ent))
@@ -886,7 +890,7 @@ void VM_findchain (void)
                        continue;
                t = PRVM_E_STRING(ent,f);
                if (!t)
-                       continue;
+                       t = "";
                if (strcmp(t,s))
                        continue;
 
@@ -971,6 +975,8 @@ void VM_findflags (void)
                ed = PRVM_EDICT_NUM(e);
                if (ed->priv.required->free)
                        continue;
+               if (!PRVM_E_FLOAT(ed,f))
+                       continue;
                if ((int)PRVM_E_FLOAT(ed,f) & s)
                {
                        VM_RETURN_EDICT(ed);
@@ -1015,6 +1021,8 @@ void VM_findchainflags (void)
                prog->xfunction->builtinsprofile++;
                if (ent->priv.required->free)
                        continue;
+               if (!PRVM_E_FLOAT(ent,f))
+                       continue;
                if (!((int)PRVM_E_FLOAT(ent,f) & s))
                        continue;
 
@@ -1316,7 +1324,7 @@ void VM_registercvar (void)
 
        name = PRVM_G_STRING(OFS_PARM0);
        value = PRVM_G_STRING(OFS_PARM1);
-       flags = PRVM_G_FLOAT(OFS_PARM2);
+       flags = (int)PRVM_G_FLOAT(OFS_PARM2);
        PRVM_G_FLOAT(OFS_RETURN) = 0;
 
        if(flags > CVAR_MAXFLAGSVAL)
@@ -1534,7 +1542,7 @@ void VM_fopen(void)
                PRVM_G_FLOAT(OFS_RETURN) = -2;
                return;
        }
-       mode = PRVM_G_FLOAT(OFS_PARM1);
+       mode = (int)PRVM_G_FLOAT(OFS_PARM1);
        switch(mode)
        {
        case 0: // FILE_READ
@@ -1559,13 +1567,13 @@ void VM_fopen(void)
 
        if (VM_FILES[filenum] == NULL)
        {
-               if (developer.integer)
+               if (developer.integer >= 10)
                        Con_Printf("VM_fopen: %s: %s mode %s failed\n", PRVM_NAME, filename, modestring);
                PRVM_G_FLOAT(OFS_RETURN) = -1;
        }
        else
        {
-               if (developer.integer)
+               if (developer.integer >= 10)
                        Con_Printf("VM_fopen: %s: %s mode %s opened as #%i\n", PRVM_NAME, filename, modestring, filenum);
                PRVM_G_FLOAT(OFS_RETURN) = filenum;
        }
@@ -1585,7 +1593,7 @@ void VM_fclose(void)
 
        VM_SAFEPARMCOUNT(1,VM_fclose);
 
-       filenum = PRVM_G_FLOAT(OFS_PARM0);
+       filenum = (int)PRVM_G_FLOAT(OFS_PARM0);
        if (filenum < 0 || filenum >= MAX_VMFILES)
        {
                Con_Printf("VM_fclose: invalid file handle %i used in %s\n", filenum, PRVM_NAME);
@@ -1596,7 +1604,7 @@ void VM_fclose(void)
                Con_Printf("VM_fclose: no such file handle %i (or file has been closed) in %s\n", filenum, PRVM_NAME);
                return;
        }
-       if (developer.integer)
+       if (developer.integer >= 10)
                Con_Printf("VM_fclose: %s: #%i closed\n", PRVM_NAME, filenum);
        FS_Close(VM_FILES[filenum]);
        VM_FILES[filenum] = NULL;
@@ -1618,7 +1626,7 @@ void VM_fgets(void)
 
        VM_SAFEPARMCOUNT(1,VM_fgets);
 
-       filenum = PRVM_G_FLOAT(OFS_PARM0);
+       filenum = (int)PRVM_G_FLOAT(OFS_PARM0);
        if (filenum < 0 || filenum >= MAX_VMFILES)
        {
                Con_Printf("VM_fgets: invalid file handle %i used in %s\n", filenum, PRVM_NAME);
@@ -1646,7 +1654,7 @@ void VM_fgets(void)
                if (c != '\n')
                        FS_UnGetc(VM_FILES[filenum], (unsigned char)c);
        }
-       if (developer.integer >= 3)
+       if (developer.integer >= 100)
                Con_Printf("fgets: %s: %s\n", PRVM_NAME, string);
        if (c >= 0 || end)
                PRVM_G_INT(OFS_RETURN) = PRVM_SetEngineString(string);
@@ -1670,7 +1678,7 @@ void VM_fputs(void)
 
        VM_SAFEPARMCOUNT(2,VM_fputs);
 
-       filenum = PRVM_G_FLOAT(OFS_PARM0);
+       filenum = (int)PRVM_G_FLOAT(OFS_PARM0);
        if (filenum < 0 || filenum >= MAX_VMFILES)
        {
                Con_Printf("VM_fputs: invalid file handle %i used in %s\n", filenum, PRVM_NAME);
@@ -1684,7 +1692,7 @@ void VM_fputs(void)
        VM_VarString(1, string, sizeof(string));
        if ((stringlength = (int)strlen(string)))
                FS_Write(VM_FILES[filenum], string, stringlength);
-       if (developer.integer)
+       if (developer.integer >= 100)
                Con_Printf("fputs: %s: %s\n", PRVM_NAME, string);
 }
 
@@ -1750,8 +1758,8 @@ void VM_substring(void)
 
        string = VM_GetTempString();
        s = PRVM_G_STRING(OFS_PARM0);
-       start = PRVM_G_FLOAT(OFS_PARM1);
-       length = PRVM_G_FLOAT(OFS_PARM2);
+       start = (int)PRVM_G_FLOAT(OFS_PARM1);
+       length = (int)PRVM_G_FLOAT(OFS_PARM2);
        if (!s)
                s = "";
        for (i = 0;i < start && *s;i++, s++);
@@ -1829,7 +1837,7 @@ void VM_clcommand (void)
 
        VM_SAFEPARMCOUNT(2,VM_clcommand);
 
-       i = PRVM_G_FLOAT(OFS_PARM0);
+       i = (int)PRVM_G_FLOAT(OFS_PARM0);
        if (!sv.active  || i < 0 || i >= svs.maxclients || !svs.clients[i].active)
        {
                Con_Printf("VM_clientcommand: %s: invalid client/server is not active !\n", PRVM_NAME);
@@ -1888,7 +1896,7 @@ void VM_argv (void)
 
        VM_SAFEPARMCOUNT(1,VM_argv);
 
-       token_num = PRVM_G_FLOAT(OFS_PARM0);
+       token_num = (int)PRVM_G_FLOAT(OFS_PARM0);
 
        if (token_num >= 0 && token_num < num_tokens)
                PRVM_G_INT(OFS_RETURN) = PRVM_SetEngineString(tokens[token_num]);
@@ -2171,8 +2179,8 @@ void VM_search_begin(void)
 
        VM_CheckEmptyString(pattern);
 
-       caseinsens = PRVM_G_FLOAT(OFS_PARM1);
-       quiet = PRVM_G_FLOAT(OFS_PARM2);
+       caseinsens = (int)PRVM_G_FLOAT(OFS_PARM1);
+       quiet = (int)PRVM_G_FLOAT(OFS_PARM2);
 
        for(handle = 0; handle < MAX_VMSEARCHES; handle++)
                if(!VM_SEARCHLIST[handle])
@@ -2203,7 +2211,7 @@ void VM_search_end(void)
        int handle;
        VM_SAFEPARMCOUNT(1, VM_search_end);
 
-       handle = PRVM_G_FLOAT(OFS_PARM0);
+       handle = (int)PRVM_G_FLOAT(OFS_PARM0);
 
        if(handle < 0 || handle >= MAX_VMSEARCHES)
        {
@@ -2232,7 +2240,7 @@ void VM_search_getsize(void)
        int handle;
        VM_SAFEPARMCOUNT(1, VM_M_search_getsize);
 
-       handle = PRVM_G_FLOAT(OFS_PARM0);
+       handle = (int)PRVM_G_FLOAT(OFS_PARM0);
 
        if(handle < 0 || handle >= MAX_VMSEARCHES)
        {
@@ -2261,8 +2269,8 @@ void VM_search_getfilename(void)
        char *tmp;
        VM_SAFEPARMCOUNT(2, VM_search_getfilename);
 
-       handle = PRVM_G_FLOAT(OFS_PARM0);
-       filenum = PRVM_G_FLOAT(OFS_PARM1);
+       handle = (int)PRVM_G_FLOAT(OFS_PARM0);
+       filenum = (int)PRVM_G_FLOAT(OFS_PARM1);
 
        if(handle < 0 || handle >= MAX_VMSEARCHES)
        {
@@ -2478,27 +2486,27 @@ float   drawpic(vector position, string pic, vector size, vector rgb, float alpha,
 */
 void VM_drawpic(void)
 {
-       const char *pic;
+       const char *picname;
        float *size, *pos, *rgb;
        int flag;
 
        VM_SAFEPARMCOUNT(6,VM_drawpic);
 
-       pic = PRVM_G_STRING(OFS_PARM1);
+       picname = PRVM_G_STRING(OFS_PARM1);
 
-       if(!pic)
+       if(!picname)
        {
                Con_Printf("VM_drawpic: %s passed null picture name !\n", PRVM_NAME);
                PRVM_G_FLOAT(OFS_RETURN) = -1;
                return;
        }
 
-       VM_CheckEmptyString (pic);
+       VM_CheckEmptyString (picname);
 
        // is pic cached ? no function yet for that
        if(!1)
        {
-               Con_Printf("VM_drawpic: %s: %s not cached !\n", PRVM_NAME, pic);
+               Con_Printf("VM_drawpic: %s: %s not cached !\n", PRVM_NAME, picname);
                PRVM_G_FLOAT(OFS_RETURN) = -4;
                return;
        }
@@ -2518,7 +2526,7 @@ void VM_drawpic(void)
        if(pos[2] || size[2])
                Con_Printf("VM_drawstring: z value%c from %s discarded\n",(pos[2] && size[2]) ? 's' : 0,((pos[2] && size[2]) ? "pos and size" : (pos[2] ? "pos" : "size")));
 
-       DrawQ_Pic(pos[0], pos[1], pic, size[0], size[1], rgb[0], rgb[1], rgb[2], PRVM_G_FLOAT(OFS_PARM4), flag);
+       DrawQ_Pic(pos[0], pos[1], Draw_CachePic(picname, true), size[0], size[1], rgb[0], rgb[1], rgb[2], PRVM_G_FLOAT(OFS_PARM4), flag);
        PRVM_G_FLOAT(OFS_RETURN) = 1;
 }
 
@@ -2552,7 +2560,7 @@ void VM_drawfill(void)
        if(pos[2] || size[2])
                Con_Printf("VM_drawstring: z value%c from %s discarded\n",(pos[2] && size[2]) ? 's' : 0,((pos[2] && size[2]) ? "pos and size" : (pos[2] ? "pos" : "size")));
 
-       DrawQ_Pic(pos[0], pos[1], 0, size[0], size[1], rgb[0], rgb[1], rgb[2], PRVM_G_FLOAT(OFS_PARM3), flag);
+       DrawQ_Pic(pos[0], pos[1], NULL, size[0], size[1], rgb[0], rgb[1], rgb[2], PRVM_G_FLOAT(OFS_PARM3), flag);
        PRVM_G_FLOAT(OFS_RETURN) = 1;
 }
 
@@ -2631,7 +2639,7 @@ void VM_keynumtostring (void)
        char *tmp;
        VM_SAFEPARMCOUNT(1, VM_keynumtostring);
 
-       keynum = PRVM_G_FLOAT(OFS_PARM0);
+       keynum = (int)PRVM_G_FLOAT(OFS_PARM0);
 
        tmp = VM_GetTempString();
 
@@ -2701,7 +2709,7 @@ void VM_cin_close( void )
        name = PRVM_G_STRING( OFS_PARM0 );
        VM_CheckEmptyString( name );
 
-       CL_CloseVideo( CL_GetVideo( name ) );
+       CL_CloseVideo( CL_GetVideoByName( name ) );
 }
 
 /*
@@ -2723,7 +2731,7 @@ void VM_cin_setstate( void )
 
        state = (clvideostate_t)((int)PRVM_G_FLOAT( OFS_PARM1 ));
 
-       video = CL_GetVideo( name );
+       video = CL_GetVideoByName( name );
        if( video && state > CLVIDEO_UNUSED && state < CLVIDEO_STATECOUNT )
                CL_SetVideoState( video, state );
 }
@@ -2745,7 +2753,7 @@ void VM_cin_getstate( void )
        name = PRVM_G_STRING( OFS_PARM0 );
        VM_CheckEmptyString( name );
 
-       video = CL_GetVideo( name );
+       video = CL_GetVideoByName( name );
        if( video )
                PRVM_G_FLOAT( OFS_RETURN ) = (int)video->state;
        else
@@ -2769,7 +2777,7 @@ void VM_cin_restart( void )
        name = PRVM_G_STRING( OFS_PARM0 );
        VM_CheckEmptyString( name );
 
-       video = CL_GetVideo( name );
+       video = CL_GetVideoByName( name );
        if( video )
                CL_RestartVideo( video );
 }
@@ -2807,7 +2815,7 @@ void VM_drawline (void)
        c2              = PRVM_G_VECTOR(OFS_PARM2);
        rgb             = PRVM_G_VECTOR(OFS_PARM3);
        alpha   = PRVM_G_FLOAT(OFS_PARM4);
-       flags   = PRVM_G_FLOAT(OFS_PARM5);
+       flags   = (int)PRVM_G_FLOAT(OFS_PARM5);
        DrawQ_Line(width, c1[0], c1[1], c2[0], c2[1], rgb[0], rgb[1], rgb[2], alpha, flags);
 }
 
@@ -2839,79 +2847,88 @@ static qboolean                 vm_polygonbegin = false;        //[515]: for "no-crap-on-the-screen"
 void VM_InitPolygons (void)
 {
        vm_polygons_pool = Mem_AllocPool("VMPOLY", 0, NULL);
-       vm_polygons = Mem_Alloc(vm_polygons_pool, VM_DEFPOLYNUM*sizeof(vm_polygon_t));
+       vm_polygons = (vm_polygon_t *)Mem_Alloc(vm_polygons_pool, VM_DEFPOLYNUM*sizeof(vm_polygon_t));
        memset(vm_polygons, 0, VM_DEFPOLYNUM*sizeof(vm_polygon_t));
        vm_polygons_num = VM_DEFPOLYNUM;
-       vm_polygonbegin = vm_drawpolygons_num = 0;
+       vm_drawpolygons_num = 0;
+       vm_polygonbegin = false;
        vm_polygons_initialized = true;
 }
 
-void VM_DrawPolygonCallback (const entity_render_t *ent, int surfacenumber, const rtlight_t *rtlight)
+void VM_DrawPolygonCallback (const entity_render_t *ent, const rtlight_t *rtlight, int numsurfaces, int *surfacelist)
 {
-       const vm_polygon_t      *p = &vm_polygons[surfacenumber];
-       int                                     flags = p->flags & 0x0f;
+       int surfacelistindex;
+       // LordHavoc: FIXME: this is stupid code
+       for (surfacelistindex = 0;surfacelistindex < numsurfaces;surfacelistindex++)
+       {
+               const vm_polygon_t      *p = &vm_polygons[surfacelist[surfacelistindex]];
+               int                                     flags = p->flags & 0x0f;
 
-       if(flags == DRAWFLAG_ADDITIVE)
-               GL_BlendFunc(GL_SRC_ALPHA, GL_ONE);
-       else if(flags == DRAWFLAG_MODULATE)
-               GL_BlendFunc(GL_DST_COLOR, GL_ZERO);
-       else if(flags == DRAWFLAG_2XMODULATE)
-               GL_BlendFunc(GL_DST_COLOR,GL_SRC_COLOR);
-       else
-               GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+               if(flags == DRAWFLAG_ADDITIVE)
+                       GL_BlendFunc(GL_SRC_ALPHA, GL_ONE);
+               else if(flags == DRAWFLAG_MODULATE)
+                       GL_BlendFunc(GL_DST_COLOR, GL_ZERO);
+               else if(flags == DRAWFLAG_2XMODULATE)
+                       GL_BlendFunc(GL_DST_COLOR,GL_SRC_COLOR);
+               else
+                       GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
-       R_Mesh_TexBind(0, R_GetTexture(p->tex));
+               R_Mesh_TexBind(0, R_GetTexture(p->tex));
 
-       //[515]: is speed is max ?
-       if(p->flags & VM_POLYGON_FLLINES)       //[515]: lines
-       {
-               qglLineWidth(p->data[13]);
-               qglBegin(GL_LINE_LOOP);
-                       qglTexCoord1f   (p->data[12]);
-                       qglColor4f              (p->data[20], p->data[21], p->data[22], p->data[23]);
-                       qglVertex3f             (p->data[0] , p->data[1],  p->data[2]);
+               CHECKGLERROR
+               //[515]: is speed is max ?
+               if(p->flags & VM_POLYGON_FLLINES)       //[515]: lines
+               {
+                       qglLineWidth(p->data[13]);CHECKGLERROR
+                       qglBegin(GL_LINE_LOOP);
+                               qglTexCoord1f   (p->data[12]);
+                               qglColor4f              (p->data[20], p->data[21], p->data[22], p->data[23]);
+                               qglVertex3f             (p->data[0] , p->data[1],  p->data[2]);
 
-                       qglTexCoord1f   (p->data[14]);
-                       qglColor4f              (p->data[24], p->data[25], p->data[26], p->data[27]);
-                       qglVertex3f             (p->data[3] , p->data[4],  p->data[5]);
+                               qglTexCoord1f   (p->data[14]);
+                               qglColor4f              (p->data[24], p->data[25], p->data[26], p->data[27]);
+                               qglVertex3f             (p->data[3] , p->data[4],  p->data[5]);
 
-                       if(p->flags & VM_POLYGON_FL3V)
-                       {
-                               qglTexCoord1f   (p->data[16]);
+                               if(p->flags & VM_POLYGON_FL3V)
+                               {
+                                       qglTexCoord1f   (p->data[16]);
+                                       qglColor4f              (p->data[28], p->data[29], p->data[30], p->data[31]);
+                                       qglVertex3f             (p->data[6] , p->data[7],  p->data[8]);
+
+                                       if(p->flags & VM_POLYGON_FL4V)
+                                       {
+                                               qglTexCoord1f   (p->data[18]);
+                                               qglColor4f              (p->data[32], p->data[33], p->data[34], p->data[35]);
+                                               qglVertex3f             (p->data[9] , p->data[10],  p->data[11]);
+                                       }
+                               }
+                       qglEnd();
+                       CHECKGLERROR
+               }
+               else
+               {
+                       qglBegin(GL_POLYGON);
+                               qglTexCoord2f   (p->data[12], p->data[13]);
+                               qglColor4f              (p->data[20], p->data[21], p->data[22], p->data[23]);
+                               qglVertex3f             (p->data[0] , p->data[1],  p->data[2]);
+
+                               qglTexCoord2f   (p->data[14], p->data[15]);
+                               qglColor4f              (p->data[24], p->data[25], p->data[26], p->data[27]);
+                               qglVertex3f             (p->data[3] , p->data[4],  p->data[5]);
+
+                               qglTexCoord2f   (p->data[16], p->data[17]);
                                qglColor4f              (p->data[28], p->data[29], p->data[30], p->data[31]);
                                qglVertex3f             (p->data[6] , p->data[7],  p->data[8]);
 
                                if(p->flags & VM_POLYGON_FL4V)
                                {
-                                       qglTexCoord1f   (p->data[18]);
+                                       qglTexCoord2f   (p->data[18], p->data[19]);
                                        qglColor4f              (p->data[32], p->data[33], p->data[34], p->data[35]);
                                        qglVertex3f             (p->data[9] , p->data[10],  p->data[11]);
                                }
-                       }
-               qglEnd();
-       }
-       else
-       {
-               qglBegin(GL_POLYGON);
-                       qglTexCoord2f   (p->data[12], p->data[13]);
-                       qglColor4f              (p->data[20], p->data[21], p->data[22], p->data[23]);
-                       qglVertex3f             (p->data[0] , p->data[1],  p->data[2]);
-
-                       qglTexCoord2f   (p->data[14], p->data[15]);
-                       qglColor4f              (p->data[24], p->data[25], p->data[26], p->data[27]);
-                       qglVertex3f             (p->data[3] , p->data[4],  p->data[5]);
-
-                       qglTexCoord2f   (p->data[16], p->data[17]);
-                       qglColor4f              (p->data[28], p->data[29], p->data[30], p->data[31]);
-                       qglVertex3f             (p->data[6] , p->data[7],  p->data[8]);
-
-                       if(p->flags & VM_POLYGON_FL4V)
-                       {
-                               qglTexCoord2f   (p->data[18], p->data[19]);
-                               qglColor4f              (p->data[32], p->data[33], p->data[34], p->data[35]);
-                               qglVertex3f             (p->data[9] , p->data[10],  p->data[11]);
-                       }
-               qglEnd();
+                       qglEnd();
+                       CHECKGLERROR
+               }
        }
 }
 
@@ -2958,7 +2975,7 @@ void VM_R_PolygonBegin (void)
        }
        if(vm_drawpolygons_num >= vm_polygons_num)
        {
-               p = Mem_Alloc(vm_polygons_pool, 2 * vm_polygons_num * sizeof(vm_polygon_t));
+               p = (vm_polygon_t *)Mem_Alloc(vm_polygons_pool, 2 * vm_polygons_num * sizeof(vm_polygon_t));
                memset(p, 0, 2 * vm_polygons_num * sizeof(vm_polygon_t));
                memcpy(p, vm_polygons, vm_polygons_num * sizeof(vm_polygon_t));
                Mem_Free(vm_polygons);
@@ -2968,7 +2985,7 @@ void VM_R_PolygonBegin (void)
        p = &vm_polygons[vm_drawpolygons_num];
        picname = PRVM_G_STRING(OFS_PARM0);
        if(picname[0])
-               p->tex = Draw_CachePic(picname, false)->tex;
+               p->tex = Draw_CachePic(picname, true)->tex;
        else
                p->tex = r_texture_notexture;
        p->flags = (unsigned char)PRVM_G_FLOAT(OFS_PARM1);
@@ -3058,7 +3075,7 @@ void VM_AddPolygonsToMeshQueue (void)
        if(!vm_drawpolygons_num)
                return;
        for(i = 0;i < vm_drawpolygons_num;i++)
-               R_MeshQueue_Add(VM_DrawPolygonCallback, NULL, i, NULL);
+               VM_DrawPolygonCallback(NULL, NULL, i, NULL);
        vm_drawpolygons_num = 0;
 }
 
@@ -3165,7 +3182,7 @@ void VM_altstr_get( void )
        altstr = PRVM_G_STRING( OFS_PARM0 );
        //VM_CheckEmptyString( altstr );
 
-       count = PRVM_G_FLOAT( OFS_PARM1 );
+       count = (int)PRVM_G_FLOAT( OFS_PARM1 );
        count = count * 2 + 1;
 
        for( pos = altstr ; *pos && count ; pos++ )
@@ -3215,7 +3232,7 @@ void VM_altstr_set( void )
        altstr = PRVM_G_STRING( OFS_PARM0 );
        //VM_CheckEmptyString( altstr );
 
-       num = PRVM_G_FLOAT( OFS_PARM1 );
+       num = (int)PRVM_G_FLOAT( OFS_PARM1 );
 
        str = PRVM_G_STRING( OFS_PARM2 );
        //VM_CheckEmptyString( str );
@@ -3268,7 +3285,7 @@ void VM_altstr_ins(void)
        char *out;
 
        in = instr = PRVM_G_STRING( OFS_PARM0 );
-       num = PRVM_G_FLOAT( OFS_PARM1 );
+       num = (int)PRVM_G_FLOAT( OFS_PARM1 );
        set = setstr = PRVM_G_STRING( OFS_PARM2 );
 
        out = outstr = VM_GetTempString();
@@ -3318,7 +3335,7 @@ static int BufStr_FindFreeBuffer (void)
        for(i=0;i<MAX_QCSTR_BUFFERS;i++)
                if(!qcstringbuffers[i])
                {
-                       qcstringbuffers[i] = malloc(sizeof(qcstrbuffer_t));
+                       qcstringbuffers[i] = (qcstrbuffer_t *)Z_Malloc(sizeof(qcstrbuffer_t));
                        memset(qcstringbuffers[i], 0, sizeof(qcstrbuffer_t));
                        return i;
                }
@@ -3336,10 +3353,10 @@ static void BufStr_ClearBuffer (int index)
                {
                        for(i=0;i<b->num_strings;i++)
                                if(b->strings[i])
-                                       free(b->strings[i]);
+                                       Z_Free(b->strings[i]);
                        num_qcstringbuffers--;
                }
-               free(qcstringbuffers[index]);
+               Z_Free(qcstringbuffers[index]);
                qcstringbuffers[index] = NULL;
        }
 }
@@ -3469,7 +3486,7 @@ void VM_buf_copy (void)
                Con_Printf("VM_buf_copy: invalid source buffer %i used in %s\n", (int)PRVM_G_FLOAT(OFS_PARM0), PRVM_NAME);
                return;
        }
-       i = PRVM_G_FLOAT(OFS_PARM1);
+       i = (int)PRVM_G_FLOAT(OFS_PARM1);
        if(i == (int)PRVM_G_FLOAT(OFS_PARM0))
        {
                Con_Printf("VM_buf_copy: source == destination (%i) in %s\n", i, PRVM_NAME);
@@ -3483,14 +3500,14 @@ void VM_buf_copy (void)
        }
 
        BufStr_ClearBuffer(i);
-       qcstringbuffers[i] = malloc(sizeof(qcstrbuffer_t));
+       qcstringbuffers[i] = (qcstrbuffer_t *)Z_Malloc(sizeof(qcstrbuffer_t));
        memset(qcstringbuffers[i], 0, sizeof(qcstrbuffer_t));
        b2->num_strings = b1->num_strings;
 
        for(i=0;i<b1->num_strings;i++)
                if(b1->strings[i] && b1->strings[i][0])
                {
-                       b2->strings[i] = malloc(strlen(b1->strings[i])+1);
+                       b2->strings[i] = (char *)Z_Malloc(strlen(b1->strings[i])+1);
                        if(!b2->strings[i])
                        {
                                Con_Printf("VM_buf_copy: not enough memory for buffer %i used in %s\n", (int)PRVM_G_FLOAT(OFS_PARM1), PRVM_NAME);
@@ -3525,7 +3542,7 @@ void VM_buf_sort (void)
                Con_Printf("VM_buf_sort: tried to sort empty buffer %i in %s\n", (int)PRVM_G_FLOAT(OFS_PARM0), PRVM_NAME);
                return;
        }
-       buf_sortpower = PRVM_G_FLOAT(OFS_PARM1);
+       buf_sortpower = (int)PRVM_G_FLOAT(OFS_PARM1);
        if(buf_sortpower <= 0)
                buf_sortpower = 99999999;
 
@@ -3541,7 +3558,7 @@ void VM_buf_sort (void)
                                break;
                        else
                        {
-                               free(b->strings[i]);
+                               Z_Free(b->strings[i]);
                                --b->num_strings;
                                b->strings[i] = NULL;
                        }
@@ -3562,7 +3579,8 @@ void VM_buf_implode (void)
        qcstrbuffer_t   *b;
        char                    *k;
        const char              *sep;
-       int                             i, l;
+       int                             i;
+       size_t                  l;
        VM_SAFEPARMCOUNT(2, VM_buf_implode);
 
        b = BUFSTR_BUFFER((int)PRVM_G_FLOAT(OFS_PARM0));
@@ -3646,14 +3664,14 @@ void VM_bufstr_set (void)
 
        VM_SAFEPARMCOUNT(3, VM_bufstr_set);
 
-       bufindex = PRVM_G_FLOAT(OFS_PARM0);
+       bufindex = (int)PRVM_G_FLOAT(OFS_PARM0);
        b = BUFSTR_BUFFER(bufindex);
        if(!b)
        {
                Con_Printf("VM_bufstr_set: invalid buffer %i used in %s\n", bufindex, PRVM_NAME);
                return;
        }
-       strindex = PRVM_G_FLOAT(OFS_PARM1);
+       strindex = (int)PRVM_G_FLOAT(OFS_PARM1);
        if(strindex < 0 || strindex > MAX_QCSTR_STRINGS)
        {
                Con_Printf("VM_bufstr_set: invalid string index %i used in %s\n", strindex, PRVM_NAME);
@@ -3666,8 +3684,8 @@ void VM_bufstr_set (void)
                return;
        }
        if(b->strings[strindex])
-               free(b->strings[strindex]);
-       b->strings[strindex] = malloc(strlen(news)+1);
+               Z_Free(b->strings[strindex]);
+       b->strings[strindex] = (char *)Z_Malloc(strlen(news)+1);
        strcpy(b->strings[strindex], news);
 }
 
@@ -3687,7 +3705,7 @@ void VM_bufstr_add (void)
 
        VM_SAFEPARMCOUNT(3, VM_bufstr_add);
 
-       bufindex = PRVM_G_FLOAT(OFS_PARM0);
+       bufindex = (int)PRVM_G_FLOAT(OFS_PARM0);
        b = BUFSTR_BUFFER(bufindex);
        PRVM_G_FLOAT(OFS_RETURN) = -1;
        if(!b)
@@ -3702,7 +3720,7 @@ void VM_bufstr_add (void)
                return;
        }
 
-       order = PRVM_G_FLOAT(OFS_PARM2);
+       order = (int)PRVM_G_FLOAT(OFS_PARM2);
        if(order)
                strindex = b->num_strings;
        else
@@ -3726,8 +3744,8 @@ void VM_bufstr_add (void)
                b->num_strings++;
        }
        if(b->strings[strindex])
-               free(b->strings[strindex]);
-       b->strings[strindex] = malloc(strlen(string)+1);
+               Z_Free(b->strings[strindex]);
+       b->strings[strindex] = (char *)Z_Malloc(strlen(string)+1);
        strcpy(b->strings[strindex], string);
        PRVM_G_FLOAT(OFS_RETURN) = strindex;
 }
@@ -3751,14 +3769,14 @@ void VM_bufstr_free (void)
                Con_Printf("VM_bufstr_free: invalid buffer %i used in %s\n", (int)PRVM_G_FLOAT(OFS_PARM0), PRVM_NAME);
                return;
        }
-       i = PRVM_G_FLOAT(OFS_PARM1);
+       i = (int)PRVM_G_FLOAT(OFS_PARM1);
        if(i < 0 || i > MAX_QCSTR_STRINGS)
        {
                Con_Printf("VM_bufstr_free: invalid string index %i used in %s\n", i, PRVM_NAME);
                return;
        }
        if(b->strings[i])
-               free(b->strings[i]);
+               Z_Free(b->strings[i]);
        b->strings[i] = NULL;
        if(i+1 == b->num_strings)
                --b->num_strings;