Core/Units: Fix issues with threat management on phase changes

This commit is contained in:
Elron103
2012-03-20 22:15:11 +01:00
parent f0ac821e0b
commit 6d9dbefe94
2 changed files with 36 additions and 2 deletions
+1 -1
View File
@@ -242,7 +242,7 @@ class ThreatManager
// methods to access the lists from the outside to do some dirty manipulation (scriping and such) // methods to access the lists from the outside to do some dirty manipulation (scriping and such)
// I hope they are used as little as possible. // I hope they are used as little as possible.
std::list<HostileReference*>& getThreatList() { return iThreatContainer.getThreatList(); } std::list<HostileReference*>& getThreatList() { return iThreatContainer.getThreatList(); }
std::list<HostileReference*>& getOfflieThreatList() { return iThreatOfflineContainer.getThreatList(); } std::list<HostileReference*>& getOfflineThreatList() { return iThreatOfflineContainer.getThreatList(); }
ThreatContainer& getOnlineContainer() { return iThreatContainer; } ThreatContainer& getOnlineContainer() { return iThreatContainer; }
ThreatContainer& getOfflineContainer() { return iThreatOfflineContainer; } ThreatContainer& getOfflineContainer() { return iThreatOfflineContainer; }
private: private:
+34
View File
@@ -16463,8 +16463,42 @@ void Unit::SetPhaseMask(uint32 newPhaseMask, bool update)
return; return;
if (IsInWorld()) if (IsInWorld())
{
RemoveNotOwnSingleTargetAuras(newPhaseMask); // we can lost access to caster or target RemoveNotOwnSingleTargetAuras(newPhaseMask); // we can lost access to caster or target
// modify hostile references for new phasemask, some special cases deal with hostile references themselves
if (GetTypeId() == TYPEID_UNIT || (!ToPlayer()->isGameMaster() && !ToPlayer()->GetSession()->PlayerLogout()))
{
HostileRefManager& refManager = getHostileRefManager();
HostileReference* ref = refManager.getFirst();
while (ref)
{
if (Unit* unit = ref->getSource()->getOwner())
if (Creature* creature = unit->ToCreature())
refManager.setOnlineOfflineState(creature, creature->InSamePhase(newPhaseMask));
ref = ref->next();
}
// modify threat lists for new phasemask
if (GetTypeId() != TYPEID_PLAYER)
{
std::list<HostileReference*> threatList = getThreatManager().getThreatList();
std::list<HostileReference*> offlineThreatList = getThreatManager().getOfflineThreatList();
// merge expects sorted lists
threatList.sort();
offlineThreatList.sort();
threatList.merge(offlineThreatList);
for (std::list<HostileReference*>::const_iterator itr = threatList.begin(); itr != threatList.end(); ++itr)
if (Unit* unit = (*itr)->getTarget())
unit->getHostileRefManager().setOnlineOfflineState(ToCreature(), unit->InSamePhase(newPhaseMask));
}
}
}
WorldObject::SetPhaseMask(newPhaseMask, update); WorldObject::SetPhaseMask(newPhaseMask, update);
if (!IsInWorld()) if (!IsInWorld())