// Force settings to predefined state. void G_configSet(int dwMode, qboolean doComp) { unsigned int dwGameType; const modeCvarTable_t *pModeCvars; if(dwMode < 0 || dwMode >= GT_MAX_GAME_TYPE) return; dwGameType = 1 << dwMode; G_wipeCvars(); for(pModeCvars=((doComp)?aCompSettings:aPubSettings); pModeCvars->cvar_name; pModeCvars++) { if(pModeCvars->modes & dwGameType) { trap_Cvar_Set(pModeCvars->cvar_name, pModeCvars->cvar_value); G_Printf("set %s %s\n", pModeCvars->cvar_name, pModeCvars->cvar_value); } } G_UpdateCvars(); G_Printf(">> %s settings loaded!\n", (doComp)?"Competition":"Public"); if(doComp && g_gamestate.integer == GS_WARMUP_COUNTDOWN) { level.lastRestartTime = level.time; trap_SendConsoleCommand(EXEC_APPEND, va( "map_restart 0 %i\n", GS_WARMUP)); } else { trap_SendConsoleCommand( EXEC_APPEND, va( "map_restart 0 %i\n", GS_WARMUP ) ); } }
/* ================ G_RunFrame Advances the non-player objects in the world ================ */ void G_RunFrame( int levelTime ) { int i; gentity_t *ent; // if we are waiting for the level to restart, do nothing if ( level.restarted ) { return; } level.framenum++; level.previousTime = level.time; level.time = levelTime; // get any cvar changes G_UpdateCvars(); // // go through all allocated objects // ent = &g_entities[0]; for (i=0 ; i<level.num_entities ; i++, ent++) { if ( !ent->inuse ) { continue; } // clear events that are too old if ( level.time - ent->eventTime > EVENT_VALID_MSEC ) { if ( ent->s.event ) { ent->s.event = 0; // &= EV_EVENT_BITS; if ( ent->client ) { ent->client->ps.externalEvent = 0; // predicted events should never be set to zero //ent->client->ps.events[0] = 0; //ent->client->ps.events[1] = 0; } } if ( ent->freeAfterEvent ) { // tempEntities or dropped items completely go away after their event G_FreeEntity( ent ); continue; } else if ( ent->unlinkAfterEvent ) { // items that will respawn will hide themselves after their pickup event ent->unlinkAfterEvent = qfalse; trap_UnlinkEntity( ent ); } } // temporary entities don't think if ( ent->freeAfterEvent ) { continue; } if ( !ent->r.linked && ent->neverFree ) { continue; } if ( ent->s.eType == ET_MISSILE ) { G_RunMissile( ent ); continue; } if ( ent->s.eType == ET_ITEM || ent->physicsObject ) { G_RunItem( ent ); continue; } if ( ent->s.eType == ET_MOVER ) { G_RunMover( ent ); continue; } if ( i < MAX_CLIENTS ) { G_RunClient( ent ); continue; } G_RunThink( ent ); } // perform final fixups on the players ent = &g_entities[0]; for (i=0 ; i < level.maxclients ; i++, ent++ ) { if ( ent->inuse ) { ClientEndFrame( ent ); } } // see if it is time to do a tournement restart CheckTournament(); // see if it is time to end the level CheckExitRules(); // update to team status? CheckTeamStatus(); // cancel vote if timed out CheckVote(); // check team votes CheckTeamVote( TEAM_RED ); CheckTeamVote( TEAM_BLUE ); // for tracking changes CheckCvars(); if (g_listEntity.integer) { for (i = 0; i < MAX_GENTITIES; i++) { G_Printf("%4i: %s\n", i, g_entities[i].classname); } trap_Cvar_Set("g_listEntity", "0"); } }
void G_configLoadAndSet(const char *name) { pc_token_t token; int handle; config_t *config; qboolean parseOK = qtrue; handle = trap_PC_LoadSource(va("configs/%s.config", name)); if (!handle) { Com_Printf(S_COLOR_RED "ERROR: File not found: %s\n", name); return; } memset(&level.config, 0, sizeof(config_t)); G_wipeCvars(); config = &level.config; config->publicConfig = qfalse; while (1) { if (!trap_PC_ReadToken(handle, &token)) { break; } if (!Q_stricmp(token.string, "configname")) { if (!PC_String_ParseNoAlloc(handle, config->name, sizeof(config->name))) { G_Printf("expected config name\n"); parseOK = qfalse; break; } G_Printf("Config name is: %s\n", config->name); } else if (!Q_stricmp(token.string, "version")) { if (!PC_String_ParseNoAlloc(handle, config->version, sizeof(config->name))) { G_Printf("expected config version\n"); parseOK = qfalse; break; } } else if (!Q_stricmp(token.string, "init")) { if (!G_ParseSettings(handle, qtrue, config)) { G_Printf("Reading settings failed\n"); parseOK = qfalse; break; } } else if (!Q_stricmp(token.string, "map")) { if (!G_ParseMapSettings(handle, config)) { G_Printf("Reading map settings failed\n"); parseOK = qfalse; break; } } else if (!Q_stricmp(token.string, "signature")) { if (!PC_String_ParseNoAlloc(handle, config->signature, sizeof(config->signature))) { G_Printf("expected config signature\n"); parseOK = qfalse; break; } } else if (!Q_stricmp(token.string, "public")) { config->publicConfig = qtrue; } else { G_Printf("unknown token %s\n", token.string); parseOK = qfalse; break; } } trap_PC_FreeSource(handle); if (parseOK) { trap_SetConfigstring(CS_CONFIGNAME, config->name); if (level.config.version[0] && level.config.name[0]) { trap_SendServerCommand(-1, va("cp \"^7Config '%s^7' version '%s'^7 loaded\"", level.config.name, level.config.version)); } else if (level.config.name[0]) { trap_SendServerCommand(-1, va("cp \"^7Config '%s^7' loaded\"", level.config.name)); } } else { trap_SetConfigstring(CS_CONFIGNAME, ""); trap_SendServerCommand(-1, va("cp \"^7Config '%s^7' ^1FAILED ^7to load\"", name)); } G_UpdateCvars(); }
/* ================ G_RunFrame Advances the non-player objects in the world ================ */ void G_RunFrame( int levelTime ) { int i; // if we are waiting for the level to restart, do nothing if( theLevel.restarted_ ) return; theLevel.framenum_++; theLevel.previousTime_ = theLevel.time_; theLevel.time_ = levelTime; int msec = theLevel.time_ - theLevel.previousTime_; // get any cvar changes G_UpdateCvars(); // // go through all allocated objects // int start = Sys_Milliseconds(); GameEntity* ent = 0;//&g_entities[0]; for( i=0 ; i<theLevel.num_entities_ ; i++ ) { ent = theLevel.getEntity(i); if( !ent || !ent->inuse_ ) continue; // clear events that are too old if( theLevel.time_ - ent->eventTime_ > EVENT_VALID_MSEC ) { if( ent->s.event ) { ent->s.event = 0; // &= EV_EVENT_BITS; if( ent->client_ ) { ent->client_->ps_.externalEvent = 0; // predicted events should never be set to zero //ent->client->ps.events[0] = 0; //ent->client->ps.events[1] = 0; } } if( ent->freeAfterEvent_ ) { // tempEntities or dropped items completely go away after their event ent->freeUp();// former G_FreeEntity continue; } else if( ent->unlinkAfterEvent_ ) { // items that will respawn will hide themselves after their pickup event ent->unlinkAfterEvent_ = false; SV_UnlinkEntity( ent ); } } // temporary entities don't think if( ent->freeAfterEvent_ ) continue; if( ent->s.eType == ET_MISSILE || ent->s.eType == ET_BULLET ) { G_RunMissile( ent ); continue; } if( ent->s.eType == ET_ITEM || ent->physicsObject_ ) { G_RunItem( ent ); continue; } if( ent->s.eType == ET_MOVER ) { G_RunMover( ent ); continue; } if( ent->client_ ) { G_RunClient( ent ); continue; } G_RunThink( ent ); } int end = Sys_Milliseconds(); start = Sys_Milliseconds(); // perform final fixups on the players //ent = &g_entities[0]; for( i=1 ; i <= theLevel.maxclients_ ; i++ ) { ent = theLevel.getEntity(i); if( ent && ent->inuse_ ) ClientEndFrame( ent ); } end = Sys_Milliseconds(); // see if it is time to do a tournement restart CheckTournament(); // see if it is time to end the level CheckExitRules(); // update to team status? CheckTeamStatus(); // cancel vote if timed out CheckVote(); // check team votes CheckTeamVote( ClientBase::TEAM_RED ); CheckTeamVote( ClientBase::TEAM_BLUE ); // for tracking changes CheckCvars(); if( g_listEntity.integer ) { for( i = 0; i < MAX_GENTITIES; i++ ) { ent = theLevel.getEntity(i); Com_Printf("%4i: %s\n", i, ent->classname_); } Cvar_Set("g_listEntity", "0"); } }