/* * G_Teams_JoinTeam - checks that client can join the given team and then joins it */ bool G_Teams_JoinTeam( edict_t *ent, int team ) { int error; G_Teams_UpdateMembersList(); // make sure we have up-to-date data if( !ent->r.client ) return false; if( ( error = G_GameTypes_DenyJoinTeam( ent, team ) ) ) { if( error == ER_TEAM_INVALID ) { G_PrintMsg( ent, "Can't join %s in %s\n", GS_TeamName( team ), gs.gametypeName ); } else if( error == ER_TEAM_CHALLENGERS ) { G_Teams_JoinChallengersQueue( ent ); } else if( error == ER_TEAM_FULL ) { G_PrintMsg( ent, "Team %s is FULL\n", GS_TeamName( team ) ); G_Teams_JoinChallengersQueue( ent ); } else if( error == ER_TEAM_LOCKED ) { G_PrintMsg( ent, "Team %s is LOCKED\n", GS_TeamName( team ) ); G_Teams_JoinChallengersQueue( ent ); } else if( error == ER_TEAM_MATCHSTATE ) { G_PrintMsg( ent, "Can't join %s at this moment\n", GS_TeamName( team ) ); } else if( error == ER_TEAM_UNEVEN ) { G_PrintMsg( ent, "Can't join %s because of uneven teams\n", GS_TeamName( team ) ); // FIXME: need more suitable message :P G_Teams_JoinChallengersQueue( ent ); } return false; } //ok, can join, proceed G_Teams_SetTeam( ent, team ); return true; }
/* * G_Client_InactivityRemove */ void G_Client_InactivityRemove( gclient_t *client ) { if( !client ) return; // racesow if( !level.gametype.autoInactivityRemove ) return; // !racesow if( client->ps.pmove.pm_type != PM_NORMAL ) return; if( g_inactivity_maxtime->modified ) { if( g_inactivity_maxtime->value <= 0.0f ) trap_Cvar_ForceSet( "g_inactivity_maxtime", "0.0" ); else if( g_inactivity_maxtime->value < 15.0f ) trap_Cvar_ForceSet( "g_inactivity_maxtime", "15.0" ); g_inactivity_maxtime->modified = false; } if( g_inactivity_maxtime->value == 0.0f ) return; if( ( GS_MatchState() != MATCH_STATE_PLAYTIME ) || !level.gametype.removeInactivePlayers ) return; // inactive for too long if( client->level.last_activity && client->level.last_activity + ( g_inactivity_maxtime->value * 1000 ) < level.time ) { if( client->team >= TEAM_PLAYERS && client->team < GS_MAX_TEAMS ) { edict_t *ent = &game.edicts[ client - game.clients + 1 ]; // move to spectators and reset the queue time, effectively removing from the challengers queue G_Teams_SetTeam( ent, TEAM_SPECTATOR ); G_SpawnQueue_RemoveClient( ent ); // racesow - set player in free-view client->queueTimeStamp = 0; G_PrintMsg( NULL, "%s" S_COLOR_YELLOW " has been moved to spectator after %.1f seconds of inactivity\n", client->netname, g_inactivity_maxtime->value ); } } }
void G_Teams_Coach( edict_t *ent ) { if( GS_TeamBasedGametype() && !GS_InvidualGameType() && ent->s.team != TEAM_SPECTATOR ) { if( !teamlist[ent->s.team].has_coach ) { if( GS_MatchState() > MATCH_STATE_WARMUP && !GS_MatchPaused() ) { G_PrintMsg( ent, "Can't set coach mode with the match in progress\n" ); } else { // move to coach mode ent->r.client->teamstate.is_coach = true; G_GhostClient( ent ); ent->health = ent->max_health; ent->deadflag = DEAD_NO; G_ChasePlayer( ent, NULL, true, 0 ); //clear up his scores G_Match_Ready( ent ); // set ready and check readys memset( &ent->r.client->level.stats, 0, sizeof( ent->r.client->level.stats ) ); teamlist[ent->s.team].has_coach = true; G_PrintMsg( NULL, "%s%s is now team %s coach \n", ent->r.client->netname, S_COLOR_WHITE, GS_TeamName( ent->s.team ) ); } } else if( ent->r.client->teamstate.is_coach ) { // if you are this team coach, resign ent->r.client->teamstate.is_coach = false; G_PrintMsg( NULL, "%s%s is no longer team %s coach \n", ent->r.client->netname, S_COLOR_WHITE, GS_TeamName( ent->s.team ) ); G_Teams_SetTeam( ent, ent->s.team ); } else G_PrintMsg( ent, "Your team already has a coach.\n" ); } else G_PrintMsg( ent, "Coaching only valid while on a team in Team based Gametypes.\n" ); }