Core/Units: Fix issues with threat management on phase changes
This commit is contained in:
@@ -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:
|
||||||
|
|||||||
@@ -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())
|
||||||
|
|||||||
Reference in New Issue
Block a user