Update player counts (#684)

* Update player counts in CheckWinConditions and SwitchTeam

* Add UTIL_SpectatorsInGame and update MaintainBotQuota
This commit is contained in:
Juice 2021-10-14 13:54:09 +03:00 committed by GitHub
parent da24c74c20
commit dd243eaa0b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 51 additions and 4 deletions

View File

@ -852,6 +852,7 @@ void CCSBotManager::MaintainBotQuota()
int totalHumansInGame = UTIL_HumansInGame(); int totalHumansInGame = UTIL_HumansInGame();
int humanPlayersInGame = UTIL_HumansInGame(IGNORE_SPECTATORS); int humanPlayersInGame = UTIL_HumansInGame(IGNORE_SPECTATORS);
int spectatorPlayersInGame = UTIL_SpectatorsInGame();
// don't add bots until local player has been registered, to make sure he's player ID #1 // don't add bots until local player has been registered, to make sure he's player ID #1
if (!IS_DEDICATED_SERVER() && totalHumansInGame == 0) if (!IS_DEDICATED_SERVER() && totalHumansInGame == 0)
@ -872,7 +873,7 @@ void CCSBotManager::MaintainBotQuota()
// unless the round is already in progress, in which case we play with what we've been dealt // unless the round is already in progress, in which case we play with what we've been dealt
if (!isRoundInProgress) if (!isRoundInProgress)
{ {
desiredBotCount = Q_max(0, desiredBotCount - humanPlayersInGame); desiredBotCount = Q_max(0, desiredBotCount - humanPlayersInGame + spectatorPlayersInGame);
} }
else else
{ {
@ -902,7 +903,7 @@ void CCSBotManager::MaintainBotQuota()
// wait for a player to join, if necessary // wait for a player to join, if necessary
if (cv_bot_join_after_player.value > 0.0) if (cv_bot_join_after_player.value > 0.0)
{ {
if (humanPlayersInGame == 0) if (humanPlayersInGame == 0 && spectatorPlayersInGame == 0)
desiredBotCount = 0; desiredBotCount = 0;
} }
@ -917,9 +918,9 @@ void CCSBotManager::MaintainBotQuota()
// if bots will auto-vacate, we need to keep one slot open to allow players to join // if bots will auto-vacate, we need to keep one slot open to allow players to join
if (cv_bot_auto_vacate.value > 0.0) if (cv_bot_auto_vacate.value > 0.0)
desiredBotCount = Q_min(desiredBotCount, gpGlobals->maxClients - (totalHumansInGame + 1)); desiredBotCount = Q_min(desiredBotCount, gpGlobals->maxClients - (humanPlayersInGame + 1));
else else
desiredBotCount = Q_min(desiredBotCount, gpGlobals->maxClients - totalHumansInGame); desiredBotCount = Q_min(desiredBotCount, gpGlobals->maxClients - humanPlayersInGame + spectatorPlayersInGame);
#ifdef REGAMEDLL_FIXES #ifdef REGAMEDLL_FIXES
// Try to balance teams, if we are in the first specified seconds of a round and bots can join either team. // Try to balance teams, if we are in the first specified seconds of a round and bots can join either team.

View File

@ -880,7 +880,13 @@ void EXT_FUNC CHalfLifeMultiplay::__API_HOOK(CheckWinConditions)()
#ifdef REGAMEDLL_FIXES #ifdef REGAMEDLL_FIXES
// If a winner has already been determined.. then get the heck out of here // If a winner has already been determined.. then get the heck out of here
if (m_iRoundWinStatus != WINSTATUS_NONE) if (m_iRoundWinStatus != WINSTATUS_NONE)
{
// still check if we lost players to where we need to do a full reset next round...
int NumDeadCT, NumDeadTerrorist, NumAliveTerrorist, NumAliveCT;
InitializePlayerCounts(NumAliveTerrorist, NumAliveCT, NumDeadTerrorist, NumDeadCT);
return; return;
}
#else #else
// If a winner has already been determined and game of started.. then get the heck out of here // If a winner has already been determined and game of started.. then get the heck out of here
if (m_bGameStarted && m_iRoundWinStatus != WINSTATUS_NONE) if (m_bGameStarted && m_iRoundWinStatus != WINSTATUS_NONE)

View File

@ -8216,6 +8216,12 @@ void CBasePlayer::__API_HOOK(SwitchTeam)()
} }
} }
} }
#ifdef REGAMEDLL_FIXES
// Initialize the player counts now that a player has switched teams
int NumDeadCT, NumDeadTerrorist, NumAliveTerrorist, NumAliveCT;
CSGameRules()->InitializePlayerCounts(NumAliveTerrorist, NumAliveCT, NumDeadTerrorist, NumDeadCT);
#endif
} }
void CBasePlayer::UpdateShieldCrosshair(bool draw) void CBasePlayer::UpdateShieldCrosshair(bool draw)

View File

@ -131,6 +131,39 @@ int UTIL_HumansInGame(bool ignoreSpectators)
return iCount; return iCount;
} }
// Returns the number of human spectators in the game
int UTIL_SpectatorsInGame()
{
int iCount = 0;
for (int iIndex = 1; iIndex <= gpGlobals->maxClients; iIndex++)
{
CBasePlayer* pPlayer = UTIL_PlayerByIndex(iIndex);
if (!pPlayer)
continue;
if (FNullEnt(pPlayer->pev))
continue;
if (FStrEq(STRING(pPlayer->pev->netname), ""))
continue;
if (pPlayer->IsProxy())
continue;
if (pPlayer->IsBot())
continue;
if (pPlayer->m_iTeam != SPECTATOR)
continue;
iCount++;
}
return iCount;
}
int UTIL_HumansOnTeam(int teamID, bool isAlive) int UTIL_HumansOnTeam(int teamID, bool isAlive)
{ {
int iCount = 0; int iCount = 0;

View File

@ -167,6 +167,7 @@ int UTIL_HumansInGame(bool ignoreSpectators = false);
bool UTIL_IsNameTaken(const char *name, bool ignoreHumans = false); bool UTIL_IsNameTaken(const char *name, bool ignoreHumans = false);
int UTIL_ClientsInGame(); int UTIL_ClientsInGame();
int UTIL_SpectatorsInGame();
int UTIL_ActivePlayersInGame(); int UTIL_ActivePlayersInGame();
int UTIL_BotsInGame(); int UTIL_BotsInGame();
bool UTIL_KickBotFromTeam(TeamName kickTeam); bool UTIL_KickBotFromTeam(TeamName kickTeam);