예제 #1
0
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;
}