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.

(cherry picked from commit 71b5ed6832)
This commit is contained in:
Treeston
2018-02-26 00:10:21 +01:00
committed by funjoker
parent 16255112ab
commit 74cdf260e1

View File

@@ -404,26 +404,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);
@@ -440,7 +430,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;
@@ -722,7 +712,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);
}