X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=csprogs.c;h=5ed99d11026be6c6e3825b26b87f7e5b82e06fdb;hb=2f311cc6db562c4a78e216f914fdbeab4227aa69;hp=8539312e897ae41b1d3e84c459f76cedd2d3d55e;hpb=27ad2d336694ea2dc50035130bae321316e3936f;p=xonotic%2Fdarkplaces.git diff --git a/csprogs.c b/csprogs.c index 8539312e..5ed99d11 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[] = { @@ -106,7 +119,7 @@ static void CSQC_SetGlobals (void) // CSQC is useless as it can't alter the view origin without // completely replacing it VectorCopy(cl.csqc_origin, prog->globals.client->pmove_org); - VectorCopy(cl.velocity, prog->globals.client->pmove_vel); + VectorCopy(cl.movement_velocity, prog->globals.client->pmove_vel); if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.view_angles))) VectorCopy(cl.viewangles, val->vector); @@ -154,7 +167,7 @@ qboolean CSQC_AddRenderEdict(prvm_edict_t *ed) if (!model) return false; - entrender = CL_NewTempEntity(); + entrender = CL_NewTempEntity(0); if (!entrender) return false; @@ -204,11 +217,24 @@ qboolean CSQC_AddRenderEdict(prvm_edict_t *ed) // self.frame1time is the animation base time for the interpolation target // self.frame2 is the interpolation start (previous frame) // self.frame2time is the animation base time for the interpolation start - entrender->frame1 = entrender->frame2 = (int) ed->fields.client->frame; - if ((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.frame2))) entrender->frame2 = (int) val->_float; - if ((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.frame1time))) entrender->frame2time = val->_float; - if ((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.frame2time))) entrender->frame1time = val->_float; - if ((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.lerpfrac))) entrender->framelerp = val->_float; + // self.lerpfrac is the interpolation strength for self.frame + // 3+ are for additional blends (the main use for this feature is lerping + // pitch angle on a player model where the animator set up 5 sets of + // animations and the csqc simply lerps between sets) + entrender->framegroupblend[0].frame = entrender->framegroupblend[1].frame = (int) ed->fields.client->frame; + if ((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.frame2))) entrender->framegroupblend[1].frame = (int) val->_float; + if ((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.frame3))) entrender->framegroupblend[2].frame = (int) val->_float; + if ((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.frame4))) entrender->framegroupblend[3].frame = (int) val->_float; + if ((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.frame1time))) entrender->framegroupblend[0].start = val->_float; + if ((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.frame2time))) entrender->framegroupblend[1].start = val->_float; + if ((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.frame3time))) entrender->framegroupblend[2].start = val->_float; + if ((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.frame4time))) entrender->framegroupblend[3].start = val->_float; + if ((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.lerpfrac))) entrender->framegroupblend[0].lerp = val->_float; + if ((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.lerpfrac3))) entrender->framegroupblend[2].lerp = val->_float; + if ((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.lerpfrac4))) entrender->framegroupblend[3].lerp = val->_float; + if ((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.shadertime))) entrender->shadertime = val->_float; + // assume that the (missing) lerpfrac2 is whatever remains after lerpfrac+lerpfrac3+lerpfrac4 are summed + entrender->framegroupblend[1].lerp = 1 - entrender->framegroupblend[0].lerp - entrender->framegroupblend[2].lerp - entrender->framegroupblend[3].lerp; // concat the matrices to make the entity relative to its tag Matrix4x4_Concat(&entrender->matrix, &tagmatrix, &matrix2); @@ -268,7 +294,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; @@ -319,7 +345,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; @@ -338,7 +364,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; @@ -537,7 +563,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 } @@ -857,6 +883,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); @@ -948,16 +975,21 @@ qboolean CL_VM_GetEntitySoundOrigin(int entnum, vec3_t out) { prvm_edict_t *ed; dp_model_t *mod; + matrix4x4_t matrix; qboolean r = 0; CSQC_BEGIN; + // FIXME consider attachments here! + ed = PRVM_EDICT_NUM(entnum - 32768); if(!ed->priv.required->free) { mod = CL_GetModelFromEdict(ed); VectorCopy(ed->fields.client->origin, out); + if(CL_GetTagMatrix (&matrix, ed, 0) == 0) + Matrix4x4_OriginFromMatrix(&matrix, out); if (mod && mod->soundfromcenter) VectorMAMAM(1.0f, out, 0.5f, mod->normalmins, 0.5f, mod->normalmaxs, out); r = 1;