From 8d7766662415af8b77823073fa684eb54c8e214d Mon Sep 17 00:00:00 2001 From: Yunfan Li Date: Mon, 5 Aug 2024 15:45:37 +0800 Subject: [PATCH] Improve party member to heal and has aura to dispel check performance --- src/PlayerbotAI.cpp | 35 ++++++++++++----------- src/strategy/triggers/CureTriggers.cpp | 6 ++++ src/strategy/triggers/CureTriggers.h | 1 + src/strategy/values/PartyMemberToHeal.cpp | 32 ++++++++++++++++----- src/strategy/values/PartyMemberValue.cpp | 4 +-- 5 files changed, 52 insertions(+), 26 deletions(-) diff --git a/src/PlayerbotAI.cpp b/src/PlayerbotAI.cpp index 1b8b7314..20f10ac5 100644 --- a/src/PlayerbotAI.cpp +++ b/src/PlayerbotAI.cpp @@ -3285,28 +3285,29 @@ bool PlayerbotAI::HasAuraToDispel(Unit* target, uint32 dispelType) return false; } bool isFriend = bot->IsFriendlyTo(target); - for (uint32 type = SPELL_AURA_NONE; type < TOTAL_AURAS; ++type) + Unit::VisibleAuraMap const* visibleAuras = target->GetVisibleAuras(); + for (Unit::VisibleAuraMap::const_iterator itr = visibleAuras->begin(); itr != visibleAuras->end(); ++itr) { - Unit::AuraEffectList const& auras = target->GetAuraEffectsByType((AuraType)type); - for (AuraEffect const* aurEff : auras) - { - Aura const* aura = aurEff->GetBase(); - SpellInfo const* spellInfo = aura->GetSpellInfo(); + Aura* aura = itr->second->GetBase(); - bool isPositiveSpell = spellInfo->IsPositive(); - if (isPositiveSpell && isFriend) - continue; + if (aura->IsPassive()) + continue; - if (!isPositiveSpell && !isFriend) - continue; + if (sPlayerbotAIConfig->dispelAuraDuration && aura->GetDuration() && + aura->GetDuration() < (int32)sPlayerbotAIConfig->dispelAuraDuration) + continue; - if (sPlayerbotAIConfig->dispelAuraDuration && aura->GetDuration() && - aura->GetDuration() < (int32)sPlayerbotAIConfig->dispelAuraDuration) - continue; + SpellInfo const* spellInfo = aura->GetSpellInfo(); - if (canDispel(spellInfo, dispelType)) - return true; - } + bool isPositiveSpell = spellInfo->IsPositive(); + if (isPositiveSpell && isFriend) + continue; + + if (!isPositiveSpell && !isFriend) + continue; + + if (canDispel(spellInfo, dispelType)) + return true; } return false; } diff --git a/src/strategy/triggers/CureTriggers.cpp b/src/strategy/triggers/CureTriggers.cpp index 9c7369d4..abd23022 100644 --- a/src/strategy/triggers/CureTriggers.cpp +++ b/src/strategy/triggers/CureTriggers.cpp @@ -19,4 +19,10 @@ Value* PartyMemberNeedCureTrigger::GetTargetValue() return context->GetValue("party member to dispel", dispelType); } +bool PartyMemberNeedCureTrigger::IsActive() +{ + Unit* target = GetTarget(); + return target && target->IsInWorld(); +} + bool NeedWorldBuffTrigger::IsActive() { return !WorldBuffAction::NeedWorldBuffs(bot).empty(); } diff --git a/src/strategy/triggers/CureTriggers.h b/src/strategy/triggers/CureTriggers.h index a18f8a10..63e5d339 100644 --- a/src/strategy/triggers/CureTriggers.h +++ b/src/strategy/triggers/CureTriggers.h @@ -46,6 +46,7 @@ public: } Value* GetTargetValue() override; + bool IsActive() override; }; class NeedWorldBuffTrigger : public Trigger diff --git a/src/strategy/values/PartyMemberToHeal.cpp b/src/strategy/values/PartyMemberToHeal.cpp index 5c158428..e16d63d0 100644 --- a/src/strategy/values/PartyMemberToHeal.cpp +++ b/src/strategy/values/PartyMemberToHeal.cpp @@ -41,36 +41,54 @@ Unit* PartyMemberToHeal::Calculate() for (GroupReference* gref = group->GetFirstMember(); gref; gref = gref->next()) { Player* player = gref->GetSource(); - if (player && Check(player) && player->IsAlive()) + if (player && player->IsAlive()) { uint8 health = player->GetHealthPct(); if (isRaid || health < sPlayerbotAIConfig->mediumHealth || !IsTargetOfSpellCast(player, predicate)) { + uint32 probeValue = 100; if (player->GetDistance2d(bot) > sPlayerbotAIConfig->healDistance) { - calc.probe(health + 30, player); + probeValue = health + 30; } else { - calc.probe(health + player->GetDistance2d(bot) / 10, player); + probeValue = health + player->GetDistance2d(bot) / 10; + } + // delay Check player to here for better performance + if (probeValue < calc.minValue && Check(player)) + { + calc.probe(probeValue, player); } } } Pet* pet = player->GetPet(); - if (pet && Check(pet) && pet->IsAlive()) + if (pet && pet->IsAlive()) { uint8 health = ((Unit*)pet)->GetHealthPct(); + uint32 probeValue = 100; if (isRaid || health < sPlayerbotAIConfig->mediumHealth) - calc.probe(health + 30, pet); + probeValue = health + 30; + // delay Check pet to here for better performance + if (probeValue < calc.minValue && Check(pet)) + { + calc.probe(probeValue, pet); + } } Unit* charm = player->GetCharm(); - if (charm && Check(charm) && charm->IsAlive()) + if (charm && charm->IsAlive()) { uint8 health = charm->GetHealthPct(); + uint32 probeValue = 100; if (isRaid || health < sPlayerbotAIConfig->mediumHealth) - calc.probe(health, charm); + probeValue = health + 30; + // delay Check charm to here for better performance + if (probeValue < calc.minValue && Check(charm)) + { + calc.probe(probeValue, charm); + } } } return (Unit*)calc.param; diff --git a/src/strategy/values/PartyMemberValue.cpp b/src/strategy/values/PartyMemberValue.cpp index 36f79e2e..023eeefd 100644 --- a/src/strategy/values/PartyMemberValue.cpp +++ b/src/strategy/values/PartyMemberValue.cpp @@ -12,11 +12,11 @@ Unit* PartyMemberValue::FindPartyMember(std::vector* party, FindPlayerP { for (Player* player : *party) { - if (Check(player) && predicate.Check(player)) + if (predicate.Check(player) && Check(player)) return player; if (Pet* pet = player->GetPet()) - if (Check(pet) && predicate.Check(pet)) + if (predicate.Check(pet) && Check(pet)) return pet; }