aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Combat/ThreatManager.cpp
diff options
context:
space:
mode:
authorOvahlord <dreadkiller@gmx.de>2024-05-02 22:50:20 +0200
committerOvahlord <dreadkiller@gmx.de>2024-05-28 16:49:26 +0200
commit228ae7e885898184bde9fc484e35aa9109de2bc1 (patch)
tree8a831b77c00cea3e4bc7857dc8cb8dadfcaac8e5 /src/server/game/Combat/ThreatManager.cpp
parent2ceae541cc1e998e2404495a99061c652bc05de4 (diff)
Core/Combat: reset the ThreatManager update interval upon engaging the creature and move ThreatClear packet sending into the update cycle to mimic retail behavior (#29949)
(cherry picked from commit 24bda9c73dcd89d4da4e871e00fd83a24b8275d2)
Diffstat (limited to 'src/server/game/Combat/ThreatManager.cpp')
-rw-r--r--src/server/game/Combat/ThreatManager.cpp22
1 files changed, 18 insertions, 4 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());