aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2018-02-26 00:10:21 +0100
committerTreeston <treeston.mmoc@gmail.com>2018-02-26 00:10:21 +0100
commit71b5ed6832ac4162754ec50f53cd76305f8a187a (patch)
tree13b45b3572d0f4323fb9e7c9f37e09e1e73231bf
parentacdf7be800ec937c2334caf629d3376037d4b863 (diff)
Core/Threat: Fix taunt logic relying on unspecified behavior by unordered boost heap iterators. Use ordered iterators instead, this is cheap for our use case anyway. This will make taunt behave consistently again.
Closes #21499.
-rw-r--r--src/server/game/Combat/ThreatManager.cpp26
1 files changed, 8 insertions, 18 deletions
diff --git a/src/server/game/Combat/ThreatManager.cpp b/src/server/game/Combat/ThreatManager.cpp
index 73837ce54fa..9aaeec2d665 100644
--- a/src/server/game/Combat/ThreatManager.cpp
+++ b/src/server/game/Combat/ThreatManager.cpp
@@ -396,26 +396,16 @@ void ThreatManager::MatchUnitThreatToHighestThreat(Unit* target)
if (_sortedThreatList.empty())
return;
- auto it = _sortedThreatList.begin(), end = _sortedThreatList.end();
+ auto it = _sortedThreatList.ordered_begin(), end = _sortedThreatList.ordered_end();
ThreatReference const* highest = *it;
- if (!highest->IsOnline())
+ if (!highest->IsAvailable())
return;
- if (highest->_taunted) // might need to skip this - new max could be one of the preceding elements (heap property) since there is only one taunt element
+ if (highest->IsTaunting() && ((++it) != end)) // might need to skip this - max threat could be the preceding element (there is only one taunt element)
{
- if ((++it) != end)
- {
- ThreatReference const* a = *it;
- if (a->IsOnline() && a->GetThreat() > highest->GetThreat())
- highest = a;
-
- if ((++it) != end)
- {
- a = *it;
- if (a->IsOnline() && a->GetThreat() > highest->GetThreat())
- highest = a;
- }
- }
+ ThreatReference const* a = *it;
+ if (a->IsAvailable() && a->GetThreat() > highest->GetThreat())
+ highest = a;
}
AddThreat(target, highest->GetThreat() - GetThreat(target, true), nullptr, true, true);
@@ -432,7 +422,7 @@ void ThreatManager::TauntUpdate()
auto threatIt = _myThreatListEntries.find((*it)->GetCasterGUID());
if (threatIt == threatEnd)
continue;
- if (!threatIt->second->IsOnline())
+ if (!threatIt->second->IsAvailable())
continue;
tauntRef = threatIt->second;
break;
@@ -716,7 +706,7 @@ void ThreatManager::PurgeThreatListRef(ObjectGuid const& guid, bool sendRemove)
_currentVictimRef = nullptr;
_sortedThreatList.erase(ref->_handle);
- if (sendRemove && ref->IsOnline())
+ if (sendRemove && ref->IsAvailable())
SendRemoveToClients(ref->_victim);
}