aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2018-08-27 20:41:07 +0200
committerShauren <shauren.trinity@gmail.com>2021-10-23 02:14:04 +0200
commitb6f4b5340792bfdf5f73c6bccd3a5f4a926f00fa (patch)
tree660c5ca5713abb93b8370e42a24582c61e234e3b
parent7a503ff597bf07c12202c510de8245b76755b668 (diff)
Core/Threat: Only send SMSG_THREAT_UPDATE if the threat list actually changed
(cherry picked from commit 4e5d1b70219d77747e7e6dc31b553a7a1c451ad3)
-rw-r--r--src/server/game/Combat/ThreatManager.cpp16
-rw-r--r--src/server/game/Combat/ThreatManager.h1
2 files changed, 13 insertions, 4 deletions
diff --git a/src/server/game/Combat/ThreatManager.cpp b/src/server/game/Combat/ThreatManager.cpp
index f2861659af5..685a972599a 100644
--- a/src/server/game/Combat/ThreatManager.cpp
+++ b/src/server/game/Combat/ThreatManager.cpp
@@ -39,6 +39,7 @@ void ThreatReference::AddThreat(float amount)
HeapNotifyIncreased();
else
HeapNotifyDecreased();
+ _mgr._needClientUpdate = true;
}
void ThreatReference::ScaleThreat(float factor)
@@ -50,6 +51,7 @@ void ThreatReference::ScaleThreat(float factor)
HeapNotifyIncreased();
else
HeapNotifyDecreased();
+ _mgr._needClientUpdate = true;
}
void ThreatReference::UpdateOffline()
@@ -123,6 +125,8 @@ void ThreatReference::UpdateTauntState(TauntState state)
HeapNotifyDecreased();
else
HeapNotifyIncreased();
+
+ _mgr._needClientUpdate = true;
}
void ThreatReference::ClearThreat()
@@ -155,7 +159,7 @@ void ThreatReference::UnregisterAndFree()
return true;
}
-ThreatManager::ThreatManager(Unit* owner) : _owner(owner), _ownerCanHaveThreatList(false), _ownerEngaged(false), _updateTimer(THREAT_UPDATE_INTERVAL), _currentVictimRef(nullptr), _fixateRef(nullptr)
+ThreatManager::ThreatManager(Unit* owner) : _owner(owner), _ownerCanHaveThreatList(false), _ownerEngaged(false), _needClientUpdate(false), _updateTimer(THREAT_UPDATE_INTERVAL), _currentVictimRef(nullptr), _fixateRef(nullptr)
{
for (int8 i = 0; i < MAX_SPELL_SCHOOL; ++i)
_singleSchoolModifiers[i] = 1.0f;
@@ -363,7 +367,6 @@ void ThreatManager::AddThreat(Unit* target, float amount, SpellInfo const* spell
if (it != _myThreatListEntries.end())
{
ThreatReference* const ref = it->second;
-
// causing threat causes SUPPRESSED threat states to stop being suppressed
if (ref->GetOnlineState() == ThreatReference::ONLINE_STATE_SUPPRESSED)
if (!ref->ShouldBeSuppressed())
@@ -496,10 +499,14 @@ Unit* ThreatManager::GetFixateTarget() const
void ThreatManager::UpdateVictim()
{
ThreatReference const* const newVictim = ReselectVictim();
- bool const newHighest = (newVictim != _currentVictimRef);
+ bool const newHighest = newVictim && (newVictim != _currentVictimRef);
_currentVictimRef = newVictim;
- SendThreatListToClients(newVictim && newHighest);
+ if (newHighest || _needClientUpdate)
+ {
+ SendThreatListToClients(newHighest);
+ _needClientUpdate = false;
+ }
}
@@ -766,6 +773,7 @@ void ThreatManager::SendThreatListToClients(bool newHighest) const
void ThreatManager::PutThreatListRef(ObjectGuid const& guid, ThreatReference* ref)
{
+ _needClientUpdate = true;
auto& inMap = _myThreatListEntries[guid];
ASSERT(!inMap, "Duplicate threat reference at %p being inserted on %s for %s - memory leak!", ref, _owner->GetGUID().ToString().c_str(), guid.ToString().c_str());
inMap = ref;
diff --git a/src/server/game/Combat/ThreatManager.h b/src/server/game/Combat/ThreatManager.h
index fc49bb26b6e..defb4a1b94e 100644
--- a/src/server/game/Combat/ThreatManager.h
+++ b/src/server/game/Combat/ThreatManager.h
@@ -203,6 +203,7 @@ class TC_GAME_API ThreatManager
void PutThreatListRef(ObjectGuid const& guid, ThreatReference* ref);
void PurgeThreatListRef(ObjectGuid const& guid);
+ bool _needClientUpdate;
uint32 _updateTimer;
threat_list_heap _sortedThreatList;
std::unordered_map<ObjectGuid, ThreatReference*> _myThreatListEntries;