int IGameController::GetStartTeam() { // this will force the auto balancer to work overtime aswell if(g_Config.m_DbgStress) return TEAM_RED; if(g_Config.m_SvTournamentMode) return TEAM_SPECTATORS; // determine new team int Team = TEAM_RED; if(IsTeamplay()) Team = m_aTeamSize[TEAM_RED] > m_aTeamSize[TEAM_BLUE] ? TEAM_BLUE : TEAM_RED; // check if there're enough player slots left if(m_aTeamSize[TEAM_RED]+m_aTeamSize[TEAM_BLUE] < Server()->MaxClients()-g_Config.m_SvSpectatorSlots) { ++m_aTeamSize[Team]; m_UnbalancedTick = TBALANCE_CHECK; if(m_GameState == IGS_WARMUP_GAME && HasEnoughPlayers()) SetGameState(IGS_WARMUP_GAME, 0); return Team; } return TEAM_SPECTATORS; }
void IGameController::StartRound() { ResetGame(); ++m_RoundCount; // start countdown if there're enough players, otherwise abort to warmup if(HasEnoughPlayers()) SetGameState(IGS_START_COUNTDOWN); else SetGameState(IGS_WARMUP_GAME, TIMER_INFINITE); }
void IGameController::StartMatch() { ResetGame(); m_RoundCount = 0; m_aTeamscore[TEAM_RED] = 0; m_aTeamscore[TEAM_BLUE] = 0; // start countdown if there're enough players, otherwise do warmup till there're if(HasEnoughPlayers()) SetGameState(IGS_START_COUNTDOWN); else SetGameState(IGS_WARMUP_GAME, TIMER_INFINITE); Server()->DemoRecorder_HandleAutoStart(); char aBuf[256]; str_format(aBuf, sizeof(aBuf), "start match type='%s' teamplay='%d'", m_pGameType, m_GameFlags&GAMEFLAG_TEAMS); GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf); }
void IGameController::DoTeamChange(CPlayer *pPlayer, int Team, bool DoChatMsg) { Team = ClampTeam(Team); if(Team == pPlayer->GetTeam()) return; int OldTeam = pPlayer->GetTeam(); pPlayer->SetTeam(Team); int ClientID = pPlayer->GetCID(); // notify clients CNetMsg_Sv_Team Msg; Msg.m_ClientID = ClientID; Msg.m_Team = Team; Msg.m_Silent = DoChatMsg ? 0 : 1; Msg.m_CooldownTick = pPlayer->m_TeamChangeTick; Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, -1); char aBuf[128]; str_format(aBuf, sizeof(aBuf), "team_join player='%d:%s' m_Team=%d", ClientID, Server()->ClientName(ClientID), Team); GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf); // update effected game settings if(OldTeam != TEAM_SPECTATORS) { --m_aTeamSize[OldTeam]; m_UnbalancedTick = TBALANCE_CHECK; } if(Team != TEAM_SPECTATORS) { ++m_aTeamSize[Team]; m_UnbalancedTick = TBALANCE_CHECK; if(m_GameState == IGS_WARMUP_GAME && HasEnoughPlayers()) SetGameState(IGS_WARMUP_GAME, 0); pPlayer->m_IsReadyToPlay = !IsPlayerReadyMode(); if(m_GameFlags&GAMEFLAG_SURVIVAL) pPlayer->m_RespawnDisabled = GetStartRespawnState(); } OnPlayerInfoChange(pPlayer); GameServer()->OnClientTeamChange(ClientID); }
void IGameController::DoTeamChange(CPlayer *pPlayer, int Team, bool DoChatMsg) { Team = ClampTeam(Team); if(Team == pPlayer->GetTeam()) return; int OldTeam = pPlayer->GetTeam(); pPlayer->SetTeam(Team); int ClientID = pPlayer->GetCID(); char aBuf[128]; if(DoChatMsg) { str_format(aBuf, sizeof(aBuf), "'%s' joined the %s", Server()->ClientName(ClientID), GetTeamName(Team)); GameServer()->SendChat(-1, CGameContext::CHAT_ALL, aBuf); } str_format(aBuf, sizeof(aBuf), "team_join player='%d:%s' m_Team=%d", ClientID, Server()->ClientName(ClientID), Team); GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf); // update effected game settings if(OldTeam != TEAM_SPECTATORS) { --m_aTeamSize[OldTeam]; m_UnbalancedTick = TBALANCE_CHECK; } if(Team != TEAM_SPECTATORS) { ++m_aTeamSize[Team]; m_UnbalancedTick = TBALANCE_CHECK; if(m_GameState == IGS_WARMUP_GAME && HasEnoughPlayers()) SetGameState(IGS_WARMUP_GAME, 0); pPlayer->m_IsReadyToPlay = !IsPlayerReadyMode(); if(m_GameFlags&GAMEFLAG_SURVIVAL) pPlayer->m_RespawnDisabled = GetStartRespawnState(); } OnPlayerInfoChange(pPlayer); GameServer()->OnClientTeamChange(ClientID); }