diff options
| author | Treeston <treeston.mmoc@gmail.com> | 2019-06-23 23:31:51 +0200 |
|---|---|---|
| committer | Treeston <treeston.mmoc@gmail.com> | 2019-06-23 23:31:51 +0200 |
| commit | 1158f267df22c0782fb5f20f7de31f5643ac0b58 (patch) | |
| tree | 2ca14c1207f30e47c89b66b9c3ee4ca65b519eee /src/server/game | |
| parent | 00575221e3bfd66a382925d122540b047dcb9e3f (diff) | |
Combat/Threat: Split ThreatManager::NotifyDisengaged off from ThreatManager::ClearAllThreat. NotifyDisengaged signifies intent to clear the engagement flag, and should only be called from AI. Fixes #23490.
Diffstat (limited to 'src/server/game')
| -rw-r--r-- | src/server/game/AI/CoreAI/GuardAI.cpp | 4 | ||||
| -rw-r--r-- | src/server/game/AI/CreatureAI.cpp | 8 | ||||
| -rw-r--r-- | src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/Combat/ThreatManager.cpp | 4 | ||||
| -rw-r--r-- | src/server/game/Combat/ThreatManager.h | 3 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 1 | ||||
| -rw-r--r-- | src/server/game/Grids/ObjectGridLoader.cpp | 1 |
8 files changed, 13 insertions, 12 deletions
diff --git a/src/server/game/AI/CoreAI/GuardAI.cpp b/src/server/game/AI/CoreAI/GuardAI.cpp index 3e541ccfd84..547d074e7d6 100644 --- a/src/server/game/AI/CoreAI/GuardAI.cpp +++ b/src/server/game/AI/CoreAI/GuardAI.cpp @@ -57,15 +57,15 @@ void GuardAI::EnterEvadeMode(EvadeReason /*why*/) { me->GetMotionMaster()->MoveIdle(); me->CombatStop(true); - me->GetThreatManager().ClearAllThreat(); + me->GetThreatManager().NotifyDisengaged(); return; } TC_LOG_TRACE("scritps.ai", "GuardAI::EnterEvadeMode: %s enters evade mode.", me->GetGUID().ToString().c_str()); me->RemoveAllAuras(); - me->GetThreatManager().ClearAllThreat(); me->CombatStop(true); + me->GetThreatManager().NotifyDisengaged(); me->GetMotionMaster()->MoveTargetedHome(); } diff --git a/src/server/game/AI/CreatureAI.cpp b/src/server/game/AI/CreatureAI.cpp index a7d2888fc0b..cfb58a99826 100644 --- a/src/server/game/AI/CreatureAI.cpp +++ b/src/server/game/AI/CreatureAI.cpp @@ -220,9 +220,8 @@ bool CreatureAI::_EnterEvadeMode(EvadeReason /*why*/) me->RemoveAurasOnEvade(); - // sometimes bosses stuck in combat? - me->GetThreatManager().ClearAllThreat(); me->CombatStop(true); + me->GetThreatManager().NotifyDisengaged(); me->LoadCreaturesAddon(); me->SetLootRecipient(nullptr); me->ResetPlayerDamageReq(); @@ -230,10 +229,7 @@ bool CreatureAI::_EnterEvadeMode(EvadeReason /*why*/) me->SetCannotReachTarget(false); me->DoNotReacquireTarget(); - if (me->IsInEvadeMode()) - return false; - - return true; + return !me->IsInEvadeMode(); } static const uint32 BOUNDARY_VISUALIZE_CREATURE = 15425; diff --git a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp index 3f5ff9a74ea..37dec1a6fe8 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp @@ -96,8 +96,8 @@ void EscortAI::ReturnToLastPoint() void EscortAI::EnterEvadeMode(EvadeReason /*why*/) { me->RemoveAllAuras(); - me->GetThreatManager().ClearAllThreat(); me->CombatStop(true); + me->GetThreatManager().NotifyDisengaged(); me->SetLootRecipient(nullptr); if (HasEscortState(STATE_ESCORT_ESCORTING)) diff --git a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp index 40ebf4ee44d..04c6f0a3376 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp @@ -107,8 +107,8 @@ void FollowerAI::EnterEvadeMode(EvadeReason /*why*/) return; me->RemoveAllAuras(); - me->GetThreatManager().ClearAllThreat(); me->CombatStop(true); + me->GetThreatManager().NotifyDisengaged(); me->SetLootRecipient(nullptr); me->SetCannotReachTarget(false); me->DoNotReacquireTarget(); diff --git a/src/server/game/Combat/ThreatManager.cpp b/src/server/game/Combat/ThreatManager.cpp index 83c86f59e1a..626d42042b5 100644 --- a/src/server/game/Combat/ThreatManager.cpp +++ b/src/server/game/Combat/ThreatManager.cpp @@ -478,6 +478,10 @@ void ThreatManager::ClearAllThreat() _myThreatListEntries.begin()->second->UnregisterAndFree(); while (!_myThreatListEntries.empty()); } +} + +void ThreatManager::NotifyDisengaged() +{ // 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()) diff --git a/src/server/game/Combat/ThreatManager.h b/src/server/game/Combat/ThreatManager.h index 12beb54c486..1eda7d01e15 100644 --- a/src/server/game/Combat/ThreatManager.h +++ b/src/server/game/Combat/ThreatManager.h @@ -154,6 +154,9 @@ class TC_GAME_API ThreatManager void ClearThreat(ThreatReference* ref); // Removes all targets from the threat list (will cause evade in UpdateVictim if called) void ClearAllThreat(); + // THIS SHOULD ONLY BE CALLED FROM A CREATURE'S AI (typically in EnterEvadeMode) + // notify the unit that the AI has disengaged + void NotifyDisengaged(); // Fixate on the passed target; this target will always be selected until the fixate is cleared // (if the target is not in the threat list, does nothing) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 5422bee3a8e..9f288407813 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -8613,7 +8613,6 @@ void Unit::setDeathState(DeathState s) if (s != ALIVE && s != JUST_RESPAWNED) { CombatStop(); - GetThreatManager().ClearAllThreat(); ClearComboPointHolders(); // any combo points pointed to unit lost at it death if (IsNonMeleeSpellCast(false)) diff --git a/src/server/game/Grids/ObjectGridLoader.cpp b/src/server/game/Grids/ObjectGridLoader.cpp index ada845e0234..2c17aaa4b1a 100644 --- a/src/server/game/Grids/ObjectGridLoader.cpp +++ b/src/server/game/Grids/ObjectGridLoader.cpp @@ -255,7 +255,6 @@ void ObjectGridStoper::Visit(CreatureMapType &m) if (iter->GetSource()->IsInCombat()) { iter->GetSource()->CombatStop(); - iter->GetSource()->GetThreatManager().ClearAllThreat(); iter->GetSource()->AI()->EnterEvadeMode(); } } |
