diff options
| author | Treeston <treeston.mmoc@gmail.com> | 2018-05-04 14:49:08 +0200 |
|---|---|---|
| committer | Treeston <treeston.mmoc@gmail.com> | 2018-05-04 14:49:08 +0200 |
| commit | fd33b1cd02a1c69fc78f47f079eadc43c331d054 (patch) | |
| tree | 25a6049ed0605fa23d691b362e1355d80f2aef81 /src/server/game/Combat | |
| parent | 7fe59c95d857708181991bf8478712b56e5076ac (diff) | |
Core/Threat: Re-add fixtate system. I am being told Netherspite needs it.
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 39f69d65700..5c14b5d378c 100644 --- a/src/server/game/Combat/ThreatManager.cpp +++ b/src/server/game/Combat/ThreatManager.cpp @@ -451,10 +451,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(); @@ -699,6 +725,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 207a59f3e6e..68a0f5c4095 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); |
