aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Combat/ThreatManager.cpp22
-rw-r--r--src/server/game/Combat/ThreatManager.h4
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp5
3 files changed, 26 insertions, 5 deletions
diff --git a/src/server/game/Combat/ThreatManager.cpp b/src/server/game/Combat/ThreatManager.cpp
index 04ff7e36da1..57ff0aca131 100644
--- a/src/server/game/Combat/ThreatManager.cpp
+++ b/src/server/game/Combat/ThreatManager.cpp
@@ -189,7 +189,7 @@ void ThreatReference::HeapNotifyDecreased()
return true;
}
-ThreatManager::ThreatManager(Unit* owner) : _owner(owner), _ownerCanHaveThreatList(false), _needClientUpdate(false), _updateTimer(THREAT_UPDATE_INTERVAL),
+ThreatManager::ThreatManager(Unit* owner) : _owner(owner), _ownerCanHaveThreatList(false), _needClientUpdate(false), _needThreatClearUpdate(false), _updateTimer(THREAT_UPDATE_INTERVAL),
_sortedThreatList(std::make_unique<Heap>()), _currentVictimRef(nullptr), _fixateRef(nullptr)
{
for (int8 i = 0; i < MAX_SPELL_SCHOOL; ++i)
@@ -210,17 +210,31 @@ void ThreatManager::Initialize()
void ThreatManager::Update(uint32 tdiff)
{
- if (!CanHaveThreatList() || IsThreatListEmpty(true))
+ if (!CanHaveThreatList())
return;
+
if (_updateTimer <= tdiff)
{
- UpdateVictim();
+ if (_needThreatClearUpdate)
+ {
+ SendClearAllThreatToClients();
+ _needThreatClearUpdate = false;
+ }
+
+ if (!IsThreatListEmpty(true))
+ UpdateVictim();
+
_updateTimer = THREAT_UPDATE_INTERVAL;
}
else
_updateTimer -= tdiff;
}
+void ThreatManager::ResetUpdateTimer()
+{
+ _updateTimer = THREAT_UPDATE_INTERVAL;
+}
+
Unit* ThreatManager::GetCurrentVictim()
{
if (!_currentVictimRef || _currentVictimRef->ShouldBeOffline())
@@ -539,7 +553,7 @@ void ThreatManager::ClearAllThreat()
{
if (!_myThreatListEntries.empty())
{
- SendClearAllThreatToClients();
+ _needThreatClearUpdate = true;
do
_myThreatListEntries.begin()->second->UnregisterAndFree();
while (!_myThreatListEntries.empty());
diff --git a/src/server/game/Combat/ThreatManager.h b/src/server/game/Combat/ThreatManager.h
index 8681d6af9d1..4376b0e5e43 100644
--- a/src/server/game/Combat/ThreatManager.h
+++ b/src/server/game/Combat/ThreatManager.h
@@ -95,6 +95,9 @@ class TC_GAME_API ThreatManager
// called from Creature::Update (only creatures can have their own threat list)
// should not be called from anywhere else
void Update(uint32 tdiff);
+ // called from Creature::AtEngage
+ // should not be called from anywhere else
+ void ResetUpdateTimer();
// never nullptr
Unit* GetOwner() const { return _owner; }
@@ -197,6 +200,7 @@ class TC_GAME_API ThreatManager
void PurgeThreatListRef(ObjectGuid const& guid);
bool _needClientUpdate;
+ bool _needThreatClearUpdate;
uint32 _updateTimer;
std::unique_ptr<Heap> _sortedThreatList;
std::unordered_map<ObjectGuid, ThreatReference*> _myThreatListEntries;
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index dbb69e78ce6..a35d588622f 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -743,6 +743,8 @@ void Creature::Update(uint32 diff)
UpdateMovementCapabilities();
+ GetThreatManager().Update(diff);
+
switch (m_deathState)
{
case JUST_RESPAWNED:
@@ -829,7 +831,6 @@ void Creature::Update(uint32 diff)
if (!IsAlive())
break;
- GetThreatManager().Update(diff);
if (_spellFocusInfo.Delay)
{
if (_spellFocusInfo.Delay <= diff)
@@ -3595,6 +3596,8 @@ void Creature::AtEngage(Unit* target)
{
Unit::AtEngage(target);
+ GetThreatManager().ResetUpdateTimer();
+
if (!HasFlag(CREATURE_STATIC_FLAG_2_ALLOW_MOUNTED_COMBAT))
Dismount();