diff --git a/src/strategy/actions/AttackAction.cpp b/src/strategy/actions/AttackAction.cpp index d1dd232be..0ff90ba72 100644 --- a/src/strategy/actions/AttackAction.cpp +++ b/src/strategy/actions/AttackAction.cpp @@ -112,8 +112,9 @@ bool AttackAction::Attack(Unit* target, bool with_pet /*true*/) bot->SetSelection(target->GetGUID()); Unit* oldTarget = context->GetValue("current target")->Get(); + bool melee = bot->IsWithinMeleeRange(target) || botAI->IsMelee(bot); - if (oldTarget == target && botAI->GetState() == BOT_STATE_COMBAT && bot->GetVictim() == target) + if (oldTarget == target && botAI->GetState() == BOT_STATE_COMBAT && bot->GetVictim() == target && (bot->HasUnitState(UNIT_STATE_MELEE_ATTACKING) == melee)) return false; context->GetValue("old target")->Set(oldTarget); @@ -129,7 +130,6 @@ bool AttackAction::Attack(Unit* target, bool with_pet /*true*/) bot->StopMoving(); } - bool melee = bot->IsWithinMeleeRange(target) || botAI->IsMelee(bot); if (IsMovingAllowed() && !bot->HasInArc(CAST_ANGLE_IN_FRONT, target)) { diff --git a/src/strategy/actions/ChooseRpgTargetAction.cpp b/src/strategy/actions/ChooseRpgTargetAction.cpp index 0f5bb6bc9..d376d2365 100644 --- a/src/strategy/actions/ChooseRpgTargetAction.cpp +++ b/src/strategy/actions/ChooseRpgTargetAction.cpp @@ -54,70 +54,58 @@ float ChooseRpgTargetAction::getMaxRelevance(GuidPosition guidP) GuidPosition currentRpgTarget = AI_VALUE(GuidPosition, "rpg target"); SET_AI_VALUE(GuidPosition, "rpg target", guidP); - Strategy* rpgStrategy; + Strategy* rpgStrategy = botAI->GetAiObjectContext()->GetStrategy("rpg"); + if (!rpgStrategy) return 0.0f; std::vector triggerNodes; + rpgStrategy->InitTriggers(triggerNodes); float maxRelevance = 0.0f; - for (auto& strategy : botAI->GetAiObjectContext()->GetSupportedStrategies()) + for (auto triggerNode : triggerNodes) { - if (strategy.find("rpg") == std::string::npos) - continue; - - if (!botAI->HasStrategy(strategy, BotState::BOT_STATE_NON_COMBAT)) - continue; + Trigger* trigger = context->GetTrigger(triggerNode->getName()); - rpgStrategy = botAI->GetAiObjectContext()->GetStrategy(strategy); - - rpgStrategy->InitTriggers(triggerNodes); - - for (auto triggerNode : triggerNodes) + if (trigger) { - Trigger* trigger = context->GetTrigger(triggerNode->getName()); - - if (trigger) - { - triggerNode->setTrigger(trigger); + triggerNode->setTrigger(trigger); - if (triggerNode->getFirstRelevance() < maxRelevance || triggerNode->getFirstRelevance() > 2.0f) - continue; + if (triggerNode->getFirstRelevance() < maxRelevance || triggerNode->getFirstRelevance() > 2.0f) + continue; - Trigger* trigger = triggerNode->getTrigger(); + Trigger* trigger = triggerNode->getTrigger(); - if (!trigger->IsActive()) - continue; + if (!trigger->IsActive()) + continue; - NextAction** nextActions = triggerNode->getHandlers(); + NextAction** nextActions = triggerNode->getHandlers(); - bool isRpg = false; + bool isRpg = false; - for (int32 i = 0; i < NextAction::size(nextActions); i++) - { - NextAction* nextAction = nextActions[i]; - - Action* action = botAI->GetAiObjectContext()->GetAction(nextAction->getName()); + for (int32 i = 0; i < NextAction::size(nextActions); i++) + { + NextAction* nextAction = nextActions[i]; - if (dynamic_cast(action)) - isRpg = true; - } - NextAction::destroy(nextActions); + Action* action = botAI->GetAiObjectContext()->GetAction(nextAction->getName()); - if (isRpg) - { - maxRelevance = triggerNode->getFirstRelevance(); - rgpActionReason[guidP] = triggerNode->getName(); - } + if (dynamic_cast(action)) + isRpg = true; } - } + NextAction::destroy(nextActions); - for (auto trigger : triggerNodes) - { - delete trigger; + if (isRpg) + { + maxRelevance = triggerNode->getFirstRelevance(); + rgpActionReason[guidP] = triggerNode->getName(); + } } + } - triggerNodes.clear(); + for (auto trigger : triggerNodes) + { + delete trigger; } + triggerNodes.clear(); SET_AI_VALUE(GuidPosition, "rpg target", currentRpgTarget);