diff options
author | Ovahlord <dreadkiller@gmx.de> | 2024-05-02 22:50:20 +0200 |
---|---|---|
committer | Ovahlord <dreadkiller@gmx.de> | 2024-05-28 16:49:26 +0200 |
commit | 228ae7e885898184bde9fc484e35aa9109de2bc1 (patch) | |
tree | 8a831b77c00cea3e4bc7857dc8cb8dadfcaac8e5 /src | |
parent | 2ceae541cc1e998e2404495a99061c652bc05de4 (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.cpp | 22 | ||||
-rw-r--r-- | src/server/game/Combat/ThreatManager.h | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 5 |
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(); |