diff options
author | Treeston <treeston.mmoc@gmail.com> | 2019-06-23 00:32:13 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-12-12 00:31:15 +0100 |
commit | 35e55f10899712435102764671241b94a2026599 (patch) | |
tree | 431aafcba232130d585fd8bebdf3609d770318a7 /src/server/game/Combat/ThreatManager.cpp | |
parent | dd22c6fe67711901587a0a2fe6ed5587dc6d5024 (diff) |
Core/Entities: Kick engagement logic upstairs to Unit (from ThreatManager), since all Units with AI need it (not just those with threat list). Fixes #17981.
(cherry picked from commit dbe3bbefe734f8824e8f07c302e256f0d446b974)
Diffstat (limited to 'src/server/game/Combat/ThreatManager.cpp')
-rw-r--r-- | src/server/game/Combat/ThreatManager.cpp | 42 |
1 files changed, 15 insertions, 27 deletions
diff --git a/src/server/game/Combat/ThreatManager.cpp b/src/server/game/Combat/ThreatManager.cpp index d6d6378373e..b52a67bb95b 100644 --- a/src/server/game/Combat/ThreatManager.cpp +++ b/src/server/game/Combat/ThreatManager.cpp @@ -164,7 +164,7 @@ void ThreatReference::UnregisterAndFree() return true; } -ThreatManager::ThreatManager(Unit* owner) : _owner(owner), _ownerCanHaveThreatList(false), _ownerEngaged(false), _needClientUpdate(false), _updateTimer(THREAT_UPDATE_INTERVAL), _currentVictimRef(nullptr), _fixateRef(nullptr) +ThreatManager::ThreatManager(Unit* owner) : _owner(owner), _ownerCanHaveThreatList(false), _needClientUpdate(false), _updateTimer(THREAT_UPDATE_INTERVAL), _currentVictimRef(nullptr), _fixateRef(nullptr) { for (int8 i = 0; i < MAX_SPELL_SCHOOL; ++i) _singleSchoolModifiers[i] = 1.0f; @@ -184,7 +184,7 @@ void ThreatManager::Initialize() void ThreatManager::Update(uint32 tdiff) { - if (!CanHaveThreatList() || !IsEngaged()) + if (!CanHaveThreatList() || IsThreatListEmpty()) return; if (_updateTimer <= tdiff) { @@ -290,13 +290,6 @@ void ThreatManager::EvaluateSuppressed(bool canExpire) } } -static void SaveCreatureHomePositionIfNeed(Creature* c) -{ - MovementGeneratorType const movetype = c->GetMotionMaster()->GetCurrentMovementGeneratorType(); - if (movetype == WAYPOINT_MOTION_TYPE || movetype == POINT_MOTION_TYPE || (c->IsAIEnabled() && c->AI()->IsEscorted())) - c->SetHomePosition(c->GetPosition()); -} - void ThreatManager::AddThreat(Unit* target, float amount, SpellInfo const* spell, bool ignoreModifiers, bool ignoreRedirects) { // step 1: we can shortcut if the spell has one of the NO_THREAT attrs set - nothing will happen @@ -406,18 +399,10 @@ void ThreatManager::AddThreat(Unit* target, float amount, SpellInfo const* spell if (ref->IsOnline()) // ...and if the ref is online it also gets the threat it should have ref->AddThreat(amount); - if (!_ownerEngaged) + if (!_owner->IsEngaged()) { - Creature* cOwner = ASSERT_NOTNULL(_owner->ToCreature()); // if we got here the owner can have a threat list, and must be a creature! - _ownerEngaged = true; - + _owner->AtEngage(target); UpdateVictim(); - - SaveCreatureHomePositionIfNeed(cOwner); - if (CreatureAI* ownerAI = cOwner->AI()) - ownerAI->JustEngagedWith(target); - if (CreatureGroup* formation = cOwner->GetFormation()) - formation->MemberEngagingTarget(cOwner, target); } } @@ -494,14 +479,17 @@ void ThreatManager::ClearThreat(ThreatReference* ref) void ThreatManager::ClearAllThreat() { - _ownerEngaged = false; - if (_myThreatListEntries.empty()) - return; - - SendClearAllThreatToClients(); - do - _myThreatListEntries.begin()->second->UnregisterAndFree(); - while (!_myThreatListEntries.empty()); + if (!_myThreatListEntries.empty()) + { + SendClearAllThreatToClients(); + do + _myThreatListEntries.begin()->second->UnregisterAndFree(); + while (!_myThreatListEntries.empty()); + } + // note: i don't really like having this here + // (maybe engage flag should be in creature ai? it's inherently an AI property...) + if (_owner->IsEngaged()) + _owner->AtDisengage(); } void ThreatManager::FixateTarget(Unit* target) |