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
committerTreeston <treeston.mmoc@gmail.com>2019-06-23 00:32:13 +0200
commitdbe3bbefe734f8824e8f07c302e256f0d446b974 (patch)
tree9c6e801e779b752bf15512c7bfac9efea7c5c8ff /src/server/game/Combat/ThreatManager.cpp
parentc06330acf2b307604c97bdd7ad5dfd34b97bbf23 (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.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 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)