diff options
author | Treeston <treeston.mmoc@gmail.com> | 2019-06-23 00:32:13 +0200 |
---|---|---|
committer | Treeston <treeston.mmoc@gmail.com> | 2019-06-23 00:32:13 +0200 |
commit | dbe3bbefe734f8824e8f07c302e256f0d446b974 (patch) | |
tree | 9c6e801e779b752bf15512c7bfac9efea7c5c8ff /src/server/game/Combat/ThreatManager.cpp | |
parent | c06330acf2b307604c97bdd7ad5dfd34b97bbf23 (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.
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 ce5a2ac58d3..83c86f59e1a 100644 --- a/src/server/game/Combat/ThreatManager.cpp +++ b/src/server/game/Combat/ThreatManager.cpp @@ -166,7 +166,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; @@ -186,7 +186,7 @@ void ThreatManager::Initialize() void ThreatManager::Update(uint32 tdiff) { - if (!CanHaveThreatList() || !IsEngaged()) + if (!CanHaveThreatList() || IsThreatListEmpty()) return; if (_updateTimer <= tdiff) { @@ -292,13 +292,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 @@ -398,18 +391,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); } } @@ -486,14 +471,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) |