diff --git a/conf/playerbots.conf.dist b/conf/playerbots.conf.dist index 248dc3fa7..d7d020591 100644 --- a/conf/playerbots.conf.dist +++ b/conf/playerbots.conf.dist @@ -1462,6 +1462,10 @@ 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. +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 2c5d89d6f..4f79196f2 100644 --- a/src/PlayerbotAI.cpp +++ b/src/PlayerbotAI.cpp @@ -4095,8 +4095,6 @@ bool PlayerbotAI::AllowActive(ActivityType activityType) return true; } - uint32 maxDiff = sWorldUpdateTime.GetMaxUpdateTime(); - Group* group = bot->GetGroup(); if (group) { @@ -4176,37 +4174,10 @@ 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) + uint32 mod = sPlayerbotAIConfig->botActiveAlone > 100 ? 100 : sPlayerbotAIConfig->botActiveAlone; + if (sPlayerbotAIConfig->botActiveAloneAutoScale) { - if (Map* map = bot->GetMap()) - { - if (map->GetEntry()->IsWorldMap()) - { - if (!HasRealPlayers(map)) - return false; - - if (!map->IsGridLoaded(bot->GetPositionX(), bot->GetPositionY())) - return false; - } - } + mod = AutoScaleActivity(mod); } uint32 ActivityNumber = @@ -4232,6 +4203,31 @@ bool PlayerbotAI::AllowActivity(ActivityType activityType, bool checkNow) return allowed; } +uint32 PlayerbotAI::AutoScaleActivity(uint32 mod) +{ + uint32 maxDiff = sWorldUpdateTime.GetAverageUpdateTime(); + + if (maxDiff > 500) return 0; + if (maxDiff > 250) + { + if (Map* map = bot->GetMap()) + { + if (map->GetEntry()->IsWorldMap() && + (!HasRealPlayers(map) || + !map->IsGridLoaded(bot->GetPositionX(), bot->GetPositionY()))) + return 0; + } + + return (mod * 1) / 10; + } + if (maxDiff > 200) return (mod * 3) / 10; + if (maxDiff > 150) return (mod * 5) / 10; + if (maxDiff > 100) return (mod * 6) / 10; + if (maxDiff > 80) return (mod * 9) / 10; + + return mod; +} + bool PlayerbotAI::IsOpposing(Player* player) { return IsOpposing(player->getRace(), bot->getRace()); } bool PlayerbotAI::IsOpposing(uint8 race1, uint8 race2) diff --git a/src/PlayerbotAI.h b/src/PlayerbotAI.h index 093ebf415..6e82338bd 100644 --- a/src/PlayerbotAI.h +++ b/src/PlayerbotAI.h @@ -527,6 +527,7 @@ class PlayerbotAI : public PlayerbotAIBase bool HasManyPlayersNearby(uint32 trigerrValue = 20, float range = sPlayerbotAIConfig->sightDistance); bool AllowActive(ActivityType activityType); bool AllowActivity(ActivityType activityType = ALL_ACTIVITY, bool checkNow = false); + uint32 AutoScaleActivity(uint32 mod); // Check if player is safe to use. bool IsSafe(Player* player); 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;