From 89941ada48a0332d3d9b14884b03f00c42122353 Mon Sep 17 00:00:00 2001 From: Yunfan Li Date: Sun, 19 Jan 2025 22:39:34 +0800 Subject: [PATCH] Magic focus magic on party --- .../mage/GenericMageNonCombatStrategy.cpp | 3 ++ src/strategy/mage/GenericMageStrategy.cpp | 3 +- src/strategy/mage/MageActions.cpp | 45 +++++++++++++++++++ src/strategy/mage/MageActions.h | 7 +++ src/strategy/mage/MageAiObjectContext.cpp | 4 ++ src/strategy/mage/MageTriggers.cpp | 21 +++++++++ src/strategy/mage/MageTriggers.h | 7 +++ 7 files changed, 88 insertions(+), 2 deletions(-) diff --git a/src/strategy/mage/GenericMageNonCombatStrategy.cpp b/src/strategy/mage/GenericMageNonCombatStrategy.cpp index 963d9edb..8e7a475e 100644 --- a/src/strategy/mage/GenericMageNonCombatStrategy.cpp +++ b/src/strategy/mage/GenericMageNonCombatStrategy.cpp @@ -54,6 +54,9 @@ void GenericMageNonCombatStrategy::InitTriggers(std::vector& trigg triggers.push_back( new TriggerNode("arcane intellect", NextAction::array(0, new NextAction("arcane intellect", 21.0f), nullptr))); + + triggers.push_back( + new TriggerNode("no focus magic", NextAction::array(0, new NextAction("focus magic on party", 19.0f), nullptr))); // triggers.push_back(new TriggerNode("no drink", NextAction::array(0, new NextAction("conjure water", 16.0f), // nullptr))); triggers.push_back(new TriggerNode("no food", NextAction::array(0, new NextAction("conjure // food", 15.0f), nullptr))); diff --git a/src/strategy/mage/GenericMageStrategy.cpp b/src/strategy/mage/GenericMageStrategy.cpp index c5a836c9..453dbf7a 100644 --- a/src/strategy/mage/GenericMageStrategy.cpp +++ b/src/strategy/mage/GenericMageStrategy.cpp @@ -194,8 +194,7 @@ void MageBoostStrategy::InitTriggers(std::vector& triggers) triggers.push_back(new TriggerNode("icy veins", NextAction::array(0, new NextAction("icy veins", 50.0f), nullptr))); triggers.push_back( new TriggerNode("presence of mind", NextAction::array(0, new NextAction("presence of mind", 42.0f), nullptr))); - // triggers.push_back(new TriggerNode("arcane power", NextAction::array(0, new NextAction("arcane power", 41.0f), - // nullptr))); + // triggers.push_back(new TriggerNode("arcane power", NextAction::array(0, new NextAction("arcane power", 41.0f), nullptr))); triggers.push_back( new TriggerNode("mirror image", NextAction::array(0, new NextAction("mirror image", 41.0f), nullptr))); } diff --git a/src/strategy/mage/MageActions.cpp b/src/strategy/mage/MageActions.cpp index 7f251f83..786b1717 100644 --- a/src/strategy/mage/MageActions.cpp +++ b/src/strategy/mage/MageActions.cpp @@ -5,8 +5,10 @@ #include "MageActions.h" +#include "PlayerbotAIConfig.h" #include "Playerbots.h" #include "ServerFacade.h" +#include "SharedDefines.h" Value* CastPolymorphAction::GetTargetValue() { return context->GetValue("cc target", getName()); } @@ -42,4 +44,47 @@ bool CastBlastWaveAction::isUseful() return false; bool targetClose = bot->IsWithinCombatRange(target, 10.0f); return targetClose; +} + +Unit* CastFocusMagicOnPartyAction::GetTarget() +{ + Group* group = bot->GetGroup(); + if (!group) + return nullptr; + + Unit* casterDps = nullptr; + Unit* healer = nullptr; + Unit* target = nullptr; + for (GroupReference* ref = group->GetFirstMember(); ref; ref = ref->next()) + { + Player* member = ref->GetSource(); + if (!member || member == bot || !member->IsAlive()) + continue; + + if (member->GetMap() != bot->GetMap() || bot->GetDistance(member) > sPlayerbotAIConfig->spellDistance) + continue; + + if (member->HasAura(54646)) + continue; + + if (member->getClass() == CLASS_MAGE) + return member; + + if (!casterDps && botAI->IsCaster(member) && botAI->IsDps(member)) + casterDps = member; + + if (!healer && botAI->IsHeal(member)) + healer = member; + + if (!target) + target = member; + } + + if (casterDps) + return casterDps; + + if (healer) + return healer; + + return target; } \ No newline at end of file diff --git a/src/strategy/mage/MageActions.h b/src/strategy/mage/MageActions.h index 1fae11f7..66f6157e 100644 --- a/src/strategy/mage/MageActions.h +++ b/src/strategy/mage/MageActions.h @@ -302,4 +302,11 @@ public: CastMirrorImageAction(PlayerbotAI* botAI) : CastBuffSpellAction(botAI, "mirror image") {} }; +class CastFocusMagicOnPartyAction : public CastSpellAction +{ +public: + CastFocusMagicOnPartyAction(PlayerbotAI* botAI) : CastSpellAction(botAI, "focus magic") {} + Unit* GetTarget() override; +}; + #endif diff --git a/src/strategy/mage/MageAiObjectContext.cpp b/src/strategy/mage/MageAiObjectContext.cpp index ddd795a0..4439194f 100644 --- a/src/strategy/mage/MageAiObjectContext.cpp +++ b/src/strategy/mage/MageAiObjectContext.cpp @@ -108,6 +108,7 @@ public: creators["mirror image"] = &MageTriggerFactoryInternal::mirror_image; creators["frost nova on target"] = &MageTriggerFactoryInternal::frost_nova_on_target; creators["frostbite on target"] = &MageTriggerFactoryInternal::frostbite_on_target; + creators["no focus magic"] = &MageTriggerFactoryInternal::no_focus_magic; } private: @@ -141,6 +142,7 @@ private: static Trigger* mirror_image(PlayerbotAI* botAI) { return new MirrorImageTrigger(botAI); } static Trigger* frost_nova_on_target(PlayerbotAI* botAI) { return new FrostNovaOnTargetTrigger(botAI); } static Trigger* frostbite_on_target(PlayerbotAI* botAI) { return new FrostbiteOnTargetTrigger(botAI); } + static Trigger* no_focus_magic(PlayerbotAI* botAI) { return new NoFocusMagicTrigger(botAI); } }; class MageAiObjectContextInternal : public NamedObjectContext @@ -196,6 +198,7 @@ public: creators["fire ward"] = &MageAiObjectContextInternal::fire_ward; creators["frost ward"] = &MageAiObjectContextInternal::frost_ward; creators["mirror image"] = &MageAiObjectContextInternal::mirror_image; + creators["focus magic on party"] = &MageAiObjectContextInternal::focus_magic_on_party; } private: @@ -253,6 +256,7 @@ private: return new CastCounterspellOnEnemyHealerAction(botAI); } static Action* mirror_image(PlayerbotAI* botAI) { return new CastMirrorImageAction(botAI); } + static Action* focus_magic_on_party(PlayerbotAI* botAI) { return new CastFocusMagicOnPartyAction(botAI); } }; MageAiObjectContext::MageAiObjectContext(PlayerbotAI* botAI) : AiObjectContext(botAI) diff --git a/src/strategy/mage/MageTriggers.cpp b/src/strategy/mage/MageTriggers.cpp index 2e80ffb6..956fa752 100644 --- a/src/strategy/mage/MageTriggers.cpp +++ b/src/strategy/mage/MageTriggers.cpp @@ -63,3 +63,24 @@ bool FrostbiteOnTargetTrigger::IsActive() } return botAI->HasAura(spell, target); } + +bool NoFocusMagicTrigger::IsActive() +{ + if (!bot->HasSpell(54646)) + return false; + + Group* group = bot->GetGroup(); + if (!group) + return false; + + for (GroupReference* ref = group->GetFirstMember(); ref; ref = ref->next()) + { + Player* member = ref->GetSource(); + if (!member || member == bot || !member->IsAlive()) + continue; + + if (member->HasAura(54646, bot->GetGUID())) + return false; + } + return true; +} diff --git a/src/strategy/mage/MageTriggers.h b/src/strategy/mage/MageTriggers.h index 1c165c5b..59cb0fee 100644 --- a/src/strategy/mage/MageTriggers.h +++ b/src/strategy/mage/MageTriggers.h @@ -194,4 +194,11 @@ public: bool IsActive() override; }; +class NoFocusMagicTrigger : public Trigger +{ +public: + NoFocusMagicTrigger(PlayerbotAI* botAI) : Trigger(botAI, "no focus magic") {} + bool IsActive() override; +}; + #endif