/* * G_Teams_ExecuteChallengersQueue */ void G_Teams_ExecuteChallengersQueue( void ) { edict_t *ent; edict_t **challengers; bool restartmatch = false; // Medar fixme: this is only really makes sense, if playerlimit per team is one if( GS_MatchState() == MATCH_STATE_PLAYTIME ) return; if( !GS_HasChallengers() ) return; if( game.realtime < level.spawnedTimeStamp + G_CHALLENGERS_MIN_JOINTEAM_MAPTIME ) { static int time, lasttime; time = (int)( ( G_CHALLENGERS_MIN_JOINTEAM_MAPTIME - ( game.realtime - level.spawnedTimeStamp ) )*0.001 ); if( lasttime && time == lasttime ) return; lasttime = time; if( lasttime ) G_CenterPrintFormatMsg( NULL, "Waiting... %s", va( "%i", lasttime ), NULL ); else G_CenterPrintMsg( NULL, "" ); return; } // pick players in join order and try to put them in the // game until we get the first refused one. challengers = G_Teams_ChallengersQueue(); if( challengers ) { int i; for( i = 0; challengers[i]; i++ ) { ent = challengers[i]; if( !G_Teams_JoinAnyTeam( ent, true ) ) break; // if we successfully execute the challengers queue during the countdown, revert to warmup if( GS_MatchState() == MATCH_STATE_COUNTDOWN ) { restartmatch = true; } } } if( restartmatch == true ) { G_Match_Autorecord_Cancel(); G_Match_LaunchState( MATCH_STATE_WARMUP ); } }
/* * G_Teams_Join_Cmd */ void G_Teams_Join_Cmd( edict_t *ent ) { char *t; int team; if( !ent->r.client || trap_GetClientState( PLAYERNUM( ent ) ) < CS_SPAWNED ) return; t = trap_Cmd_Argv( 1 ); if( !t || *t == 0 ) { G_Teams_JoinAnyTeam( ent, false ); return; } team = GS_Teams_TeamFromName( t ); if( team != -1 ) { if( team == TEAM_SPECTATOR ) { // special handling for spectator team Cmd_Spec_f( ent ); return; } if( team == ent->s.team ) { G_PrintMsg( ent, "You are already in %s team\n", GS_TeamName( team ) ); return; } if( G_Teams_JoinTeam( ent, team ) ) { G_PrintMsg( NULL, "%s%s joined the %s%s team.\n", ent->r.client->netname, S_COLOR_WHITE, GS_TeamName( ent->s.team ), S_COLOR_WHITE ); return; } } else { G_PrintMsg( ent, "No such team.\n" ); return; } }
//========================================== // BOT_DMclass_DeadFrame // ent is dead = run this think func //========================================== static void BOT_DMclass_GhostingFrame( edict_t *self ) { usercmd_t ucmd; AI_ClearGoal( self ); self->ai->blocked_timeout = level.time + 15000; self->nextThink = level.time + 100; // wait 4 seconds after entering the level if( self->r.client->level.timeStamp + 4000 > level.time || !level.canSpawnEntities ) return; if( self->r.client->team == TEAM_SPECTATOR ) { // try to join a team // note that G_Teams_JoinAnyTeam is quite slow so only call it per frame if( !self->r.client->queueTimeStamp && self == level.think_client_entity ) G_Teams_JoinAnyTeam( self, false ); if( self->r.client->team == TEAM_SPECTATOR ) // couldn't join, delay the next think self->nextThink = level.time + 2000 + (int)( 4000 * random() ); else self->nextThink = level.time + 1; return; } memset( &ucmd, 0, sizeof( ucmd ) ); // set approximate ping and show values ucmd.serverTimeStamp = game.serverTime; ucmd.msec = game.frametime; self->r.client->r.ping = 0; // ask for respawn if the minimum bot respawning time passed if( level.time > self->deathTimeStamp + 3000 ) ucmd.buttons = BUTTON_ATTACK; ClientThink( self, &ucmd, 0 ); }
//========================================== // BOT_DMclass_DeadFrame // ent is dead = run this think func //========================================== void Bot::GhostingFrame() { usercmd_t ucmd; botBrain.oldCombatTask.Clear(); botBrain.combatTask.Clear(); Ai::ClearAllGoals(); blockedTimeout = level.time + BLOCKED_TIMEOUT; self->nextThink = level.time + 100; // wait 4 seconds after entering the level if( self->r.client->level.timeStamp + 4000 > level.time || !level.canSpawnEntities ) return; if( self->r.client->team == TEAM_SPECTATOR ) { // try to join a team // note that G_Teams_JoinAnyTeam is quite slow so only call it per frame if( !self->r.client->queueTimeStamp && self == level.think_client_entity ) G_Teams_JoinAnyTeam( self, false ); if( self->r.client->team == TEAM_SPECTATOR ) // couldn't join, delay the next think self->nextThink = level.time + 2000 + (int)( 4000 * random() ); else self->nextThink = level.time + 1; return; } memset( &ucmd, 0, sizeof( ucmd ) ); // ask for respawn if the minimum bot respawning time passed if( level.time > self->deathTimeStamp + 3000 ) ucmd.buttons = BUTTON_ATTACK; CallGhostingClientThink(&ucmd); }