From 085b2e7f193f07be95df11599f27b215baf73f8f Mon Sep 17 00:00:00 2001 From: Yunfan Li Date: Mon, 5 Aug 2024 17:04:21 +0800 Subject: [PATCH] Improve containsstrategy performance --- src/PlayerbotAI.cpp | 2 +- src/strategy/Engine.cpp | 2 ++ src/strategy/Engine.h | 3 ++- src/strategy/hunter/GenericHunterStrategy.cpp | 4 +++- src/strategy/hunter/HunterAiObjectContext.cpp | 4 +++- src/strategy/hunter/HunterTriggers.cpp | 6 ------ src/strategy/hunter/HunterTriggers.h | 7 ++++++- 7 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/PlayerbotAI.cpp b/src/PlayerbotAI.cpp index 20f10ac5..0b4db3ef 100644 --- a/src/PlayerbotAI.cpp +++ b/src/PlayerbotAI.cpp @@ -1379,7 +1379,7 @@ bool PlayerbotAI::ContainsStrategy(StrategyType type) { for (uint8 i = 0; i < BOT_STATE_MAX; i++) { - if (engines[i]->ContainsStrategy(type)) + if (engines[i]->HasStrategyType(type)) return true; } diff --git a/src/strategy/Engine.cpp b/src/strategy/Engine.cpp index d6960a68..a4e3845d 100644 --- a/src/strategy/Engine.cpp +++ b/src/strategy/Engine.cpp @@ -86,6 +86,7 @@ Engine::~Engine(void) void Engine::Reset() { + strategyTypeMask = 0; ActionNode* action = nullptr; do { @@ -120,6 +121,7 @@ void Engine::Init() for (std::map::iterator i = strategies.begin(); i != strategies.end(); i++) { Strategy* strategy = i->second; + strategyTypeMask |= strategy->GetType(); strategy->InitMultipliers(multipliers); strategy->InitTriggers(triggers); diff --git a/src/strategy/Engine.h b/src/strategy/Engine.h index f25f97b3..bd51c16b 100644 --- a/src/strategy/Engine.h +++ b/src/strategy/Engine.h @@ -83,7 +83,7 @@ public: void AddActionExecutionListener(ActionExecutionListener* listener) { actionExecutionListeners.Add(listener); } void removeActionExecutionListener(ActionExecutionListener* listener) { actionExecutionListeners.Remove(listener); } - + bool HasStrategyType(StrategyType type) { return strategyTypeMask & type; } virtual ~Engine(void); bool testMode; @@ -112,6 +112,7 @@ protected: std::map strategies; float lastRelevance; std::string lastAction; + uint32 strategyTypeMask; }; #endif diff --git a/src/strategy/hunter/GenericHunterStrategy.cpp b/src/strategy/hunter/GenericHunterStrategy.cpp index d245400a..ff124fb8 100644 --- a/src/strategy/hunter/GenericHunterStrategy.cpp +++ b/src/strategy/hunter/GenericHunterStrategy.cpp @@ -98,7 +98,9 @@ void GenericHunterStrategy::InitTriggers(std::vector& triggers) new TriggerNode("misdirection on main tank", NextAction::array(0, new NextAction("misdirection on main tank", ACTION_HIGH + 7), NULL))); triggers.push_back( - new TriggerNode("tranquilizing shot", NextAction::array(0, new NextAction("tranquilizing shot", 61.0f), NULL))); + new TriggerNode("tranquilizing shot enrage", NextAction::array(0, new NextAction("tranquilizing shot", 61.0f), NULL))); + triggers.push_back( + new TriggerNode("tranquilizing shot magic", NextAction::array(0, new NextAction("tranquilizing shot", 61.0f), NULL))); } NextAction** HunterBoostStrategy::getDefaultActions() diff --git a/src/strategy/hunter/HunterAiObjectContext.cpp b/src/strategy/hunter/HunterAiObjectContext.cpp index 1a4e855f..588888a9 100644 --- a/src/strategy/hunter/HunterAiObjectContext.cpp +++ b/src/strategy/hunter/HunterAiObjectContext.cpp @@ -85,7 +85,8 @@ public: creators["switch to melee"] = &HunterTriggerFactoryInternal::switch_to_melee; creators["switch to ranged"] = &HunterTriggerFactoryInternal::switch_to_ranged; creators["misdirection on main tank"] = &HunterTriggerFactoryInternal::misdirection_on_main_tank; - creators["tranquilizing shot"] = &HunterTriggerFactoryInternal::remove_enrage; + creators["tranquilizing shot enrage"] = &HunterTriggerFactoryInternal::remove_enrage; + creators["tranquilizing shot magic"] = &HunterTriggerFactoryInternal::remove_magic; } private: @@ -118,6 +119,7 @@ private: static Trigger* switch_to_ranged(PlayerbotAI* botAI) { return new SwitchToRangedTrigger(botAI); } static Trigger* misdirection_on_main_tank(PlayerbotAI* ai) { return new MisdirectionOnMainTankTrigger(ai); } static Trigger* remove_enrage(PlayerbotAI* ai) { return new TargetRemoveEnrageTrigger(ai); } + static Trigger* remove_magic(PlayerbotAI* ai) { return new TargetRemoveMagicTrigger(ai); } }; class HunterAiObjectContextInternal : public NamedObjectContext diff --git a/src/strategy/hunter/HunterTriggers.cpp b/src/strategy/hunter/HunterTriggers.cpp index d581955d..941ce755 100644 --- a/src/strategy/hunter/HunterTriggers.cpp +++ b/src/strategy/hunter/HunterTriggers.cpp @@ -88,9 +88,3 @@ bool SwitchToMeleeTrigger::IsActive() (target->GetVictim() == bot && sServerFacade->IsDistanceLessOrEqualThan(AI_VALUE2(float, "distance", "current target"), 8.0f)); } - -bool TargetRemoveEnrageTrigger::IsActive() -{ - Unit* target = GetTarget(); - return target && (botAI->HasAuraToDispel(target, DISPEL_ENRAGE) || botAI->HasAuraToDispel(target, DISPEL_MAGIC)); -} \ No newline at end of file diff --git a/src/strategy/hunter/HunterTriggers.h b/src/strategy/hunter/HunterTriggers.h index 4b5a7078..2ff44fe3 100644 --- a/src/strategy/hunter/HunterTriggers.h +++ b/src/strategy/hunter/HunterTriggers.h @@ -170,6 +170,11 @@ class TargetRemoveEnrageTrigger : public TargetAuraDispelTrigger { public: TargetRemoveEnrageTrigger(PlayerbotAI* ai) : TargetAuraDispelTrigger(ai, "tranquilizing shot", DISPEL_ENRAGE) {} - bool IsActive() override; +}; + +class TargetRemoveMagicTrigger : public TargetAuraDispelTrigger +{ +public: + TargetRemoveMagicTrigger(PlayerbotAI* ai) : TargetAuraDispelTrigger(ai, "tranquilizing shot", DISPEL_MAGIC) {} }; #endif