From 2cb23fe201be0d6d5ee8625479bdd3bd5be3457f Mon Sep 17 00:00:00 2001 From: Dustin Hendrickson Date: Sun, 25 May 2025 13:40:24 -0700 Subject: [PATCH 1/2] Adding new config option and setting default performance mode, uses the pending reset system to process X number of bots based on the config each X seconds instead of just doing one big update batch, locking the server up for 10's of seconds at a time. --- conf/mod_player_bot_level_brackets.conf.dist | 10 +- src/mod-player-bot-level-brackets.cpp | 99 ++++++++++++++------ 2 files changed, 78 insertions(+), 31 deletions(-) diff --git a/conf/mod_player_bot_level_brackets.conf.dist b/conf/mod_player_bot_level_brackets.conf.dist index 34f722c..fe296cc 100644 --- a/conf/mod_player_bot_level_brackets.conf.dist +++ b/conf/mod_player_bot_level_brackets.conf.dist @@ -32,10 +32,16 @@ BotLevelBrackets.CheckFrequency = 300 # # BotLevelBrackets.CheckFlaggedFrequency -# Description: The frequency (in seconds) at which the bot level reset is performed for flagged bots that failed safety checks initially. -# Default: 15 +# Description: The frequency (in seconds) at which the bot level reset is performed for processing safe bots and checking flagged bots that failed safety checks initially. +# Default: 15 BotLevelBrackets.CheckFlaggedFrequency = 15 +# BotLevelBrackets.FlaggedProcessLimit +# Description: Maximum number of flagged bots to process per flagged check step. +# 0 = unlimited (process all flagged bots each step) +# Default: 5 +BotLevelBrackets.FlaggedProcessLimit = 5 + # # BotLevelBrackets.IgnoreGuildBotsWithRealPlayers # Description: When enabled, bots that are in a guild with at least one real (non-bot) player online are excluded diff --git a/src/mod-player-bot-level-brackets.cpp b/src/mod-player-bot-level-brackets.cpp index 50b6c76..d56bb1b 100644 --- a/src/mod-player-bot-level-brackets.cpp +++ b/src/mod-player-bot-level-brackets.cpp @@ -57,6 +57,8 @@ static bool g_BotDistFullDebugMode = false; static bool g_BotDistLiteDebugMode = false; static bool g_UseDynamicDistribution = false; static bool g_IgnoreFriendListed = true; +static uint32 g_FlaggedProcessLimit = 0; // 0 = unlimited + // Real player weight to boost bracket contributions. static float g_RealPlayerWeight = 1.0f; @@ -85,6 +87,7 @@ static void LoadBotLevelBracketsConfig() g_RealPlayerWeight = sConfigMgr->GetOption("BotLevelBrackets.Dynamic.RealPlayerWeight", 1.0f); g_SyncFactions = sConfigMgr->GetOption("BotLevelBrackets.Dynamic.SyncFactions", false); g_IgnoreFriendListed = sConfigMgr->GetOption("BotLevelBrackets.IgnoreFriendListed", true); + g_FlaggedProcessLimit = sConfigMgr->GetOption("BotLevelBrackets.FlaggedProcessLimit", 0); // Load the bot level restrictions. g_RandomBotMinLevel = static_cast(sConfigMgr->GetOption("AiPlayerbot.RandomBotMinLevel", 1)); @@ -360,10 +363,6 @@ static bool BotInFriendList(Player* bot) for (size_t i = 0; i < SocialFriendsList.size(); ++i) { - if (g_BotDistFullDebugMode) - { - LOG_INFO("server.loading", "[BotLevelBrackets] Check bot {} against SocialFriendsList Array Character GUID {}", bot->GetName(), SocialFriendsList[i]); - } if (SocialFriendsList[i] == bot->GetGUID().GetRawValue()) { if (g_BotDistFullDebugMode) @@ -547,34 +546,40 @@ static void ProcessPendingLevelResets() return; } + // Limit the number of resets processed in one cycle if configured. + uint32 processed = 0; for (auto it = g_PendingLevelResets.begin(); it != g_PendingLevelResets.end(); ) - { - Player* bot = it->bot; - int targetRange = it->targetRange; - if (g_IgnoreGuildBotsWithRealPlayers && BotInGuildWithRealPlayer(bot)) { - it = g_PendingLevelResets.erase(it); - continue; - } - if (g_IgnoreFriendListed && BotInFriendList(bot)) - { - it = g_PendingLevelResets.erase(it); - continue; - } - if (bot && bot->IsInWorld() && IsBotSafeForLevelReset(bot)) - { - AdjustBotToRange(bot, targetRange, it->factionRanges); - if (g_BotDistFullDebugMode) + if (g_FlaggedProcessLimit > 0 && processed >= g_FlaggedProcessLimit) + break; + + Player* bot = it->bot; + int targetRange = it->targetRange; + if (g_IgnoreGuildBotsWithRealPlayers && BotInGuildWithRealPlayer(bot)) { - LOG_INFO("server.loading", "[BotLevelBrackets] Bot '{}' successfully reset to level range {}-{}.", bot->GetName(), it->factionRanges[targetRange].lower, it->factionRanges[targetRange].upper); + it = g_PendingLevelResets.erase(it); + continue; + } + if (g_IgnoreFriendListed && BotInFriendList(bot)) + { + it = g_PendingLevelResets.erase(it); + continue; + } + if (bot && bot->IsInWorld() && IsBotSafeForLevelReset(bot)) + { + AdjustBotToRange(bot, targetRange, it->factionRanges); + if (g_BotDistFullDebugMode) + { + LOG_INFO("server.loading", "[BotLevelBrackets] Bot '{}' successfully reset to level range {}-{}.", bot->GetName(), it->factionRanges[targetRange].lower, it->factionRanges[targetRange].upper); + } + it = g_PendingLevelResets.erase(it); + ++processed; + } + else + { + ++it; } - it = g_PendingLevelResets.erase(it); } - else - { - ++it; - } - } } // This function returns a valid bracket index for the given player's level. @@ -1003,7 +1008,25 @@ public: LOG_INFO("server.loading", "[BotLevelBrackets] !!!! Adjusting alliance bot '{}' from range {} to range {} ({}-{}).", bot->GetName(), i + 1, targetRange + 1, g_AllianceLevelRanges[targetRange].lower, g_AllianceLevelRanges[targetRange].upper); } - AdjustBotToRange(bot, targetRange, g_AllianceLevelRanges.data()); + //AdjustBotToRange(bot, targetRange, g_AllianceLevelRanges.data()); + bool alreadyFlagged = false; + for (auto& entry : g_PendingLevelResets) + { + if (entry.bot == bot) + { + alreadyFlagged = true; + break; + } + } + if (!alreadyFlagged) + { + g_PendingLevelResets.push_back({bot, targetRange, g_AllianceLevelRanges.data()}); + if (g_BotDistFullDebugMode) + { + LOG_INFO("server.loading", "[BotLevelBrackets] Alliance bot '{}' flagged for pending level reset to range {}-{}.", + bot->GetName(), g_AllianceLevelRanges[targetRange].lower, g_AllianceLevelRanges[targetRange].upper); + } + } allianceActualCounts[i]--; allianceActualCounts[targetRange]++; } @@ -1154,7 +1177,25 @@ public: LOG_INFO("server.loading", "[BotLevelBrackets] !!!! Adjusting horde bot '{}' from range {} to range {} ({}-{}).", bot->GetName(), i + 1, targetRange + 1, g_HordeLevelRanges[targetRange].lower, g_HordeLevelRanges[targetRange].upper); } - AdjustBotToRange(bot, targetRange, g_HordeLevelRanges.data()); + //AdjustBotToRange(bot, targetRange, g_HordeLevelRanges.data()); + bool alreadyFlagged = false; + for (auto& entry : g_PendingLevelResets) + { + if (entry.bot == bot) + { + alreadyFlagged = true; + break; + } + } + if (!alreadyFlagged) + { + g_PendingLevelResets.push_back({bot, targetRange, g_HordeLevelRanges.data()}); + if (g_BotDistFullDebugMode) + { + LOG_INFO("server.loading", "[BotLevelBrackets] Horde bot '{}' flagged for pending level reset to range {}-{}.", + bot->GetName(), g_HordeLevelRanges[targetRange].lower, g_HordeLevelRanges[targetRange].upper); + } + } hordeActualCounts[i]--; hordeActualCounts[targetRange]++; } From 894bc68f4e9c610a22dfe4c7f1575bbd43180bbc Mon Sep 17 00:00:00 2001 From: Dustin Hendrickson Date: Sun, 25 May 2025 13:43:36 -0700 Subject: [PATCH 2/2] Cleanup --- src/mod-player-bot-level-brackets.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/mod-player-bot-level-brackets.cpp b/src/mod-player-bot-level-brackets.cpp index d56bb1b..419bbf4 100644 --- a/src/mod-player-bot-level-brackets.cpp +++ b/src/mod-player-bot-level-brackets.cpp @@ -57,7 +57,7 @@ static bool g_BotDistFullDebugMode = false; static bool g_BotDistLiteDebugMode = false; static bool g_UseDynamicDistribution = false; static bool g_IgnoreFriendListed = true; -static uint32 g_FlaggedProcessLimit = 0; // 0 = unlimited +static uint32 g_FlaggedProcessLimit = 5; // 0 = unlimited // Real player weight to boost bracket contributions. @@ -87,7 +87,7 @@ static void LoadBotLevelBracketsConfig() g_RealPlayerWeight = sConfigMgr->GetOption("BotLevelBrackets.Dynamic.RealPlayerWeight", 1.0f); g_SyncFactions = sConfigMgr->GetOption("BotLevelBrackets.Dynamic.SyncFactions", false); g_IgnoreFriendListed = sConfigMgr->GetOption("BotLevelBrackets.IgnoreFriendListed", true); - g_FlaggedProcessLimit = sConfigMgr->GetOption("BotLevelBrackets.FlaggedProcessLimit", 0); + g_FlaggedProcessLimit = sConfigMgr->GetOption("BotLevelBrackets.FlaggedProcessLimit", 5); // Load the bot level restrictions. g_RandomBotMinLevel = static_cast(sConfigMgr->GetOption("AiPlayerbot.RandomBotMinLevel", 1)); @@ -1008,7 +1008,6 @@ public: LOG_INFO("server.loading", "[BotLevelBrackets] !!!! Adjusting alliance bot '{}' from range {} to range {} ({}-{}).", bot->GetName(), i + 1, targetRange + 1, g_AllianceLevelRanges[targetRange].lower, g_AllianceLevelRanges[targetRange].upper); } - //AdjustBotToRange(bot, targetRange, g_AllianceLevelRanges.data()); bool alreadyFlagged = false; for (auto& entry : g_PendingLevelResets) { @@ -1177,7 +1176,6 @@ public: LOG_INFO("server.loading", "[BotLevelBrackets] !!!! Adjusting horde bot '{}' from range {} to range {} ({}-{}).", bot->GetName(), i + 1, targetRange + 1, g_HordeLevelRanges[targetRange].lower, g_HordeLevelRanges[targetRange].upper); } - //AdjustBotToRange(bot, targetRange, g_HordeLevelRanges.data()); bool alreadyFlagged = false; for (auto& entry : g_PendingLevelResets) {