diff --git a/engine/client/cl_parse.c b/engine/client/cl_parse.c index 0448e922b..b111c3615 100644 --- a/engine/client/cl_parse.c +++ b/engine/client/cl_parse.c @@ -7045,7 +7045,7 @@ static void CL_ParseStuffCmd(char *msg, int destsplit) //this protects stuffcmds } #endif - strncat(stufftext, msg, sizeof(stufftext)-1); + Q_strncatz(stufftext, msg, sizeof(stufftext)-1); while((msg = strchr(stufftext, '\n'))) { *msg = '\0'; diff --git a/engine/client/cl_tent.c b/engine/client/cl_tent.c index 3e4dfc6c5..197df4b4c 100644 --- a/engine/client/cl_tent.c +++ b/engine/client/cl_tent.c @@ -310,8 +310,9 @@ cvar_t r_bluelight_colour = CVARFD("r_bluelight_colour", "0.5 0.5 3.0 200", CVA cvar_t r_rocketlight_colour = CVARFD("r_rocketlight_colour", "2.0 1.0 0.25 200", CVAR_ARCHIVE, "This controls the RGB+radius values of MF_ROCKET effects."); cvar_t r_muzzleflash_colour = CVARFD("r_muzzleflash_colour", "1.5 1.3 1.0 200", CVAR_ARCHIVE, "This controls the initial RGB+radius of EF_MUZZLEFLASH/svc_muzzleflash effects."); cvar_t r_muzzleflash_fade = CVARFD("r_muzzleflash_fade", "1.5 0.75 0.375 1000", CVAR_ARCHIVE, "This controls the per-second RGB+radius decay of EF_MUZZLEFLASH/svc_muzzleflash effects."); -cvar_t cl_truelightning = CVARF("cl_truelightning", "0", CVAR_SEMICHEAT); -static cvar_t cl_beam_trace = CVAR("cl_beam_trace", "0"); +cvar_t cl_truelightning = CVARFD("cl_truelightning", "0", CVAR_SEMICHEAT, "Manipulate the end position of the player's own beams, to hide lag. Can be set to fractional values to reduce the effect."); +static cvar_t cl_beam_trace = CVARD("cl_beam_trace", "0", "Clips the length of any beams according to any walls they may have impacted."); +static cvar_t cl_beam_alpha = CVARAFD("cl_beam_alpha", "1", "r_shaftalpha", 0, "Specifies the translucency of the lightning beam segments."); static cvar_t cl_legacystains = CVARD("cl_legacystains", "1", "WARNING: this cvar will default to 0 and later removed at some point"); //FIXME: do as the description says! static cvar_t cl_shaftlight = CVAR("gl_shaftlight", "0.8"); static cvar_t cl_part_density_fade_start = CVARD("cl_part_density_fade_start", "1024", "Specifies the distance at which ssqc's pointparticles will start to get less dense."); @@ -454,6 +455,7 @@ void CL_InitTEnts (void) Cvar_Register (&cl_expsprite, "Temporary entity control"); Cvar_Register (&cl_truelightning, "Temporary entity control"); Cvar_Register (&cl_beam_trace, "Temporary entity control"); + Cvar_Register (&cl_beam_alpha, "Temporary entity control"); Cvar_Register (&r_explosionlight, "Temporary entity control"); Cvar_Register (&r_explosionlight_colour, "Temporary entity control"); Cvar_Register (&r_explosionlight_fade, "Temporary entity control"); @@ -905,7 +907,9 @@ beam_t *CL_AddBeam (enum beamtype_e tent, int ent, vec3_t start, vec3_t end) //f b->tag = -1; b->bflags |= /*STREAM_ATTACHED|*/STREAM_ATTACHTOPLAYER; b->endtime = cl.time + 0.2; - b->alpha = 1; + b->alpha = bound(0, cl_beam_alpha.value, 1); + if(b->alpha < 1) + b->rflags |= RF_TRANSLUCENT; b->skin = 0; VectorCopy (start, b->start); VectorCopy (end, b->end); diff --git a/engine/client/zqtp.c b/engine/client/zqtp.c index debcd48eb..bf69aa0bc 100644 --- a/engine/client/zqtp.c +++ b/engine/client/zqtp.c @@ -1529,16 +1529,16 @@ TP_ParseFunChars Doesn't check for overflows, so strlen(s) should be < MAX_MACRO_STRING ============== */ -char *TP_ParseFunChars (char *s) +const char *TP_ParseFunChars (const char *s) { static char buf[MAX_MACRO_STRING]; char *out = buf; int c; - if (!cl_parseFunChars.ival) + if (!cl_parseFunChars.ival || com_parseutf8.ival != 0) return s; - while (*s) { + while (*s && out < buf+countof(buf)-1) { if (*s == '$' && s[1] == 'x') { int i; // check for $x10, $x8a, etc diff --git a/engine/common/cmd.c b/engine/common/cmd.c index 9288ed21d..b65441586 100644 --- a/engine/common/cmd.c +++ b/engine/common/cmd.c @@ -1040,11 +1040,11 @@ Cmd_Echo_f Just prints the rest of the line to the console =============== */ -char *TP_ParseFunChars (char *s); static void Cmd_Echo_f (void) { char text[4096]; - char extext[4096], *t; + char extext[4096]; + const char *t; int level = Cmd_ExecLevel; int i; *text = 0; diff --git a/engine/common/cmd.h b/engine/common/cmd.h index 3b5c69039..f3d913ef5 100644 --- a/engine/common/cmd.h +++ b/engine/common/cmd.h @@ -251,6 +251,7 @@ void Cmd_MessageTrigger (char *message, int type); void Cmd_ShiftArgs (int ammount, qboolean expandstring); +const char *TP_ParseFunChars (const char *s); char *Cmd_ExpandString (const char *data, char *dest, int destlen, int *accesslevel, qboolean expandargs, qboolean expandcvars, qboolean expandmacros); qboolean If_EvaluateBoolean(const char *text, int restriction); diff --git a/engine/common/cvar.c b/engine/common/cvar.c index 7cfe0bdc8..fa1aaf2a5 100644 --- a/engine/common/cvar.c +++ b/engine/common/cvar.c @@ -998,9 +998,10 @@ static cvar_t *Cvar_SetCore (cvar_t *var, const char *value, qboolean force) if (var->flags & CVAR_USERINFO) { char *old = InfoBuf_ValueForKey(&cls.userinfo[0], var->name); - if (strcmp(old, value)) //only spam the server if it actually changed + const char *corruptval = TP_ParseFunChars(value); + if (strcmp(old, corruptval)) //only spam the server if it actually changed { //this helps with config execs - InfoBuf_SetKey (&cls.userinfo[0], var->name, value); + InfoBuf_SetKey (&cls.userinfo[0], var->name, corruptval); } } #endif