From 7772f2a3a722a7bfb7fd8e21d6ef9ed703fa2a2a Mon Sep 17 00:00:00 2001 From: Yunfan Li Date: Wed, 14 Aug 2024 23:24:44 +0800 Subject: [PATCH 1/2] Fix lag in choose rpg target --- .../actions/ChooseRpgTargetAction.cpp | 84 ++++++++----------- 1 file changed, 36 insertions(+), 48 deletions(-) diff --git a/src/strategy/actions/ChooseRpgTargetAction.cpp b/src/strategy/actions/ChooseRpgTargetAction.cpp index 0f5bb6bc..d376d236 100644 --- a/src/strategy/actions/ChooseRpgTargetAction.cpp +++ b/src/strategy/actions/ChooseRpgTargetAction.cpp @@ -54,71 +54,59 @@ 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; + Trigger* trigger = context->GetTrigger(triggerNode->getName()); - if (!botAI->HasStrategy(strategy, BotState::BOT_STATE_NON_COMBAT)) - continue; - - rpgStrategy = botAI->GetAiObjectContext()->GetStrategy(strategy); - - rpgStrategy->InitTriggers(triggerNodes); - - for (auto triggerNode : triggerNodes) + if (trigger) { - Trigger* trigger = context->GetTrigger(triggerNode->getName()); + triggerNode->setTrigger(trigger); - if (trigger) + if (triggerNode->getFirstRelevance() < maxRelevance || triggerNode->getFirstRelevance() > 2.0f) + continue; + + Trigger* trigger = triggerNode->getTrigger(); + + if (!trigger->IsActive()) + continue; + + NextAction** nextActions = triggerNode->getHandlers(); + + bool isRpg = false; + + for (int32 i = 0; i < NextAction::size(nextActions); i++) { - triggerNode->setTrigger(trigger); + NextAction* nextAction = nextActions[i]; - if (triggerNode->getFirstRelevance() < maxRelevance || triggerNode->getFirstRelevance() > 2.0f) - continue; + Action* action = botAI->GetAiObjectContext()->GetAction(nextAction->getName()); - Trigger* trigger = triggerNode->getTrigger(); + if (dynamic_cast(action)) + isRpg = true; + } + NextAction::destroy(nextActions); - if (!trigger->IsActive()) - continue; - - NextAction** nextActions = triggerNode->getHandlers(); - - bool isRpg = false; - - for (int32 i = 0; i < NextAction::size(nextActions); i++) - { - NextAction* nextAction = nextActions[i]; - - Action* action = botAI->GetAiObjectContext()->GetAction(nextAction->getName()); - - if (dynamic_cast(action)) - isRpg = true; - } - NextAction::destroy(nextActions); - - if (isRpg) - { - maxRelevance = triggerNode->getFirstRelevance(); - rgpActionReason[guidP] = triggerNode->getName(); - } + if (isRpg) + { + maxRelevance = triggerNode->getFirstRelevance(); + rgpActionReason[guidP] = triggerNode->getName(); } } - - for (auto trigger : triggerNodes) - { - delete trigger; - } - - triggerNodes.clear(); } + for (auto trigger : triggerNodes) + { + delete trigger; + } + triggerNodes.clear(); + SET_AI_VALUE(GuidPosition, "rpg target", currentRpgTarget); if (!maxRelevance) From f1c7071b938188e20c2a2148a12dab54fc8bbad0 Mon Sep 17 00:00:00 2001 From: Yunfan Li Date: Wed, 14 Aug 2024 23:26:09 +0800 Subject: [PATCH 2/2] Fix hunter melee attack --- src/strategy/actions/AttackAction.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/strategy/actions/AttackAction.cpp b/src/strategy/actions/AttackAction.cpp index d1dd232b..0ff90ba7 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)) {