From 30c142aacab881335e1e717996a6a5ef2995fe82 Mon Sep 17 00:00:00 2001 From: kadeshar Date: Sat, 4 Apr 2026 07:31:42 +0200 Subject: [PATCH] Challenging Roar support (#2238) ## Pull Request Description Added Challenging Roar support to druid taunt spell Related with: #2002 ## How to Test the Changes - run dungeon with druid tank and monitor spell usage ## Impact Assessment - Does this change increase per-bot/per-tick processing or risk scaling poorly with thousands of bots? - - [x] No, not at all - - [ ] Minimal impact (**explain below**) - - [ ] Moderate impact (**explain below**) - Does this change modify default bot behavior? - - [ ] No - - [x] Yes (**explain why**) Druid also use Challenging Roar as taunt spell - Does this change add new decision branches or increase maintenance complexity? - - [x] No - - [ ] Yes (**explain below**) ## Messages to Translate - Does this change add bot messages to translate? - - [x] No - - [ ] Yes (**list messages in the table**) | Message key | Default message | | --------------- | ------------------ | | | | | | | ## AI Assistance - Was AI assistance used while working on this change? - - [x] No - - [ ] Yes (**explain below**) ## Final Checklist - - [x] Stability is not compromised. - - [x] Performance impact is understood, tested, and acceptable. - - [x] Added logic complexity is justified and explained. - - [x] Documentation updated if needed (Conf comments, WiKi commands). ## Notes for Reviewers --- src/Ai/Class/Druid/Action/DruidBearActions.h | 6 ++++++ src/Ai/Class/Druid/DruidAiObjectContext.cpp | 2 ++ src/Ai/Class/Druid/Strategy/BearTankDruidStrategy.cpp | 1 + 3 files changed, 9 insertions(+) diff --git a/src/Ai/Class/Druid/Action/DruidBearActions.h b/src/Ai/Class/Druid/Action/DruidBearActions.h index caf369be3..d5354b7e6 100644 --- a/src/Ai/Class/Druid/Action/DruidBearActions.h +++ b/src/Ai/Class/Druid/Action/DruidBearActions.h @@ -23,6 +23,12 @@ public: CastGrowlAction(PlayerbotAI* botAI) : CastSpellAction(botAI, "growl") {} }; +class CastChallengingRoarAction : public CastMeleeDebuffSpellAction +{ +public: + CastChallengingRoarAction(PlayerbotAI* botAI) : CastMeleeDebuffSpellAction(botAI, "challenging roar") {} +}; + class CastMaulAction : public CastMeleeSpellAction { public: diff --git a/src/Ai/Class/Druid/DruidAiObjectContext.cpp b/src/Ai/Class/Druid/DruidAiObjectContext.cpp index 3a638eedc..17b561d19 100644 --- a/src/Ai/Class/Druid/DruidAiObjectContext.cpp +++ b/src/Ai/Class/Druid/DruidAiObjectContext.cpp @@ -183,6 +183,7 @@ public: creators["bash"] = &DruidAiObjectContextInternal::bash; creators["swipe"] = &DruidAiObjectContextInternal::swipe; creators["growl"] = &DruidAiObjectContextInternal::growl; + creators["challenging roar"] = &DruidAiObjectContextInternal::challenging_roar; creators["demoralizing roar"] = &DruidAiObjectContextInternal::demoralizing_roar; creators["hibernate"] = &DruidAiObjectContextInternal::hibernate; creators["entangling roots"] = &DruidAiObjectContextInternal::entangling_roots; @@ -277,6 +278,7 @@ private: static Action* bash(PlayerbotAI* botAI) { return new CastBashAction(botAI); } static Action* swipe(PlayerbotAI* botAI) { return new CastSwipeAction(botAI); } static Action* growl(PlayerbotAI* botAI) { return new CastGrowlAction(botAI); } + static Action* challenging_roar(PlayerbotAI* botAI) { return new CastChallengingRoarAction(botAI); } static Action* demoralizing_roar(PlayerbotAI* botAI) { return new CastDemoralizingRoarAction(botAI); } static Action* moonkin_form(PlayerbotAI* botAI) { return new CastMoonkinFormAction(botAI); } static Action* hibernate(PlayerbotAI* botAI) { return new CastHibernateAction(botAI); } diff --git a/src/Ai/Class/Druid/Strategy/BearTankDruidStrategy.cpp b/src/Ai/Class/Druid/Strategy/BearTankDruidStrategy.cpp index 4a60fbd3e..13af635c3 100644 --- a/src/Ai/Class/Druid/Strategy/BearTankDruidStrategy.cpp +++ b/src/Ai/Class/Druid/Strategy/BearTankDruidStrategy.cpp @@ -212,6 +212,7 @@ void BearTankDruidStrategy::InitTriggers(std::vector& triggers) } ) ); + triggers.push_back(new TriggerNode("high aoe", {NextAction("challenging roar", ACTION_HIGH + 8)})); triggers.push_back( new TriggerNode( "lose aggro",