diff --git a/engine/client/cl_parse.c b/engine/client/cl_parse.c index 85b907917..94812c9b9 100644 --- a/engine/client/cl_parse.c +++ b/engine/client/cl_parse.c @@ -1486,7 +1486,7 @@ void CL_ParseServerData (void) } CL_ClearState (); - P_NewServer(); + Cvar_ForceCallback(&r_particlesdesc); Stats_NewMap(); cl.servercount = svcnt; @@ -1692,7 +1692,7 @@ void CLQ2_ParseServerData (void) //cl.refresh_prepped = false; } - P_NewServer(); + Cvar_ForceCallback(&r_particlesdesc); if (R_PreNewMap) R_PreNewMap(); @@ -1712,7 +1712,7 @@ void CLNQ_ParseServerData(void) //Doesn't change gamedir - use with caution. Con_TPrintf (TLC_GOTSVDATAPACKET); CL_ClearState (); Stats_NewMap(); - P_NewServer(); + Cvar_ForceCallback(&r_particlesdesc); protover = MSG_ReadLong (); diff --git a/engine/client/r_part.c b/engine/client/r_part.c index 4e243c6bd..e2b0b8d28 100644 --- a/engine/client/r_part.c +++ b/engine/client/r_part.c @@ -121,7 +121,10 @@ extern cvar_t r_part_rain; extern cvar_t r_bloodstains; extern cvar_t gl_part_flame; -cvar_t r_particlesdesc = SCVARF("r_particlesdesc", "spikeset", CVAR_LATCH|CVAR_SEMICHEAT); +// callbacks +void R_ParticlesDesc_Callback(struct cvar_s *var, char *oldvalue); + +cvar_t r_particlesdesc = SCVARFC("r_particlesdesc", "spikeset", CVAR_SEMICHEAT, R_ParticlesDesc_Callback); cvar_t r_part_rain_quantity = SCVAR("r_part_rain_quantity", "1"); @@ -1483,14 +1486,18 @@ void P_ExportBuiltinSet_f(void) Con_Printf("Written particles/%s.cfg\n", efname); } -void P_NewServer(void) +void R_ParticlesDesc_Callback(struct cvar_s *var, char *oldvalue) { extern model_t mod_known[]; extern int mod_numknown; + int restrictlevel = Cmd_FromGamecode() ? RESTRICT_SERVER : RESTRICT_LOCAL; model_t *mod; int i; + if (cls.state == ca_disconnected) + return; // don't bother parsing while disconnected + for (i = 0; i < numparticletypes; i++) { *part_type[i].texname = '\0'; @@ -1501,8 +1508,6 @@ void P_NewServer(void) part_type->ramp = NULL; } - - for (i=0 , mod=mod_known ; iparticleeffect = -1; @@ -1539,8 +1544,8 @@ void P_NewServer(void) file = COM_LoadMallocFile(va("%s.cfg", r_particlesdesc.string)); if (file) { - Cbuf_AddText(file, RESTRICT_LOCAL); - Cbuf_AddText("\n", RESTRICT_LOCAL); //I'm paranoid. + Cbuf_AddText(file, restrictlevel); + Cbuf_AddText("\n", restrictlevel); BZ_Free(file); } else diff --git a/engine/common/particles.h b/engine/common/particles.h index 3f56b942b..6c865ea9a 100644 --- a/engine/common/particles.h +++ b/engine/common/particles.h @@ -136,7 +136,6 @@ typedef struct beamseg_s void P_DrawParticles (void); void P_InitParticles (void); void P_ClearParticles (void); -void P_NewServer(void); //allocate a new effect int P_ParticleTypeForName(char *name); @@ -182,4 +181,7 @@ void P_DelinkTrailstate(trailstate_t **tsk); typedef enum { BM_BLEND, BM_BLENDCOLOUR, BM_ADD, BM_SUBTRACT } blendmode_t; +// used for callback +extern cvar_t r_particlesdesc; + #endif