aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Combat/ThreatManager.cpp
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2019-06-23 00:32:13 +0200
committerShauren <shauren.trinity@gmail.com>2021-12-12 00:31:15 +0100
commit35e55f10899712435102764671241b94a2026599 (patch)
tree431aafcba232130d585fd8bebdf3609d770318a7 /src/server/game/Combat/ThreatManager.cpp
parentdd22c6fe67711901587a0a2fe6ed5587dc6d5024 (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.cpp42
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)