/* ============ Cvar_VM_Set Set cvar for game or cgame vm. ============ */ void Cvar_VM_Set( const char *var_name, const char *value, qboolean gamevm ) { int flags = Cvar_Flags( var_name ); qboolean force = qtrue; if ( flags != CVAR_NONEXISTENT ) { if ( flags & CVAR_PROTECTED ) { if ( value ) Com_Error( ERR_DROP, "%s tried to set " "\"%s\" to \"%s\"", gamevm ? "GameVM" : "CGameVM", var_name, value ); else Com_Error( ERR_DROP, "%s tried to " "modify \"%s\"", gamevm ? "GameVM" : "CGameVM", var_name ); return; } // don't let VMs change cheat cvars when cheats are disabled // don't let VMs change engine latched cvars instantly // don't let cgame change systeminfo cvars when connected to a server if ( ( ( flags & CVAR_CHEAT ) && !cvar_cheats->integer ) || ( ( flags & CVAR_LATCH ) && !( flags & CVAR_VM_CREATED ) ) || ( ( flags & CVAR_SYSTEMINFO ) && CL_ConnectedToRemoteServer() ) ) { force = qfalse; } } Cvar_Set2( var_name, value, CVAR_VM_CREATED, force ); }
/* ============ Cvar_VM_Set Set cvar for game, cgame, or ui vm. ============ */ void Cvar_VM_Set( const char *var_name, const char *value, vmSlots_t vmslot ) { uint32_t flags = Cvar_Flags( var_name ); if ( vmslot != VM_GAME && (flags & CVAR_SYSTEMINFO) && CL_ConnectedToRemoteServer() ) { Com_Printf ("%s can only be set by server.\n", var_name); return; } if( flags != CVAR_NONEXISTENT && (flags & CVAR_PROTECTED) ) { if( value ) Com_Error( ERR_DROP, "%s tried to set \"%s\" to \"%s\"", vmStrs[vmslot], var_name, value ); else Com_Error( ERR_DROP, "%s tried to modify \"%s\"", vmStrs[vmslot], var_name ); return; } Cvar_Set2( var_name, value, CVAR_VM_CREATED, qtrue ); }
/* ============ Cvar_Set2 ============ */ cvar_t *Cvar_Set2( const char *var_name, const char *value, int defaultFlags, qboolean force ) { cvar_t *var; // Com_DPrintf( "Cvar_Set2: %s %s\n", var_name, value ); if ( !Cvar_ValidateString( var_name ) ) { Com_Printf("invalid cvar name string: %s\n", var_name ); var_name = "BADNAME"; } #if 0 // FIXME if ( value && !Cvar_ValidateString( value ) ) { Com_Printf("invalid cvar value string: %s\n", value ); var_value = "BADVALUE"; } #endif var = Cvar_FindVar (var_name); if (!var) { if ( !value ) { return NULL; } // create it var = Cvar_Get( var_name, value, defaultFlags ); var->explicitSet = qtrue; return var; } // explicit set state change if ( var->explicitSet != ( value != NULL ) ) { var->explicitSet = ( value != NULL ); // update config file even if value hasn't changed if ( var->flags & CVAR_ARCHIVE ) { cvar_modifiedFlags |= CVAR_ARCHIVE; } } if (!value ) { value = var->resetString; } value = Cvar_Validate(var, value, qtrue); if((var->flags & CVAR_LATCH) && var->latchedString) { if(!strcmp(value, var->string)) { Z_Free(var->latchedString); var->latchedString = NULL; return var; } if(!strcmp(value, var->latchedString)) return var; } else if(!strcmp(value, var->string)) return var; // note what types of cvars have been modified (userinfo, archive, serverinfo, systeminfo) cvar_modifiedFlags |= var->flags; if (!force) { if ( (var->flags & (CVAR_SYSTEMINFO|CVAR_SERVER_CREATED)) && CL_ConnectedToRemoteServer() ) { Com_Printf ("%s can only be set by server.\n", var_name); return var; } if (var->flags & CVAR_ROM) { Com_Printf ("%s is read only.\n", var_name); return var; } if (var->flags & CVAR_INIT) { Com_Printf ("%s is write protected.\n", var_name); return var; } if (var->flags & CVAR_LATCH) { if (var->latchedString) { if (strcmp(value, var->latchedString) == 0) return var; Z_Free (var->latchedString); } else { if (strcmp(value, var->string) == 0) return var; } Com_Printf ("%s will be changed upon restarting.\n", var_name); var->latchedString = CopyString(value); var->modified = qtrue; var->modificationCount++; return var; } if ( (var->flags & CVAR_CHEAT) && !cvar_cheats->integer ) { Com_Printf ("%s is cheat protected.\n", var_name); return var; } } else { if (var->latchedString) { Z_Free (var->latchedString); var->latchedString = NULL; } } if (!strcmp(value, var->string)) return var; // not changed var->modified = qtrue; var->modificationCount++; Z_Free (var->string); // free the old value string var->string = CopyString(value); var->value = atof (var->string); var->integer = atoi (var->string); return var; }