From 81149246c4b37a589588596f88ed7198ab2016de Mon Sep 17 00:00:00 2001 From: Yunfan Li Date: Sun, 11 Jun 2023 22:30:47 +0800 Subject: [PATCH] feat(performance): reduce lag impact by attackers and yieldthread --- src/PlayerbotAIBase.cpp | 2 +- src/strategy/values/AttackersValue.cpp | 23 ++++++++++++----------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/PlayerbotAIBase.cpp b/src/PlayerbotAIBase.cpp index 203cfec7..690fca26 100644 --- a/src/PlayerbotAIBase.cpp +++ b/src/PlayerbotAIBase.cpp @@ -54,7 +54,7 @@ bool PlayerbotAIBase::CanUpdateAI() void PlayerbotAIBase::YieldThread(bool delay) { if (nextAICheckDelay < sPlayerbotAIConfig->reactDelay) - nextAICheckDelay = delay ? sPlayerbotAIConfig->reactDelay * 10 : sPlayerbotAIConfig->reactDelay; + nextAICheckDelay = delay ? sPlayerbotAIConfig->reactDelay * 10 : sPlayerbotAIConfig->reactDelay * 5; } bool PlayerbotAIBase::IsActive() diff --git a/src/strategy/values/AttackersValue.cpp b/src/strategy/values/AttackersValue.cpp index d661046c..c5ec4847 100644 --- a/src/strategy/values/AttackersValue.cpp +++ b/src/strategy/values/AttackersValue.cpp @@ -63,20 +63,21 @@ void AttackersValue::AddAttackersOf(Player* player, std::set& targets) if (!player || !player->IsInWorld() || player->IsBeingTeleported()) return; - std::list units; - Acore::AnyUnfriendlyUnitInObjectRangeCheck u_check(player, player, sPlayerbotAIConfig->sightDistance); - Acore::UnitListSearcher searcher(player, units, u_check); - Cell::VisitAllObjects(player, searcher, sPlayerbotAIConfig->sightDistance); + HostileRefMgr& refManager = player->getHostileRefMgr(); + HostileReference *ref = refManager.getFirst(); + if (!ref) + return; - for (Unit* unit : units) + while( ref ) { - if (!player->GetGroup()) - { - if (!unit->GetThreatMgr().GetThreat(player) && (!unit->GetThreatMgr().getCurrentVictim() || unit->GetThreatMgr().getCurrentVictim()->getTarget() != player)) - continue; - } + ThreatMgr *threatMgr = ref->GetSource(); + Unit *attacker = threatMgr->GetOwner(); + Unit *victim = attacker->GetVictim(); - targets.insert(unit); + if (player->IsValidAttackTarget(attacker) && player->GetDistance2d(attacker) < sPlayerbotAIConfig->sightDistance) { + targets.insert(attacker); + } + ref = ref->next(); } }