From 691a9bbcf17236bd3ba281cfe35fe21fd19e072f Mon Sep 17 00:00:00 2001 From: bash Date: Tue, 1 Oct 2024 17:28:45 +0000 Subject: [PATCH] Auto scale mechanism for the botActiveAlone value --- conf/playerbots.conf.dist | 5 ++++ src/PlayerbotAI.cpp | 54 +++++++++++++++++---------------------- src/PlayerbotAIConfig.cpp | 1 + src/PlayerbotAIConfig.h | 1 + 4 files changed, 31 insertions(+), 30 deletions(-) diff --git a/conf/playerbots.conf.dist b/conf/playerbots.conf.dist index 248dc3fa7..e92cbae3b 100644 --- a/conf/playerbots.conf.dist +++ b/conf/playerbots.conf.dist @@ -1462,6 +1462,11 @@ AiPlayerbot.RandombotsWalkingRPG.InDoors = 0 # The default is 10. With 10% of all bots going active or inactive each minute. AiPlayerbot.BotActiveAlone = 100 +# Specify 1 for enabled, 0 for disabled. +# The default is 1. Automatically adjusts 'BotActiveAlone' percentage based on server +# latency. Which provides the server additional breathing space when needed. +AiPlayerbot.botActiveAloneAutoScale = 1 + # Premade spell to avoid (undetected spells) # spellid-radius, ... AiPlayerbot.PremadeAvoidAoe = 62234-4 diff --git a/src/PlayerbotAI.cpp b/src/PlayerbotAI.cpp index 816dd2665..4a29f05a4 100644 --- a/src/PlayerbotAI.cpp +++ b/src/PlayerbotAI.cpp @@ -4063,8 +4063,6 @@ bool PlayerbotAI::AllowActive(ActivityType activityType) return true; } - uint32 maxDiff = sWorldUpdateTime.GetMaxUpdateTime(); - Group* group = bot->GetGroup(); if (group) { @@ -4144,35 +4142,31 @@ bool PlayerbotAI::AllowActive(ActivityType activityType) if (sPlayerbotAIConfig->botActiveAlone <= 0) return false; - if (sPlayerbotAIConfig->botActiveAlone >= 100) - return true; - - if (maxDiff > 1000) - return false; - - uint32 mod = 100; - - // if has real players - slow down continents without player - if (maxDiff > 100) - mod = 50; - - if (maxDiff > 150) - mod = 25; - - if (maxDiff > 200) - mod = 10; - - if (maxDiff > 250) - { - if (Map* map = bot->GetMap()) - { - if (map->GetEntry()->IsWorldMap()) + // use the configured 'botActiveAlone 'percentages. Downscale the activity, within + // reason ,with the intension to give the server some breathing space when needed. + uint32 mod = sPlayerbotAIConfig->botActiveAlone > 100 ? 100 : sPlayerbotAIConfig->botActiveAlone; + + if (sPlayerbotAIConfig->botActiveAloneAutoScale) { + uint32 maxDiff = sWorldUpdateTime.GetMaxUpdateTimeOfCurrentTable(); + if (maxDiff > 1000) + return false; + if (maxDiff > 100) + mod = 50; + if (maxDiff > 150) + mod = 25; + if (maxDiff > 200) + mod = 10; + if (maxDiff > 250) + { + if (Map* map = bot->GetMap()) { - if (!HasRealPlayers(map)) - return false; - - if (!map->IsGridLoaded(bot->GetPositionX(), bot->GetPositionY())) - return false; + if (map->GetEntry()->IsWorldMap()) + { + if (!HasRealPlayers(map)) + return false; + if (!map->IsGridLoaded(bot->GetPositionX(), bot->GetPositionY())) + return false; + } } } } diff --git a/src/PlayerbotAIConfig.cpp b/src/PlayerbotAIConfig.cpp index 0cbcdb71c..84a8f4059 100644 --- a/src/PlayerbotAIConfig.cpp +++ b/src/PlayerbotAIConfig.cpp @@ -465,6 +465,7 @@ bool PlayerbotAIConfig::Initialize() playerbotsXPrate = sConfigMgr->GetOption("AiPlayerbot.KillXPRate", 1); disableDeathKnightLogin = sConfigMgr->GetOption("AiPlayerbot.DisableDeathKnightLogin", 0); botActiveAlone = sConfigMgr->GetOption("AiPlayerbot.BotActiveAlone", 100); + botActiveAloneAutoScale = sConfigMgr->GetOption("AiPlayerbot.botActiveAloneAutoScale", true); enablePrototypePerformanceDiff = sConfigMgr->GetOption("AiPlayerbot.EnablePrototypePerformanceDiff", false); diffWithPlayer = sConfigMgr->GetOption("AiPlayerbot.DiffWithPlayer", 100); diff --git a/src/PlayerbotAIConfig.h b/src/PlayerbotAIConfig.h index 6caf11793..f8e3fd82c 100644 --- a/src/PlayerbotAIConfig.h +++ b/src/PlayerbotAIConfig.h @@ -263,6 +263,7 @@ class PlayerbotAIConfig uint32 playerbotsXPrate; bool disableDeathKnightLogin; uint32 botActiveAlone; + bool botActiveAloneAutoScale; uint32 enablePrototypePerformanceDiff; uint32 diffWithPlayer;