Beispiel #1
0
        void HandleFlightSequence()
        {
            switch(uiFlightCount)
            {
            case 0:
                //me->AttackStop();
                me->GetMotionMaster()->Clear(false);
                me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
                me->StopMoving();
                DoScriptText(YELL_TAKEOFF, me);
                events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 2000);
                break;
            case 1:
                me->GetMotionMaster()->MovePoint(0, me->GetPositionX()+1, me->GetPositionY(), me->GetPositionZ()+10);
                break;
            case 2:
            {
                Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
                if (!pTarget)
                    pTarget = Unit::GetUnit(*me, pInstance ? pInstance->GetData64(DATA_PLAYER_GUID) : 0);

                if (!pTarget)
                {
                    EnterEvadeMode();
                    return;
                }

                Creature* Vapor = me->SummonCreature(MOB_VAPOR, pTarget->GetPositionX()-5+rand()%10, pTarget->GetPositionY()-5+rand()%10, pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000);
                if (Vapor)
                {
                    Vapor->AI()->AttackStart(pTarget);
                    me->InterruptNonMeleeSpells(false);
                    DoCast(Vapor, SPELL_VAPOR_CHANNEL, false); // core bug
                    Vapor->CastSpell(Vapor, SPELL_VAPOR_TRIGGER, true);
                }

                events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 10000);
                break;
            }
            case 3:
            {
                DespawnSummons(MOB_VAPOR_TRAIL);
                //DoCast(me, SPELL_VAPOR_SELECT); need core support

                Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
                if (!pTarget)
                    pTarget = Unit::GetUnit(*me, pInstance ? pInstance->GetData64(DATA_PLAYER_GUID) : 0);

                if (!pTarget)
                {
                    EnterEvadeMode();
                    return;
                }

                //pTarget->CastSpell(pTarget, SPELL_VAPOR_SUMMON, true); need core support
                Creature* pVapor = me->SummonCreature(MOB_VAPOR, pTarget->GetPositionX()-5+rand()%10, pTarget->GetPositionY()-5+rand()%10, pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000);
                if (pVapor)
                {
                    if (pVapor->AI())
                        pVapor->AI()->AttackStart(pTarget);
                    me->InterruptNonMeleeSpells(false);
                    DoCast(pVapor, SPELL_VAPOR_CHANNEL, false); // core bug
                    pVapor->CastSpell(pVapor, SPELL_VAPOR_TRIGGER, true);
                }

                events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 10000);
                break;
            }
            case 4:
                DespawnSummons(MOB_VAPOR_TRAIL);
                events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 1);
                break;
            case 5:
            {
                Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
                if (!pTarget)
                    pTarget = Unit::GetUnit(*me, pInstance ? pInstance->GetData64(DATA_PLAYER_GUID) : 0);

                if (!pTarget)
                {
                    EnterEvadeMode();
                    return;
                }

                breathX = pTarget->GetPositionX();
                breathY = pTarget->GetPositionY();
                float x, y, z;
                pTarget->GetContactPoint(me, x, y, z, 70);
                me->GetMotionMaster()->MovePoint(0, x, y, z+10);
                break;
            }
            case 6:
                me->SetOrientation(me->GetAngle(breathX, breathY));
                me->StopMoving();
                //DoTextEmote("takes a deep breath.", NULL);
                events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 10000);
                break;
            case 7:
            {
                DoCast(me, SPELL_FOG_BREATH, true);
                float x, y, z;
                me->GetPosition(x, y, z);
                x = 2 * breathX - x;
                y = 2 * breathY - y;
                me->GetMotionMaster()->MovePoint(0, x, y, z);
                events.ScheduleEvent(EVENT_SUMMON_FOG, 1);
                break;
            }
            case 8:
                me->CastStop(SPELL_FOG_BREATH);
                me->RemoveAurasDueToSpell(SPELL_FOG_BREATH);
                ++uiBreathCount;
                events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 1);
                if (uiBreathCount < 3)
                    uiFlightCount = 4;
                break;
            case 9:
                if (Unit *pTarget = SelectTarget(SELECT_TARGET_TOPAGGRO))
                    DoStartMovement(pTarget);
                else
                {
                    EnterEvadeMode();
                    return;
                }
                break;
            case 10:
                me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
                me->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
                EnterPhase(PHASE_GROUND);
                AttackStart(SelectTarget(SELECT_TARGET_TOPAGGRO));
                break;
            }
            ++uiFlightCount;
        }
