mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Core/Threat: Re-add fixtate system. I am being told Netherspite needs it.
This commit is contained in:
@@ -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())
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -885,6 +885,7 @@ public:
|
||||
handler->PSendSysMessage("%s (GUID %u, SpawnID %u) is not engaged, but still has a threat list? Well, here it is:", target->GetName().c_str(), target->GetGUID().GetCounter(), target->GetTypeId() == TYPEID_UNIT ? target->ToCreature()->GetSpawnId() : 0);
|
||||
|
||||
count = 0;
|
||||
Unit* fixtateVictim = mgr.GetFixtateTarget();
|
||||
for (ThreatReference const* ref : mgr.GetSortedThreatList())
|
||||
{
|
||||
Unit* unit = ref->GetVictim();
|
||||
@@ -901,17 +902,20 @@ public:
|
||||
onlineStr = "";
|
||||
}
|
||||
char const* tauntStr;
|
||||
switch (ref->GetTauntState())
|
||||
{
|
||||
case ThreatReference::TAUNT_STATE_TAUNT:
|
||||
tauntStr = " [TAUNT]";
|
||||
break;
|
||||
case ThreatReference::TAUNT_STATE_DETAUNT:
|
||||
tauntStr = " [DETAUNT]";
|
||||
break;
|
||||
default:
|
||||
tauntStr = "";
|
||||
}
|
||||
if (unit == fixtateVictim)
|
||||
tauntStr = " [FIXTATE]";
|
||||
else
|
||||
switch (ref->GetTauntState())
|
||||
{
|
||||
case ThreatReference::TAUNT_STATE_TAUNT:
|
||||
tauntStr = " [TAUNT]";
|
||||
break;
|
||||
case ThreatReference::TAUNT_STATE_DETAUNT:
|
||||
tauntStr = " [DETAUNT]";
|
||||
break;
|
||||
default:
|
||||
tauntStr = "";
|
||||
}
|
||||
handler->PSendSysMessage(" %u. %s (GUID %u) - threat %f%s%s", ++count, unit->GetName().c_str(), unit->GetGUID().GetCounter(), ref->GetThreat(), tauntStr, onlineStr);
|
||||
}
|
||||
handler->SendSysMessage("End of threat list.");
|
||||
|
||||
Reference in New Issue
Block a user