diff options
author | Treeston <treeston.mmoc@gmail.com> | 2018-05-04 14:49:08 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-09-26 16:12:33 +0200 |
commit | 16eb5032ad0e8fbc9cd9d3229be65a8f0190347b (patch) | |
tree | 5041f78ab1509768a1502641e8c9a1203385ca7d /src/server/game/Combat | |
parent | c926e2fc940fdf8e328dddb829e0aaafea1e8a90 (diff) |
Core/Threat: Re-add fixtate system. I am being told Netherspite needs it.
(cherry picked from commit fd33b1cd02a1c69fc78f47f079eadc43c331d054)
Diffstat (limited to 'src/server/game/Combat')
-rw-r--r-- | src/server/game/Combat/ThreatManager.cpp | 30 | ||||
-rw-r--r-- | src/server/game/Combat/ThreatManager.h | 7 |
2 files changed, 36 insertions, 1 deletions
diff --git a/src/server/game/Combat/ThreatManager.cpp b/src/server/game/Combat/ThreatManager.cpp index ad1c513ffd1..82e98c91dbf 100644 --- a/src/server/game/Combat/ThreatManager.cpp +++ b/src/server/game/Combat/ThreatManager.cpp @@ -459,10 +459,36 @@ void ThreatManager::ClearAllThreat() while (!_myThreatListEntries.empty()); } +void ThreatManager::FixtateTarget(Unit* target) +{ + if (target) + { + auto it = _myThreatListEntries.find(target->GetGUID()); + if (it != _myThreatListEntries.end()) + { + _fixtateRef = it->second; + return; + } + } + _fixtateRef = nullptr; +} + +Unit* ThreatManager::GetFixtateTarget() const +{ + if (_fixtateRef) + return _fixtateRef->GetVictim(); + else + return nullptr; +} + ThreatReference const* ThreatManager::ReselectVictim() { + // fixtated target is always preferred + if (_fixtateRef && _fixtateRef->IsAvailable()) + return _fixtateRef; + ThreatReference const* oldVictimRef = _currentVictimRef; - if (oldVictimRef && !oldVictimRef->IsAvailable()) + if (oldVictimRef && oldVictimRef->IsOffline()) oldVictimRef = nullptr; // in 99% of cases - we won't need to actually look at anything beyond the first element ThreatReference const* highest = _sortedThreatList.top(); @@ -705,6 +731,8 @@ void ThreatManager::PurgeThreatListRef(ObjectGuid const& guid, bool sendRemove) if (_currentVictimRef == ref) _currentVictimRef = nullptr; + if (_fixtateRef == ref) + _fixtateRef = nullptr; _sortedThreatList.erase(ref->_handle); if (sendRemove && ref->IsAvailable()) diff --git a/src/server/game/Combat/ThreatManager.h b/src/server/game/Combat/ThreatManager.h index a10807cb061..a3755fdf167 100644 --- a/src/server/game/Combat/ThreatManager.h +++ b/src/server/game/Combat/ThreatManager.h @@ -160,6 +160,12 @@ class TC_GAME_API ThreatManager // Removes all targets from the threat list (will cause evade in UpdateVictim if called) void ClearAllThreat(); + // Fixtate on the passed target; this target will always be selected until the fixtate is cleared + // (if the target is not in the threat list, does nothing) + void FixtateTarget(Unit* target); + void ClearFixtate() { FixtateTarget(nullptr); } + Unit* GetFixtateTarget() const; + // sends SMSG_THREAT_UPDATE to all nearby clients (used by client to forward threat list info to addons) void SendThreatListToClients() const; @@ -204,6 +210,7 @@ class TC_GAME_API ThreatManager std::unordered_map<ObjectGuid, ThreatReference*> _myThreatListEntries; ThreatReference const* _currentVictimRef; ThreatReference const* ReselectVictim(); + ThreatReference const* _fixtateRef; ///== OTHERS' THREAT LISTS == void PutThreatenedByMeRef(ObjectGuid const& guid, ThreatReference* ref); |