From 78b2cb968a460aab6f4eec7c615c638e3644036e Mon Sep 17 00:00:00 2001 From: Dmitry Date: Sat, 11 May 2019 23:55:33 +0300 Subject: [PATCH] Fixed ignorance of quota maintaining if no bots on kicking team. Minor refactoring. --- include/corelib.h | 24 ++++++++++++------------ include/yapb.h | 2 +- source/engine.cpp | 4 ++-- source/manager.cpp | 37 +++++++++++++++++++++++++------------ 4 files changed, 40 insertions(+), 27 deletions(-) diff --git a/include/corelib.h b/include/corelib.h index f31619a..5dab881 100644 --- a/include/corelib.h +++ b/include/corelib.h @@ -189,7 +189,7 @@ static inline void sincosf (const float x, const float y, const float z, float * // using only two sse calls instead of 6 calls to sin/cos with standard functions #if defined (PLATFORM_HAS_SSE2) - auto rad = _mm_set_ps (x, y, z, 0.0f); + auto inputSet = _mm_set_ps (x, y, z, 0.0f); auto _mm_sin = [] (__m128 rad) -> __m128 { static auto pi2 = _mm_set_ps1 (PI * 2); @@ -216,8 +216,8 @@ static inline void sincosf (const float x, const float y, const float z, float * }; static auto hpi = _mm_set_ps1 (PI_HALF); - auto s = _mm_sin (rad); - auto c = _mm_sin (_mm_add_ps (rad, hpi)); + auto s = _mm_sin (inputSet); + auto c = _mm_sin (_mm_add_ps (inputSet, hpi)); _mm_store_ps (sines, _mm_shuffle_ps (s, s, _MM_SHUFFLE (0, 1, 2, 3))); _mm_store_ps (cosines, _mm_shuffle_ps (c, c, _MM_SHUFFLE (0, 1, 2, 3))); @@ -650,7 +650,7 @@ public: B second; public: - Pair (A a, B b) : first (a), second (b) { + Pair (const A &a, const B &b) : first (a), second (b) { } public: @@ -852,7 +852,7 @@ public: } inline bool empty (void) const { - return m_length <= 0; + return m_length == 0; } void shrink (bool destroyEmpty = true) { @@ -894,7 +894,7 @@ public: } bool last (T &item) { - if (m_length <= 0) { + if (m_length == 0) { return false; } item = m_data[m_length - 1]; @@ -1416,17 +1416,17 @@ public: Array split (const char *delimiter) { Array tokens; - size_t length, index = 0; + size_t len, index = 0; do { index += strspn (&m_data[index], delimiter); - length = strcspn (&m_data[index], delimiter); + len = strcspn (&m_data[index], delimiter); - if (length > 0) { - tokens.push (move (substr (index, length))); + if (len > 0) { + tokens.push (move (substr (index, len))); } - index += length; - } while (length > 0); + index += len; + } while (len > 0); return tokens; } diff --git a/include/yapb.h b/include/yapb.h index 7e8b0ed..42b2618 100644 --- a/include/yapb.h +++ b/include/yapb.h @@ -1357,7 +1357,7 @@ public: void serverFill (int selection, int personality = PERSONALITY_NORMAL, int difficulty = -1, int numToAdd = -1); void kickEveryone (bool instant = false, bool zeroQuota = true); - void kickRandom (bool decQuota = true, Team fromTeam = TEAM_UNASSIGNED); + bool kickRandom (bool decQuota = true, Team fromTeam = TEAM_UNASSIGNED); void kickBot (int index); void kickFromTeam (Team team, bool removeAll = false); diff --git a/source/engine.cpp b/source/engine.cpp index 8bbfd5d..09344a3 100644 --- a/source/engine.cpp +++ b/source/engine.cpp @@ -1064,7 +1064,7 @@ void Engine::processMessages (void *ptr) { break; case 1: - if (playerIndex >= 0 && playerIndex <= maxClients ()) { + if (playerIndex > 0 && playerIndex <= maxClients ()) { int team = TEAM_UNASSIGNED; if (strVal[0] == 'U' && strVal[1] == 'N') { @@ -1192,7 +1192,7 @@ template bool LightMeasure::recursiveLightPoint (const } // blow it off if it doesn't split the plane... - if ((back < 0.0f) == side) { + if ((back < 0.0f) == !!side) { return false; // didn't hit anything } diff --git a/source/manager.cpp b/source/manager.cpp index 723adbe..11586a5 100644 --- a/source/manager.cpp +++ b/source/manager.cpp @@ -426,13 +426,20 @@ void BotManager::maintainQuota (void) { int ts = 0, cts = 0; countTeamPlayers (ts, cts); + bool isKicked = false; + if (ts > cts) { - kickRandom (false, TEAM_TERRORIST); + isKicked = kickRandom (false, TEAM_TERRORIST); } else if (ts < cts) { - kickRandom (false, TEAM_COUNTER); + isKicked = kickRandom (false, TEAM_COUNTER); } else { + isKicked = kickRandom (false, TEAM_UNASSIGNED); + } + + // if we can't kick player from correct team, just kick any random to keep quota control work + if (!isKicked) { kickRandom (false, TEAM_UNASSIGNED); } } @@ -601,7 +608,7 @@ void BotManager::kickBot (int index) { } } -void BotManager::kickRandom (bool decQuota, Team fromTeam) { +bool BotManager::kickRandom (bool decQuota, Team fromTeam) { // this function removes random bot from server (only yapb's) // if forTeam is unassigned, that means random team @@ -635,7 +642,7 @@ void BotManager::kickRandom (bool decQuota, Team fromTeam) { } if (deadBotFound) { - return; + return true; } // if no dead bots found try to find one with lowest amount of frags @@ -657,7 +664,7 @@ void BotManager::kickRandom (bool decQuota, Team fromTeam) { updateQuota (); m_bots[index]->kick (); - return; + return true; } // worst case, just kick some random bot @@ -669,9 +676,10 @@ void BotManager::kickRandom (bool decQuota, Team fromTeam) { updateQuota (); bot->kick (); - break; + return true; } } + return false; } void BotManager::setWeaponMode (int selection) { @@ -1389,12 +1397,17 @@ void BotManager::calculatePingOffsets (void) { botPing = rng.getInt (30, 40); } - for (int j = 0; j < 2; j++) { - for (bot->m_pingOffset[j] = 0; bot->m_pingOffset[j] < 4; bot->m_pingOffset[j]++) { - if ((botPing - bot->m_pingOffset[j]) % 4 == 0) { - bot->m_ping[j] = (botPing - bot->m_pingOffset[j]) / 4; - break; - } + for (bot->m_pingOffset[0] = 0; bot->m_pingOffset[0] < 4; bot->m_pingOffset[0]++) { + if ((botPing - bot->m_pingOffset[0]) % 4 == 0) { + bot->m_ping[0] = (botPing - bot->m_pingOffset[0]) / 4; + break; + } + } + + for (bot->m_pingOffset[1] = 0; bot->m_pingOffset[1] < 2; bot->m_pingOffset[1]++) { + if ((botPing - bot->m_pingOffset[1]) % 2 == 0) { + bot->m_ping[1] = (botPing - bot->m_pingOffset[1]) / 2; + break; } } bot->m_ping[2] = botPing;