X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=csprogs.c;h=18d5c642a242da18e4b4c0473b278539e2e29be5;hb=6914302f2f1a7c6849604ace4967e39bf32ff0e6;hp=1ee20b6017214c909f87ed829bfae821e742a7f0;hpb=6661d4a6e250ded9d9c8e536d475f8cf157fbdcd;p=xonotic%2Fdarkplaces.git diff --git a/csprogs.c b/csprogs.c index 1ee20b60..18d5c642 100644 --- 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 @@ -16,6 +17,18 @@ 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);