From: divverent Date: Wed, 23 Sep 2009 20:15:53 +0000 (+0000) Subject: clear trace globals after CSQC execution, to prevent possible triggerbots working... X-Git-Tag: xonotic-v0.1.0preview~1405 X-Git-Url: http://git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=commitdiff_plain;h=214872ff355d54459c0bebf7f072b38870c024be clear trace globals after CSQC execution, to prevent possible triggerbots working by parsing DP console output of "prvm_global client trace_networkentity" and issuing +attack/-attack based on result git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@9228 d7cf8633-e32d-0410-b094-e92efae38249 --- diff --git a/csprogs.c b/csprogs.c index ae4151ef..56b23ce7 100644 --- a/csprogs.c +++ b/csprogs.c @@ -12,7 +12,9 @@ #define CSQC_RETURNVAL prog->globals.generic[OFS_RETURN] #define CSQC_BEGIN csqc_tmpprog=prog;prog=0;PRVM_SetProg(PRVM_CLIENTPROG); -#define CSQC_END prog=csqc_tmpprog; +#define CSQC_END VM_ClearTraceGlobals(); prog=csqc_tmpprog; +// TODO check if the clearing of trace globals takes too much CPU. If it does, +// perform it before console command processing instead. static prvm_prog_t *csqc_tmpprog; diff --git a/prvm_cmds.c b/prvm_cmds.c index 510f5e7e..d875d034 100644 --- a/prvm_cmds.c +++ b/prvm_cmds.c @@ -5044,6 +5044,38 @@ void VM_SetTraceGlobals(const trace_t *trace) val->string = trace->hittexture ? PRVM_SetTempString(trace->hittexture->name) : 0; } +void VM_ClearTraceGlobals(void) +{ + // clean up all trace globals when leaving the VM (anti-triggerbot safeguard) + prvm_eval_t *val; + if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.trace_allsolid))) + val->_float = 0; + if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.trace_startsolid))) + val->_float = 0; + if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.trace_fraction))) + val->_float = 0; + if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.trace_inwater))) + val->_float = 0; + if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.trace_inopen))) + val->_float = 0; + if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.trace_endpos))) + VectorClear(val->vector); + if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.trace_plane_normal))) + VectorClear(val->vector); + if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.trace_plane_dist))) + val->_float = 0; + if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.trace_ent))) + val->edict = PRVM_EDICT_TO_PROG(prog->edicts); + if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.trace_dpstartcontents))) + val->_float = 0; + if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.trace_dphitcontents))) + val->_float = 0; + if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.trace_dphitq3surfaceflags))) + val->_float = 0; + if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.trace_dphittexturename))) + val->string = 0; +} + //============= void VM_Cmd_Init(void) diff --git a/prvm_cmds.h b/prvm_cmds.h index a7826eac..6c549c2d 100644 --- a/prvm_cmds.h +++ b/prvm_cmds.h @@ -422,6 +422,7 @@ void VM_strireplace (void); void VM_crc16(void); void VM_SetTraceGlobals(const trace_t *trace); +void VM_ClearTraceGlobals(void); void VM_Cmd_Init(void); void VM_Cmd_Reset(void);