Beispiel #2
0
 void HandleFlightSequence()
 {
     switch(FlightCount)
     {
     case 0:
         //m_creature->AttackStop();
         error_log("prevent fly phase");
         m_creature->GetMotionMaster()->Clear(false);
         m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
         m_creature->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING);
         m_creature->StopMoving();
         DoScriptText(YELL_TAKEOFF, m_creature);
         Timer[EVENT_FLIGHT_SEQUENCE] = 2000;
         break;
     case 1:
         error_log("Move to Fly point");
         m_creature->GetMotionMaster()->MovePoint(0, m_creature->GetPositionX()+1, m_creature->GetPositionY(), m_creature->GetPositionZ()+10);
         Timer[EVENT_FLIGHT_SEQUENCE] = 0;
         break;
     case 2:{
         error_log("Summon Vapor case 2");
         Unit* target;
         target = SelectUnit(SELECT_TARGET_RANDOM, 0, 150, true);
         if(!target) target = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_PLAYER_GUID));
         if(target)
         {
             Creature* Vapor = m_creature->SummonCreature(MOB_VAPOR, target->GetPositionX()-5+rand()%10, target->GetPositionY()-5+rand()%10, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000);
             if(Vapor)
             {
                 Vapor->AI()->AttackStart(target);
                 m_creature->InterruptNonMeleeSpells(false);
                 m_creature->CastSpell(Vapor, SPELL_VAPOR_CHANNEL, false); // core bug
                 Vapor->CastSpell(Vapor, SPELL_VAPOR_TRIGGER, true);
             }
         }
         else
         {
             EnterEvadeMode();
             return;
         }
         Timer[EVENT_FLIGHT_SEQUENCE] = 10000;
         break;}
     case 3: {
         DespawnSummons(MOB_VAPOR_TRAIL);
         error_log("Summon Vapor case3");
         //m_creature->CastSpell(m_creature, SPELL_VAPOR_SELECT); need core support
         Unit* target;
         target = SelectUnit(SELECT_TARGET_RANDOM, 0, 150, true);
         if(!target) target = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_PLAYER_GUID));
         if(target)
         {
             //target->CastSpell(target, SPELL_VAPOR_SUMMON, true); need core support
             Creature* Vapor = m_creature->SummonCreature(MOB_VAPOR, target->GetPositionX()-5+rand()%10, target->GetPositionY()-5+rand()%10, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000);
             if(Vapor)
             {
                 Vapor->AI()->AttackStart(target);
                 m_creature->InterruptNonMeleeSpells(false);
                 m_creature->CastSpell(Vapor, SPELL_VAPOR_CHANNEL, false); // core bug
                 Vapor->CastSpell(Vapor, SPELL_VAPOR_TRIGGER, true);
             }
         }
         else
         {
             EnterEvadeMode();
             return;
         }
         Timer[EVENT_FLIGHT_SEQUENCE] = 10000;
         break;}
     case 4:
         DespawnSummons(MOB_VAPOR_TRAIL);
         Timer[EVENT_FLIGHT_SEQUENCE] = 1;
         break;
     case 5:{
         Unit* target;
         target = SelectUnit(SELECT_TARGET_RANDOM, 0, 150, true);
         if(!target) target = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_PLAYER_GUID));
         if(target)
         {
             BreathX = target->GetPositionX();
             BreathY = target->GetPositionY();
             float x, y, z;
             target->GetContactPoint(m_creature, x, y, z, 70);
             m_creature->GetMotionMaster()->MovePoint(0, x, y, z+10);
         }else
         {
             EnterEvadeMode();
             return;
         }
         Timer[EVENT_FLIGHT_SEQUENCE] = 0;
         break;}
     case 6:
         m_creature->SetOrientation(m_creature->GetAngle(BreathX, BreathY));
         m_creature->StopMoving();
         //DoTextEmote("takes a deep breath.", NULL);
         Timer[EVENT_FLIGHT_SEQUENCE] = 10000;
         break;
     case 7:
         m_creature->CastSpell(m_creature, SPELL_FOG_BREATH, true);
         {
             float x, y, z;
             m_creature->GetPosition(x, y, z);
             x = 2 * BreathX - x;
             y = 2 * BreathY - y;
             m_creature->GetMotionMaster()->MovePoint(0, x, y, z);
         }
         Timer[EVENT_SUMMON_FOG] = 1;
         Timer[EVENT_FLIGHT_SEQUENCE] = 0;
         break;
     case 8:
         m_creature->RemoveAurasDueToSpell(SPELL_FOG_BREATH);
         BreathCount++;
         Timer[EVENT_SUMMON_FOG] = 0;
         Timer[EVENT_FLIGHT_SEQUENCE] = 1;
         if(BreathCount < 3) FlightCount = 4;
         break;
     case 9:
         if(Unit* target = SelectUnit(SELECT_TARGET_TOPAGGRO, 0))
         {
             float x, y, z;
             target->GetContactPoint(m_creature, x, y, z);
             m_creature->GetMotionMaster()->MovePoint(0, x, y, z);
         }
         else
         {
             EnterEvadeMode();
             return;
         }
         Timer[EVENT_FLIGHT_SEQUENCE] = 0;
         break;
     case 10:
         m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
         m_creature->StopMoving();
         m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
         EnterPhase(PHASE_GROUND);
         m_creature->AI()->AttackStart(SelectUnit(SELECT_TARGET_TOPAGGRO, 0));
         break;
     default:
         break;
     }
     FlightCount++;
 }
