bool EvadeDelayEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) { if (m_owner.IsInEvadeMode()) return true; if (m_owner.SelectHostileTarget(false)) return true; switch (m_owner.GetObjectGuid().GetHigh()) { case HIGHGUID_UNIT: case HIGHGUID_VEHICLE: { Creature* c_owner = (Creature*)(&m_owner); if (!c_owner) return true; if (c_owner->IsAILocked()) return false; if (c_owner->IsDespawned() || c_owner->isCharmed() || c_owner->hasUnitState(UNIT_STAT_CAN_NOT_REACT_OR_LOST_CONTROL)) return true; c_owner->LockAI(true); if (CreatureAI* ai = c_owner->AI()) ai->EnterEvadeMode(); c_owner->LockAI(false); if (InstanceData* mapInstance = c_owner->GetInstanceData()) mapInstance->OnCreatureEvade(c_owner); break; } case HIGHGUID_PET: { Creature* c_owner = (Creature*)(&m_owner); if (!c_owner) return true; if (m_owner.GetOwner() && m_owner.GetOwner()->GetTypeId() == TYPEID_UNIT && m_owner.GetOwner()->SelectHostileTarget(false)) return true; if (c_owner->IsAILocked()) return false; if (c_owner->IsDespawned()) return true; Pet* p_owner = (Pet*)(&m_owner); if (!p_owner) return true; CreatureAI* ai = p_owner->AI(); if (ai) { if (PetAI* pai = (PetAI*)ai) pai->EnterEvadeMode(); else ai->EnterEvadeMode(); } if (p_owner->GetOwner() && p_owner->GetOwner()->GetTypeId() == TYPEID_UNIT) { if (InstanceData* mapInstance = p_owner->GetInstanceData()) mapInstance->OnCreatureEvade(c_owner); } break; } case HIGHGUID_PLAYER: default: sLog.outError("EvadeDelayEvent::Execute try execute for unsupported owner %s!", m_owner.GetObjectGuid().GetString().c_str()); break; } return true; }