aboutsummaryrefslogtreecommitdiff
path: root/src
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
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')
-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 935af2e4a6d..33f2d0b4ea6 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -733,6 +733,8 @@ void Creature::Update(uint32 diff)
UpdateMovementCapabilities();
+ GetThreatManager().Update(diff);
+
switch (m_deathState)
{
case JUST_RESPAWNED:
@@ -819,7 +821,6 @@ void Creature::Update(uint32 diff)
if (!IsAlive())
break;
- GetThreatManager().Update(diff);
if (_spellFocusInfo.Delay)
{
if (_spellFocusInfo.Delay <= diff)
@@ -3477,6 +3478,8 @@ void Creature::AtEngage(Unit* target)
{
Unit::AtEngage(target);
+ GetThreatManager().ResetUpdateTimer();
+
if (!HasFlag(CREATURE_STATIC_FLAG_2_ALLOW_MOUNTED_COMBAT))
Dismount();