Beispiel #3
0
    void UpdateAI(const uint32 diff)
    {
        if(isCharging)
        {
            if(!ChargeTargetGUID)
            {
                m_creature->SetSpeed(MOVE_RUN, 1.2f);
                m_creature->GetMotionMaster()->Clear();
                if(m_creature->getVictim())
                {
                    m_creature->Attack(m_creature->getVictim(), true);
                    m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
                }
                isCharging = false;
            }
            return;
        }

        if(!m_creature->SelectHostilTarget() && !m_creature->getVictim())
            return;

        if(Berserk_Timer < diff)
        {
            DoScriptText(SAY_BERSERK, m_creature);
            DoCast(m_creature, SPELL_BERSERK, true);
            Berserk_Timer = 600000;
        }else Berserk_Timer -= diff;

        if(ShapeShift_Timer < diff)
        {
            if(inBearForm)
            {
                DoScriptText(SAY_TOTROLL, m_creature);

                m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY + 1, 5122);
                m_creature->RemoveAurasDueToSpell(SPELL_BEARFORM);
                Surge_Timer = 15000 + rand()%5000;
                BrutalSwipe_Timer = 7000 + rand()%5000;
                Mangle_Timer = 10000 + rand()%5000;
                ShapeShift_Timer = 45000 + rand()%5000;
                inBearForm = false;
            }
            else
            {
                DoScriptText(SAY_TOBEAR, m_creature);
                m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY + 1, 0);
                DoCast(m_creature, SPELL_BEARFORM, true);
                LaceratingSlash_Timer = 2000; // dur 18s
                RendFlesh_Timer = 3000;  // dur 5s
                DeafeningRoar_Timer = 5000 + rand()%5000;  // dur 2s
                ShapeShift_Timer = 20000 + rand()%5000; // dur 30s
                inBearForm = true;
            }
        }else ShapeShift_Timer -= diff;

        if(!inBearForm)
        {
            if(BrutalSwipe_Timer < diff)
            {
                DoCast(m_creature->getVictim(), SPELL_BRUTALSWIPE);
                BrutalSwipe_Timer = 7000 + rand()%5000;
            }else BrutalSwipe_Timer -= diff;

            if(Mangle_Timer < diff)
            {
                if(!m_creature->getVictim()->HasAura(SPELL_MANGLEEFFECT, 0))
                {
                    DoCast(m_creature->getVictim(), SPELL_MANGLE);
                    Mangle_Timer = 1000;
                }
                else Mangle_Timer = 10000 + rand()%5000;
            }else Mangle_Timer -= diff;

            if(Surge_Timer < diff)
            {
                DoScriptText(SAY_SURGE, m_creature);

                Unit *target = SelectRandomPlayer(45);
                if(!target) target = m_creature->getVictim();
                isCharging = true;
                ChargeTargetGUID = target->GetGUID();

                float x, y, z;
                target->GetContactPoint(m_creature, x, y, z);
                m_creature->SetSpeed(MOVE_RUN, 5.0f);
                m_creature->GetMotionMaster()->Clear();
                m_creature->GetMotionMaster()->MovePoint(0, x, y, z);

                Surge_Timer = 15000 + rand()%5000;
                return;
            }else Surge_Timer -= diff;
        }
        else
        {
            if(LaceratingSlash_Timer < diff)
            {
                if(!m_creature->getVictim()->HasAura(SPELL_MANGLEEFFECT, 0))
                    DoCast(m_creature->getVictim(), SPELL_LACERATINGSLASH);
                else
                {
                    int32 bp0 = 3470;
                    m_creature->CastCustomSpell(m_creature->getVictim(), SPELL_LACERATINGSLASH, &bp0, NULL, NULL, false);
                }
                LaceratingSlash_Timer = 18000 + rand()%5000;
            }else LaceratingSlash_Timer -= diff;

            if(RendFlesh_Timer < diff)
            {
                if(!m_creature->getVictim()->HasAura(SPELL_MANGLEEFFECT, 0))
                    DoCast(m_creature->getVictim(), SPELL_RENDFLESH);
                else
                {
                    int32 bp1 = 4670;
                    m_creature->CastCustomSpell(m_creature->getVictim(), SPELL_RENDFLESH, NULL, &bp1, NULL, false);
                }
                RendFlesh_Timer = 5000 + rand()%5000;
            }else RendFlesh_Timer -= diff;

            if(DeafeningRoar_Timer < diff)
            {
                DoCast(m_creature->getVictim(), SPELL_DEAFENINGROAR);
                DeafeningRoar_Timer = 15000 + rand()%5000;
            }else DeafeningRoar_Timer -= diff;
        }

        DoMeleeAttackIfReady();
    }
        void HandleFlightSequence()
        {
            switch (uiFlightCount)
            {
                case 0:
                    //me->AttackStop();
                    me->GetMotionMaster()->Clear(false);
                    me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
                    me->StopMoving();
                    Talk(YELL_TAKEOFF);
                    events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 2000);
                    break;
                case 1:
                    me->GetMotionMaster()->MovePoint(0, me->GetPositionX()+1, me->GetPositionY(), me->GetPositionZ()+10);
                    break;
                case 2:
                {
                    Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
                    if (!target)
                        target = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_PLAYER_GUID));

                    if (!target)
                    {
                        EnterEvadeMode();
                        return;
                    }

                    if (Creature* Vapor = me->SummonCreature(NPC_VAPOR, target->GetPositionX() - 5 + rand32() % 10, target->GetPositionY() - 5 + rand32() % 10, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000))
                    {
                        Vapor->AI()->AttackStart(target);
                        me->InterruptNonMeleeSpells(false);
                        DoCast(Vapor, SPELL_VAPOR_CHANNEL, false); // core bug
                        Vapor->CastSpell(Vapor, SPELL_VAPOR_TRIGGER, true);
                    }

                    events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 10000);
                    break;
                }
                case 3:
                {
                    DespawnSummons(NPC_VAPOR_TRAIL);
                    //DoCast(me, SPELL_VAPOR_SELECT); need core support

                    Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
                    if (!target)
                        target = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_PLAYER_GUID));

                    if (!target)
                    {
                        EnterEvadeMode();
                        return;
                    }

                    //target->CastSpell(target, SPELL_VAPOR_SUMMON, true); need core support
                    if (Creature* pVapor = me->SummonCreature(NPC_VAPOR, target->GetPositionX() - 5 + rand32() % 10, target->GetPositionY() - 5 + rand32() % 10, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000))
                    {
                        if (pVapor->AI())
                            pVapor->AI()->AttackStart(target);
                        me->InterruptNonMeleeSpells(false);
                        DoCast(pVapor, SPELL_VAPOR_CHANNEL, false); // core bug
                        pVapor->CastSpell(pVapor, SPELL_VAPOR_TRIGGER, true);
                    }

                    events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 10000);
                    break;
                }
                case 4:
                    DespawnSummons(NPC_VAPOR_TRAIL);
                    events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 1);
                    break;
                case 5:
                {
                    Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
                    if (!target)
                        target = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_PLAYER_GUID));

                    if (!target)
                    {
                        EnterEvadeMode();
                        return;
                    }

                    breathX = target->GetPositionX();
                    breathY = target->GetPositionY();
                    float x, y, z;
                    target->GetContactPoint(me, x, y, z, 70);
                    me->GetMotionMaster()->MovePoint(0, x, y, z+10);
                    break;
                }
                case 6:
                    me->SetFacingTo(me->GetAbsoluteAngle(breathX, breathY));
                    //DoTextEmote("takes a deep breath.", nullptr);
                    events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 10000);
                    break;
                case 7:
                {
                    DoCast(me, SPELL_FOG_BREATH, true);
                    float x, y, z;
                    me->GetPosition(x, y, z);
                    x = 2 * breathX - x;
                    y = 2 * breathY - y;
                    me->GetMotionMaster()->MovePoint(0, x, y, z);
                    events.ScheduleEvent(EVENT_SUMMON_FOG, 1);
                    break;
                }
                case 8:
                    me->CastStop(SPELL_FOG_BREATH);
                    me->RemoveAurasDueToSpell(SPELL_FOG_BREATH);
                    ++uiBreathCount;
                    events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 1);
                    if (uiBreathCount < 3)
                        uiFlightCount = 4;
                    break;
                case 9:
                    if (Unit* target = SelectTarget(SELECT_TARGET_MAXTHREAT))
                        DoStartMovement(target);
                    else
                    {
                        EnterEvadeMode();
                        return;
                    }
                    break;
                case 10:
                    me->SetDisableGravity(false);
                    me->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
                    EnterPhase(PHASE_GROUND);
                    AttackStart(SelectTarget(SELECT_TARGET_MAXTHREAT));
                    break;
            }
            ++uiFlightCount;
        }