From 64b09fd3ca570309b4bf1b82380830bc042fc781 Mon Sep 17 00:00:00 2001 From: Spargel Date: Sun, 27 Jul 2025 01:20:57 -0500 Subject: [PATCH 1/2] First pass for adding 'healer dps' check based on map ID. --- conf/playerbots.conf.dist | 8 ++++++++ src/AiFactory.cpp | 3 ++- src/PlayerbotAIConfig.cpp | 15 +++++++++++++++ src/PlayerbotAIConfig.h | 4 ++++ 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/conf/playerbots.conf.dist b/conf/playerbots.conf.dist index b64454ce..a217e6f2 100644 --- a/conf/playerbots.conf.dist +++ b/conf/playerbots.conf.dist @@ -808,6 +808,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 722e46b5..8b7152d6 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/PlayerbotAIConfig.cpp b/src/PlayerbotAIConfig.cpp index db1419a4..d84234af 100644 --- a/src/PlayerbotAIConfig.cpp +++ b/src/PlayerbotAIConfig.cpp @@ -190,6 +190,15 @@ bool PlayerbotAIConfig::Initialize() maxRandomBotsPriceChangeInterval = 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 @@ -666,6 +675,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 65b99c5d..0d9176ee 100644 --- a/src/PlayerbotAIConfig.h +++ b/src/PlayerbotAIConfig.h @@ -401,6 +401,10 @@ public: void loadWorldBuff(uint32 factionId, uint32 classId, uint32 specId, uint32 minLevel, uint32 maxLevel); 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() From 0d8e8fbd61a62bfaefad2a48939eb765e67b5b74 Mon Sep 17 00:00:00 2001 From: Spargel Date: Sun, 27 Jul 2025 02:29:07 -0500 Subject: [PATCH 2/2] Second pass for adding 'healer dps' check based on map ID. Now works when teleporting in addition to on init. --- src/PlayerbotAI.cpp | 12 ++++++++++++ src/PlayerbotAI.h | 1 + 2 files changed, 13 insertions(+) diff --git a/src/PlayerbotAI.cpp b/src/PlayerbotAI.cpp index d2e0f293..635c675d 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); } @@ -6390,3 +6391,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; };