bool Unit::SortTargets() { if(GetTypeId() == TYPEID_PLAYER) return false; DEBUG_LOG("Start victim sorting "); for(HateList::iterator iter = m_hateList.begin(); iter != m_hateList.end(); iter++) { if(iter->UnitGuid) { Unit* unit = ObjectAccessor::Instance().GetUnit(*this, iter->UnitGuid); if(!unit || ((Creature*)this)->IsOutOfThreatArea(unit)) { DEBUG_LOG("1"); m_offlineList.push_back(Hostil(iter->UnitGuid, iter->Threat)); m_hateList.erase(iter); DEBUG_LOG("2"); } } } DEBUG_LOG("Threat list sorting complite"); if(IsHateOfflineListEmpty()) //if HateOfflineList is empty after ThreatList filtering return true; for(HateOfflineList::iterator itr = m_offlineList.begin(); itr != m_offlineList.end(); itr++) { if(itr->UnitGuid) { Unit* unit = ObjectAccessor::Instance().GetUnit(*this, itr->UnitGuid); if(unit && !((Creature*)this)->IsOutOfThreatArea(unit)) { RestoreVictimInHateList(unit); m_hateList.push_back(Hostil(itr->UnitGuid, itr->Threat)); m_offlineList.erase(itr); } } } DEBUG_LOG("Stop victim sorting "); if(IsThreatListEmpty()) //if no one in ThreatList after HateOfflineList filtering return false; return true; }