]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - csprogs.c
fix two pointer bugs in ODE code
[xonotic/darkplaces.git] / csprogs.c
index 1ee20b6017214c909f87ed829bfae821e742a7f0..18d5c642a242da18e4b4c0473b278539e2e29be5 100644 (file)
--- a/csprogs.c
+++ b/csprogs.c
@@ -5,6 +5,7 @@
 #include "cl_collision.h"
 #include "snd_main.h"
 #include "clvm_cmds.h"
+#include "prvm_cmds.h"
 
 //============================================================================
 // Client prog handling
 
 static prvm_prog_t *csqc_tmpprog;
 
+void CL_VM_PreventInformationLeaks(void)
+{
+       prvm_eval_t *val;
+       if(!cl.csqc_loaded)
+               return;
+       CSQC_BEGIN
+               VM_ClearTraceGlobals();
+               if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.trace_networkentity)))
+                       val->_float = 0;
+       CSQC_END
+}
+
 //[515]: these are required funcs
 static char *cl_required_func[] =
 {
@@ -167,6 +180,7 @@ qboolean CSQC_AddRenderEdict(prvm_edict_t *ed)
        if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.alpha)) && val->_float)           entrender->alpha = val->_float;
        if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.scale)) && val->_float)           entrender->scale = scale = val->_float;
        if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.colormod)) && VectorLength2(val->vector)) VectorCopy(val->vector, entrender->colormod);
+       if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.glowmod)) && VectorLength2(val->vector))  VectorCopy(val->vector, entrender->glowmod);
        if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.effects)) && val->_float) entrender->effects |= (int)val->_float;
        if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.tag_entity)) && val->edict)
        {
@@ -179,6 +193,10 @@ qboolean CSQC_AddRenderEdict(prvm_edict_t *ed)
        }
        else
                Matrix4x4_CreateIdentity(&tagmatrix);
+       if (!VectorLength2(entrender->colormod))
+               VectorSet(entrender->colormod, 1, 1, 1);
+       if (!VectorLength2(entrender->glowmod))
+               VectorSet(entrender->glowmod, 1, 1, 1);
 
        if (renderflags & RF_USEAXIS)
        {
@@ -226,12 +244,18 @@ qboolean CSQC_AddRenderEdict(prvm_edict_t *ed)
        // concat the matrices to make the entity relative to its tag
        Matrix4x4_Concat(&entrender->matrix, &tagmatrix, &matrix2);
 
+       // transparent offset
+       if ((renderflags & RF_USETRANSPARENTOFFSET) && (val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.transparent_offset)))
+               entrender->transparent_offset = val->_float;
+
        if(renderflags)
        {
                if(renderflags & RF_VIEWMODEL)  entrender->flags |= RENDER_VIEWMODEL;
                if(renderflags & RF_EXTERNALMODEL)entrender->flags |= RENDER_EXTERIORMODEL;
+               if(renderflags & RF_NOCULL)             entrender->flags |= RENDER_NOCULL;
                if(renderflags & RF_DEPTHHACK)  entrender->effects |= EF_NODEPTHTEST;
                if(renderflags & RF_ADDITIVE)           entrender->effects |= EF_ADDITIVE;
+
        }
 
        c = (int)ed->fields.client->colormap;
@@ -281,7 +305,7 @@ qboolean CL_VM_InputEvent (qboolean down, int key, int ascii)
                        PRVM_G_FLOAT(OFS_PARM1) = key;
                        PRVM_G_FLOAT(OFS_PARM2) = ascii;
                        PRVM_ExecuteProgram(prog->funcoffsets.CSQC_InputEvent, "QC function CSQC_InputEvent is missing");
-                       r = CSQC_RETURNVAL;
+                       r = CSQC_RETURNVAL != 0;
                }
        CSQC_END
        return r;
@@ -332,7 +356,7 @@ qboolean CL_VM_ConsoleCommand (const char *cmd)
                PRVM_G_INT(OFS_PARM0) = PRVM_SetTempString(cmd);
                PRVM_ExecuteProgram(prog->funcoffsets.CSQC_ConsoleCommand, "QC function CSQC_ConsoleCommand is missing");
                vm_tempstringsbuf.cursize = restorevm_tempstringsbuf_cursize;
-               r = CSQC_RETURNVAL;
+               r = CSQC_RETURNVAL != 0;
        }
        CSQC_END
        return r;
@@ -351,7 +375,7 @@ qboolean CL_VM_Parse_TempEntity (void)
                prog->globals.client->time = cl.time;
                prog->globals.client->self = cl.csqc_server2csqcentitynumber[cl.playerentity];
                PRVM_ExecuteProgram(prog->funcoffsets.CSQC_Parse_TempEntity, "QC function CSQC_Parse_TempEntity is missing");
-               r = CSQC_RETURNVAL;
+               r = CSQC_RETURNVAL != 0;
                if(!r)
                {
                        msg_readcount = t;
@@ -550,7 +574,7 @@ qboolean CL_VM_Event_Sound(int sound_num, float volume, int channel, float atten
                        PRVM_G_FLOAT(OFS_PARM4) = attenuation;
                        VectorCopy(pos, PRVM_G_VECTOR(OFS_PARM5) );
                        PRVM_ExecuteProgram(prog->funcoffsets.CSQC_Event_Sound, "QC function CSQC_Event_Sound is missing");
-                       r = CSQC_RETURNVAL;
+                       r = CSQC_RETURNVAL != 0;
                }
                CSQC_END
        }
@@ -707,6 +731,7 @@ void CL_VM_CB_FreeEdict(prvm_edict_t *ed)
 {
        World_UnlinkEdict(ed);
        memset(ed->fields.client, 0, sizeof(*ed->fields.client));
+       World_Physics_RemoveFromEntity(&cl.world, ed);
 }
 
 void CL_VM_CB_CountEdicts(void)
@@ -870,6 +895,7 @@ void CL_VM_Init (void)
        prog->init_cmd = VM_CL_Cmd_Init;
        prog->reset_cmd = VM_CL_Cmd_Reset;
        prog->error_cmd = CL_VM_Error;
+       prog->ExecuteProgram = CLVM_ExecuteProgram;
 
        PRVM_LoadProgs(csprogsfn, cl_numrequiredfunc, cl_required_func, 0, NULL, 0, NULL);