diff --git a/conf/playerbots.conf.dist b/conf/playerbots.conf.dist index db894044..3b4a676f 100644 --- a/conf/playerbots.conf.dist +++ b/conf/playerbots.conf.dist @@ -809,6 +809,14 @@ AiPlayerbot.RandomBotNonCombatStrategies = "" AiPlayerbot.CombatStrategies = "" AiPlayerbot.NonCombatStrategies = "" +# Remove "healer dps" strategy on specified maps. +# Default: 0 (disabled) +AiPlayerbot.HealerDPSMapRestriction = 0 + +# List of Map IDs where "healer dps" strategy will be removed if AiPlayerbot.HealerDPSMapRestriction is enabled +# Default: (Dungeon and Raid maps) "33,34,36,43,47,48,70,90,109,129,209,229,230,329,349,389,429,1001,1004,1007,269,540,542,543,545,546,547,552,553,554,555,556,557,558,560,585,574,575,576,578,595,599,600,601,602,604,608,619,632,650,658,668,409,469,509,531,532,534,544,548,550,564,565,580,249,533,603,615,616,624,631,649,724" +AiPlayerbot.RestrictedHealerDPSMaps = "33,34,36,43,47,48,70,90,109,129,209,229,230,329,349,389,429,1001,1004,1007,269,540,542,543,545,546,547,552,553,554,555,556,557,558,560,585,574,575,576,578,595,599,600,601,602,604,608,619,632,650,658,668,409,469,509,531,532,534,544,548,550,564,565,580,249,533,603,615,616,624,631,649,724" + # # # diff --git a/src/AiFactory.cpp b/src/AiFactory.cpp index b44bc080..643899e9 100644 --- a/src/AiFactory.cpp +++ b/src/AiFactory.cpp @@ -420,7 +420,8 @@ void AiFactory::AddDefaultCombatStrategies(Player* player, PlayerbotAI* const fa { if (sPlayerbotAIConfig->autoSaveMana) engine->addStrategy("save mana", false); - engine->addStrategy("healer dps", false); + if (!sPlayerbotAIConfig->IsRestrictedHealerDPSMap(player->GetMapId())) + engine->addStrategy("healer dps", false); } if (facade->IsRealPlayer() || sRandomPlayerbotMgr->IsRandomBot(player)) { diff --git a/src/PlayerbotAI.cpp b/src/PlayerbotAI.cpp index b9847530..8060510c 100644 --- a/src/PlayerbotAI.cpp +++ b/src/PlayerbotAI.cpp @@ -722,6 +722,7 @@ void PlayerbotAI::HandleTeleportAck() // SetNextCheckDelay(urand(2000, 5000)); if (sPlayerbotAIConfig->applyInstanceStrategies) ApplyInstanceStrategies(bot->GetMapId(), true); + EvaluateHealerDpsStrategy(); Reset(true); } @@ -6407,3 +6408,14 @@ void PlayerbotAI::AddTimedEvent(std::function callback, uint32 delayMs) // Every Player already owns an EventMap called m_Events bot->m_Events.AddEvent(new LambdaEvent(std::move(callback)), bot->m_Events.CalculateTime(delayMs)); } + +void PlayerbotAI::EvaluateHealerDpsStrategy() +{ + if (!IsHeal(bot, true)) + return; + + if (sPlayerbotAIConfig->IsRestrictedHealerDPSMap(bot->GetMapId())) + ChangeStrategy("-healer dps", BOT_STATE_COMBAT); + else + ChangeStrategy("+healer dps", BOT_STATE_COMBAT); +} diff --git a/src/PlayerbotAI.h b/src/PlayerbotAI.h index 89326e08..758f05ba 100644 --- a/src/PlayerbotAI.h +++ b/src/PlayerbotAI.h @@ -401,6 +401,7 @@ public: void ClearStrategies(BotState type); std::vector GetStrategies(BotState type); void ApplyInstanceStrategies(uint32 mapId, bool tellMaster = false); + void EvaluateHealerDpsStrategy(); bool ContainsStrategy(StrategyType type); bool HasStrategy(std::string const name, BotState type); BotState GetState() { return currentState; }; diff --git a/src/PlayerbotAIConfig.cpp b/src/PlayerbotAIConfig.cpp index 8c32f371..8db503ac 100644 --- a/src/PlayerbotAIConfig.cpp +++ b/src/PlayerbotAIConfig.cpp @@ -190,6 +190,15 @@ bool PlayerbotAIConfig::Initialize() sConfigMgr->GetOption("AiPlayerbot.MaxRandomBotsPriceChangeInterval", 48 * HOUR); randomBotJoinLfg = sConfigMgr->GetOption("AiPlayerbot.RandomBotJoinLfg", true); + restrictHealerDPS = sConfigMgr->GetOption("AiPlayerbot.HealerDPSMapRestriction", false); + LoadList>( + sConfigMgr->GetOption("AiPlayerbot.RestrictedHealerDPSMaps", + "33,34,36,43,47,48,70,90,109,129,209,229,230,329,349,389,429,1001,1004," + "1007,269,540,542,543,545,546,547,552,553,554,555,556,557,558,560,585,574," + "575,576,578,595,599,600,601,602,604,608,619,632,650,658,668,409,469,509," + "531,532,534,544,548,550,564,565,580,249,533,603,615,616,624,631,649,724"), + restrictedHealerDPSMaps); + //////////////////////////// ICC EnableICCBuffs = sConfigMgr->GetOption("AiPlayerbot.EnableICCBuffs", true); @@ -653,6 +662,12 @@ bool PlayerbotAIConfig::IsInPvpProhibitedArea(uint32 id) return find(pvpProhibitedAreaIds.begin(), pvpProhibitedAreaIds.end(), id) != pvpProhibitedAreaIds.end(); } +bool PlayerbotAIConfig::IsRestrictedHealerDPSMap(uint32 mapId) const +{ + return restrictHealerDPS && + std::find(restrictedHealerDPSMaps.begin(), restrictedHealerDPSMaps.end(), mapId) != restrictedHealerDPSMaps.end(); +} + std::string const PlayerbotAIConfig::GetTimestampStr() { time_t t = time(nullptr); diff --git a/src/PlayerbotAIConfig.h b/src/PlayerbotAIConfig.h index a5f1f3ea..620288a3 100644 --- a/src/PlayerbotAIConfig.h +++ b/src/PlayerbotAIConfig.h @@ -402,6 +402,10 @@ public: static std::vector> ParseTempTalentsOrder(uint32 cls, std::string temp_talents_order); static std::vector> ParseTempPetTalentsOrder(uint32 spec, std::string temp_talents_order); + + bool restrictHealerDPS = false; + std::vector restrictedHealerDPSMaps; + bool IsRestrictedHealerDPSMap(uint32 mapId) const; }; #define sPlayerbotAIConfig PlayerbotAIConfig::instance()