void ExecuteEvent(uint32 eventId) override
 {
     switch (eventId)
     {
         case EVENT_FLAMESTRIKE:
             if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
                 DoCast(target, SPELL_FLAMESTRIKE);
             Talk(SAY_COUNCIL_SPECIAL);
             events.Repeat(Seconds(40));
             break;
         case EVENT_BLIZZARD:
             if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
                 DoCast(target, SPELL_BLIZZARD);
             events.Repeat(Seconds(15), Seconds(40));
             break;
         case EVENT_ARCANE_EXPLOSION_CHECK:
             _canUseArcaneExplosion = true;
             break;
         case EVENT_ARCANE_EXPLOSION:
             if (_canUseArcaneExplosion && SelectTarget(SELECT_TARGET_RANDOM, 0, 10.0f))
             {
                 DoCastSelf(SPELL_ARCANE_EXPLOSION);
                 _canUseArcaneExplosion = false;
                 events.ScheduleEvent(EVENT_ARCANE_EXPLOSION_CHECK, Seconds(5));
             }
             events.Repeat(Seconds(1));
             break;
         case EVENT_DAMPEN_MAGIC:
             DoCastSelf(SPELL_DAMPEN_MAGIC);
             break;
         default:
             break;
     }
 }
    void UpdateAI(uint32 diff) override
    {
        if (!UpdateVictim())
            return;

        if (me->HasUnitState(UNIT_STATE_CASTING))
            return;

        events.Update(diff);

        while (uint32 eventId = events.ExecuteEvent())
        {
            switch (eventId)
            {
                case EVENT_SOUL_DRAIN:
                    DoCastSelf(SPELL_SOUL_DRAIN, { SPELLVALUE_MAX_TARGETS, 5 });
                    events.Repeat(Seconds(30), Seconds(35));
                    break;
                case EVENT_FRENZY:
                    Talk(SUFF_SAY_ENRAGE);
                    DoCastSelf(SPELL_FRENZY);
                    events.Repeat(Seconds(45), Seconds(50));
                    break;
                default:
                    break;
            }

            if (me->HasUnitState(UNIT_STATE_CASTING))
                return;
        }

        DoMeleeAttackIfReady();
    }
    void UpdateAI(uint32 diff) override
    {
        if (!UpdateVictim())
            return;

        if (me->HasUnitState(UNIT_STATE_CASTING))
            return;

        events.Update(diff);

        while (uint32 eventId = events.ExecuteEvent())
        {
            switch (eventId)
            {
                case EVENT_CHECK_TANKER:
                {
                    Unit* target = me->GetVictim();
                    if (!_targetGUID || !target)
                        return;

                    if (target->GetGUID() != _targetGUID)
                    {
                        Talk(ANGER_SAY_SEETHE);
                        Talk(ANGER_EMOTE_SEETHE, me);
                        _targetGUID = target->GetGUID();
                        DoCastSelf(SPELL_SEETHE, true);
                    }
                    break;
                }
                case EVENT_SOUL_SCREAM:
                    DoCastSelf(SPELL_SOUL_SCREAM);
                    events.Repeat(Seconds(11));
                    break;
                case EVENT_SPITE:
                    Talk(ANGER_SAY_SPITE);
                    DoCastSelf(SPELL_SPITE, { SPELLVALUE_MAX_TARGETS, 3 });
                    events.Repeat(Seconds(20));
                    break;
                case EVENT_START_CHECK_TANKER:
                    if (Unit* target = me->GetVictim())
                    {
                        _targetGUID = target->GetGUID();
                        events.ScheduleEvent(EVENT_CHECK_TANKER, 1s);
                    }
                    else
                        events.Repeat(Seconds(1));
                    break;
                case EVENT_FREED_2:
                    Talk(ANGER_SAY_FREED_2);
                    break;
                default:
                    break;
            }

            if (me->HasUnitState(UNIT_STATE_CASTING))
                return;
        }

        DoMeleeAttackIfReady();
    }
    void Emerge()
    {
        me->UpdateSpeed(MOVE_RUN);
        uint32 submergeSpell = wasMobile ? SPELL_SUBMERGE : SPELL_SUBMERGE_2;
        me->RemoveAurasDueToSpell(submergeSpell);
        me->RemoveAurasDueToSpell(SPELL_GROUND_VISUAL_0);
        DoCastSelf(SPELL_EMERGE);
        DoCastAOE(SPELL_HATE_TO_ZERO, true);
        me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
        me->SetReactState(REACT_AGGRESSIVE);
        if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
            AttackStart(target);

        // if the worm was mobile before submerging, make him stationary now
        if (wasMobile)
        {
            me->SetControlled(true, UNIT_STATE_ROOT);
            me->SetDisplayId(modelStationary);
            DoCastSelf(SPELL_GROUND_VISUAL_1, true);
            events.SetPhase(PHASE_STATIONARY);
        }
        else
        {
            if (Unit* target = me->GetVictim())
                me->GetMotionMaster()->MoveChase(target);
            me->SetDisplayId(modelMobile);
            events.SetPhase(PHASE_MOBILE);
        }
        wasMobile = !wasMobile;
        ScheduleTasks();
    }
    void Submerge()
    {
        me->SetReactState(REACT_PASSIVE);
        me->AttackStop();

        if (wasMobile)
        {
            me->HandleEmoteCommand(EMOTE_ONESHOT_SUBMERGE);
            DoCastSelf(SPELL_SUBMERGE);
            me->SetSpeedRate(MOVE_RUN, 8.0f);
            DoCastSelf(SPELL_GROUND_VISUAL_0, true);
            events.SetPhase(PHASE_SUBMERGED);
            events.ScheduleEvent(EVENT_EMERGE, 5s, 0, PHASE_SUBMERGED);
            me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
        }
        else
        {
            me->HandleEmoteCommand(EMOTE_ONESHOT_SUBMERGE);
            DoCastSelf(SPELL_SUBMERGE_2);
            me->RemoveAurasDueToSpell(SPELL_GROUND_VISUAL_1);
            me->SetSpeedRate(MOVE_RUN, 1.1111f);
            DoCastSelf(SPELL_GROUND_VISUAL_0, true);
            events.SetPhase(PHASE_SUBMERGED);
            me->SetControlled(false, UNIT_STATE_ROOT);
            events.ScheduleEvent(EVENT_EMERGE, 6s, 0, PHASE_SUBMERGED);
            me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
        }
        me->GetMotionMaster()->MovePoint(0, ToCCommonLoc[1].GetPositionX() + frand(-40.0f, 40.0f), ToCCommonLoc[1].GetPositionY() + frand(-40.0f, 40.0f), ToCCommonLoc[1].GetPositionZ() + me->GetCollisionHeight());
    }
    void MovementInform(uint32 type, uint32 pointId) override
    {
        if (type != POINT_MOTION_TYPE && type != EFFECT_MOTION_TYPE && type != SPLINE_CHAIN_MOTION_TYPE)
            return;

        switch (pointId)
        {
            case POINT_INITIAL_MOVEMENT:
                events.ScheduleEvent(EVENT_ENGAGE, 3s);
                break;
            case POINT_MIDDLE:
                DoCastSelf(SPELL_MASSIVE_CRASH);
                events.ScheduleEvent(EVENT_SELECT_CHARGE_TARGET, 4s);
                break;
            case POINT_ICEHOWL_CHARGE:
                events.Reset();
                events.SetPhase(PHASE_COMBAT);
                RescheduleTasks();
                me->SetReactState(REACT_AGGRESSIVE);
                DoCastSelf(SPELL_TRAMPLE);
                break;
            default:
                break;
        }
    }
    void UpdateAI(uint32 diff) override
    {
        if (!UpdateVictim())
            return;

        events.Update(diff);

        if (me->HasUnitState(UNIT_STATE_CASTING))
            return;

        while (uint32 eventId = events.ExecuteEvent())
        {
            switch (eventId)
            {
                case EVENT_SUBMERGE:
                    DoCastSelf(SPELL_SUBMERGE_VISUAL, true);
                    events.ScheduleEvent(EVENT_SUMMON_ESSENCE, 3s);
                    break;
                case EVENT_SUMMON_ESSENCE:
                {
                    EntryCheckPredicate pred(NPC_ENSLAVED_SOUL);
                    summons.DoAction(ACTION_KILL_SELF, pred);
                    DoCastSelf(GetSummonSpell());
                    break;
                }
                default:
                    break;
            }

            if (me->HasUnitState(UNIT_STATE_CASTING))
                return;
        }
    }
Пример #8
0
 void ExecuteEvent(uint32 eventId) override
 {
     switch (eventId)
     {
         case EVENT_RANDOM_BEAM:
             DoCastSelf(BeamTriggers[urand(0, 3)]);
             events.Repeat(Seconds(30));
             break;
         case EVENT_PRISMATIC_SHIELD:
             DoCastSelf(PrismaticAuras[urand(0, 5)]);
             events.Repeat(Seconds(15));
             break;
         case EVENT_FATAL_ATTRACTION:
             Talk(SAY_SPELL);
             me->CastCustomSpell(SPELL_FATAL_ATTACTION_TELEPORT, SPELLVALUE_MAX_TARGETS, 3, me);
             events.Repeat(Seconds(30));
             break;
         case EVENT_SILENCING_SHRIEK:
             DoCastVictim(SPELL_SILENCING_SHRIEK);
             events.Repeat(Seconds(18), Seconds(30));
             break;
         case EVENT_TAUNT:
             Talk(SAY_TAUNT);
             events.Repeat(Seconds(30), Seconds(40));
             break;
         case EVENT_BERSERK:
             Talk(EMOTE_BERSERK, me);
             DoCastSelf(SPELL_BERSERK);
             break;
         default:
             break;
     }
 }
 void Reset() override
 {
     me->m_Events.AddEventAtOffset([this]()
     {
         DoCastSelf(SPELL_SLIME_POOL_EFFECT, true);
         DoCastSelf(SPELL_PACIFY_SELF, true);
     }, 1s);
 }
Пример #10
0
        void UpdateAI(uint32 diff) override
        {
            if (!events.IsInPhase(PHASE_INTRO) && (!UpdateVictim() || !CheckInRoom()))
                return;

            events.Update(diff);

            if (me->HasUnitState(UNIT_STATE_CASTING))
                return;

            while (uint32 eventId = events.ExecuteEvent())
            {
                switch (eventId)
                {
                    case EVENT_ANRAPHET_APPEAR:
                        me->GetMotionMaster()->MoveSmoothPath(POINT_ANRAPHET_ACTIVATE, AnraphetPath, AnraphetPathSize);
                        break;
                    case EVENT_ANRAPHET_ACTIVATE:
                        Talk(ANRAPHET_SAY_INTRO);
                        events.ScheduleEvent(EVENT_ANRAPHET_DESTRUCTION, Seconds(10), 0, PHASE_INTRO); // Note: 10800 ms
                        break;
                    case EVENT_ANRAPHET_DESTRUCTION:
                        DoCastAOE(SPELL_DESTRUCTION_PROTOCOL);
                        events.ScheduleEvent(EVENT_ANRAPHET_READY, Seconds(6), 0, PHASE_INTRO); // Note: 6400 ms
                        break;
                    case EVENT_ANRAPHET_READY:
                        me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                        events.SetPhase(PHASE_COMBAT);
                        ScheduleCombatEvents();
                        break;
                    case EVENT_ANRAPHET_NEMESIS_STRIKE:
                        DoCastVictim(SPELL_NEMESIS_STRIKE);
                        events.ScheduleEvent(EVENT_ANRAPHET_NEMESIS_STRIKE, Seconds(21), 0, PHASE_COMBAT);
                        break;
                    case EVENT_ANRAPHET_ALPHA_BEAMS:
                        DoCastSelf(SPELL_ALPHA_BEAMS);
                        events.ScheduleEvent(EVENT_ANRAPHET_CRUMBLING_RUIN, Seconds(12), 0, PHASE_COMBAT);
                        events.ScheduleEvent(EVENT_ANRAPHET_ALPHA_BEAMS, Seconds(40), Seconds(45), 0, PHASE_COMBAT);
                        break;
                    case EVENT_ANRAPHET_OMEGA_STANCE:
                        DoCastSelf(SPELL_OMEGA_STANCE_SUMMON);
                        DoCastSelf(SPELL_OMEGA_STANCE);
                        Talk(ANRAPHET_SAY_OMEGA_STANCE);
                        events.ScheduleEvent(EVENT_ANRAPHET_OMEGA_STANCE, Seconds(45), Seconds(50), 0, PHASE_COMBAT);
                        events.ScheduleEvent(EVENT_ANRAPHET_CRUMBLING_RUIN, Seconds(13), 0, PHASE_COMBAT);
                        break;
                    case EVENT_ANRAPHET_CRUMBLING_RUIN:
                        DoCastSelf(SPELL_CRUMBLING_RUIN);
                        break;
                }

                if (me->HasUnitState(UNIT_STATE_CASTING))
                    return;
            }

            if (UpdateVictim())
                DoMeleeAttackIfReady();
        }
            void UpdateAI(uint32 diff) override
            {
                if (!UpdateVictim())
                    return;

                events.Update(diff);

                if (me->HasUnitState(UNIT_STATE_CASTING))
                    return;

                while (uint32 eventId = events.ExecuteEvent())
                {
                    switch (eventId)
                    {
                        case EVENT_FLIGHT:
                        {
                            me->SetCanFly(true);
                            me->SetDisableGravity(true);
                            me->SetByteFlag(UNIT_FIELD_BYTES_1, UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER);
                            me->SetReactState(REACT_PASSIVE);
                            me->AttackStop();
                            Position pos;
                            pos.Relocate(me);
                            pos.m_positionZ += 10.0f;
                            me->GetMotionMaster()->MoveTakeoff(POINT_TAKEOFF, pos);
                            events.CancelEventGroup(EVENT_GROUP_LAND_PHASE);
                            break;
                        }
                        case EVENT_CONFLAGRATION:
                            DoCastSelf(SPELL_CONFLAGRATION, true);
                            break;
                        case EVENT_ENRAGE:
                            DoCastSelf(SPELL_ENRAGE);
                            Talk(EMOTE_ENRAGED);
                            events.Repeat(Seconds(24));
                            break;
                        case EVENT_FLAME_BREATH:
                            DoCastVictim(SPELL_FLAME_BREATH);
                            events.Repeat(Seconds(20), Seconds(30));
                            break;
                        case EVENT_AIR_MOVEMENT:
                            me->GetMotionMaster()->MovePoint(POINT_FLIGHT, SavianaRagefireFlyOutPos);
                            break;
                        case EVENT_LAND_GROUND:
                            me->GetMotionMaster()->MoveLand(POINT_LAND_GROUND, SavianaRagefireLandPos);
                            break;
                        default:
                            break;
                    }

                    if (me->HasUnitState(UNIT_STATE_CASTING))
                        return;
                }

                DoMeleeAttackIfReady();
            }
Пример #12
0
            void UpdateAI(uint32 diff) override
            {
                if (!UpdateVictim())
                    return;

                events.Update(diff);

                if (me->HasUnitState(UNIT_STATE_CASTING))
                    return;

                while (uint32 eventId = events.ExecuteEvent())
                {
                    switch (eventId)
                    {
                        case EVENT_SEARING_LIGHT:
                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
                                DoCast(target, SPELL_SEARING_LIGHT);

                            events.ScheduleEvent(EVENT_SEARING_LIGHT, TIMER_SEARING_LIGHT);
                            break;
                        case EVENT_GRAVITY_BOMB:
                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
                                DoCast(target, SPELL_GRAVITY_BOMB);

                            events.ScheduleEvent(EVENT_GRAVITY_BOMB, TIMER_GRAVITY_BOMB);
                            break;
                        case EVENT_TYMPANIC_TANTRUM:
                            Talk(SAY_TYMPANIC_TANTRUM);
                            Talk(EMOTE_TYMPANIC_TANTRUM);
                            DoCast(SPELL_TYMPANIC_TANTRUM);
                            events.ScheduleEvent(EVENT_TYMPANIC_TANTRUM, urand(TIMER_TYMPANIC_TANTRUM_MIN, TIMER_TYMPANIC_TANTRUM_MAX));
                            break;
                        case EVENT_DISPOSE_HEART:
                            SetPhaseOne();
                            break;
                        case EVENT_ENRAGE:
                            Talk(SAY_BERSERK);
                            DoCastSelf(SPELL_ENRAGE);
                            break;
                        case EVENT_ENTER_HARD_MODE:
                            me->SetFullHealth();
                            DoCastSelf(SPELL_HEARTBREAK, true);
                            me->AddLootMode(LOOT_MODE_HARD_MODE_1);
                            _hardMode = true;
                            SetPhaseOne();
                            break;
                    }

                    if (me->HasUnitState(UNIT_STATE_CASTING))
                        return;
                }

                if (_phase == 1)
                    DoMeleeAttackIfReady();
            }
Пример #13
0
    void UpdateAI(uint32 diff) override
    {
        if (!events.IsInPhase(PHASE_INTRO) && !UpdateVictim())
            return;

        events.Update(diff);

        if (me->HasUnitState(UNIT_STATE_CASTING))
            return;

        while (uint32 eventId = events.ExecuteEvent())
        {
            switch (eventId)
            {
                case EVENT_ENRAGE:
                    DoCast(SPELL_BERSERK);
                    break;
                case EVENT_INCINERATE:
                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
                        DoCast(target, SPELL_INCINERATE);
                    Talk(SAY_INCINERATE);
                    events.Repeat(Seconds(12), Seconds(20));
                    break;
                case EVENT_SUMMON_DOOM_BLOSSOM:
                    DoCastSelf(SPELL_SUMMON_DOOM_BLOSSOM, true);
                    Talk(SAY_BLOSSOM);
                    events.Repeat(Seconds(30), Seconds(40));
                    break;
                case EVENT_SHADOW_DEATH:
                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100.0f, true, true, -SPELL_SPIRITUAL_VENGEANCE))
                        DoCast(target, SPELL_SHADOW_OF_DEATH);
                    events.Repeat(Seconds(30), Seconds(35));
                    break;
                case EVENT_CRUSHING_SHADOWS:
                    DoCastSelf(SPELL_CRUSHING_SHADOWS, { SPELLVALUE_MAX_TARGETS, 5 });
                    Talk(SAY_CRUSHING);
                    events.Repeat(Seconds(18), Seconds(30));
                    break;
                case EVENT_FINISH_INTRO:
                    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
                    me->SetReactState(REACT_AGGRESSIVE);
                    break;
                default:
                    break;
            }

            if (me->HasUnitState(UNIT_STATE_CASTING))
                return;
        }

        DoMeleeAttackIfReady();
    }
Пример #14
0
            void IsSummonedBy(Unit* summoner) override
            {
                _summonerGUID = summoner->GetGUID();

                _scheduler.Schedule(Milliseconds(3650), [this](TaskContext /*context*/)
                {
                    DoCastSelf(SPELL_ICICLE_FALL_TRIGGER, true);
                    DoCastSelf(SPELL_ICICLE_FALL_VISUAL);

                    if (Unit* caster = ObjectAccessor::GetUnit(*me, _summonerGUID))
                        caster->RemoveDynObject(SPELL_ICICLE_SUMMON);
                });
            }
 void DoAction(int32 action) override
 {
     if (action == ACTION_ENRAGE)
     {
         DoCastSelf(SPELL_FROTHING_RAGE, true);
         Talk(EMOTE_TRAMPLE_ENRAGE);
     }
     else if (action == ACTION_TRAMPLE_FAIL)
     {
         DoCastSelf(SPELL_STAGGERED_DAZE, true);
         Talk(EMOTE_TRAMPLE_FAIL);
         events.DelayEvents(15s);
     }
 }
Пример #16
0
 void InitializeAI() override
 {
     float x, y, z;
     me->GetNearPoint(me, x, y, z, 1, 100.0f, frand(0.f, 2.f * float(M_PI)));
     me->GetMotionMaster()->MovePoint(0, x, y, z);
     DoCastSelf(SPELL_MOLTEN_FLAME, true);
 }
Пример #17
0
            void ExposeHeart()
            {
                Talk(SAY_HEART_OPENED);
                Talk(EMOTE_HEART_OPENED);

                DoCastSelf(SPELL_SUBMERGE);  // Will make creature untargetable
                me->AttackStop();
                me->SetReactState(REACT_PASSIVE);

                Unit* heart = me->GetVehicleKit() ? me->GetVehicleKit()->GetPassenger(HEART_VEHICLE_SEAT_NORMAL) : nullptr;
                if (heart)
                {
                    heart->CastSpell(heart, SPELL_HEART_OVERLOAD);
                    heart->CastSpell(me, SPELL_HEART_LIGHTNING_TETHER);
                    heart->CastSpell(heart, SPELL_HEART_HEAL_TO_FULL, true);
                    heart->CastSpell(me, SPELL_RIDE_VEHICLE_EXPOSED, true);
                    heart->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                    heart->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29);
               }

                events.CancelEvent(EVENT_SEARING_LIGHT);
                events.CancelEvent(EVENT_GRAVITY_BOMB);
                events.CancelEvent(EVENT_TYMPANIC_TANTRUM);

                // Start "end of phase 2 timer"
                events.ScheduleEvent(EVENT_DISPOSE_HEART, TIMER_HEART_PHASE);

                // Phase 2 has officially started
                _phase = 2;
                _heartExposed++;
            }
Пример #18
0
 void DoAction(int32 action) override
 {
     switch (action)
     {
         case ACTION_PET_DIED:
             if (!_petCount) // underflow check - something has gone horribly wrong
             {
                 EnterEvadeMode(EVADE_REASON_OTHER);
                 return;
             }
             if (!--_petCount) // last pet died, emerge
             {
                 me->RemoveAurasDueToSpell(SPELL_SUBMERGE);
                 me->RemoveAurasDueToSpell(SPELL_IMPALE_AURA);
                 me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
                 DoCastSelf(SPELL_EMERGE);
                 events.SetPhase(PHASE_EMERGE);
                 events.ScheduleEvent(EVENT_POUND, randtime(Seconds(13), Seconds(18)), 0, PHASE_EMERGE);
                 events.ScheduleEvent(EVENT_LEECHING_SWARM, randtime(Seconds(3), Seconds(7)), 0, PHASE_EMERGE);
                 events.ScheduleEvent(EVENT_CARRION_BEETLES, randtime(Seconds(10), Seconds(15)), 0, PHASE_EMERGE);
             }
             break;
         case ACTION_PET_EVADE:
             EnterEvadeMode(EVADE_REASON_OTHER);
             break;
     }
 }
 void ScheduleEvents() override
 {
     events.ScheduleEvent(EVENT_FLAMESTRIKE, Seconds(8));
     events.ScheduleEvent(EVENT_BLIZZARD, Seconds(25));
     events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, Seconds(5));
     DoCastSelf(SPELL_DAMPEN_MAGIC);
 }
 void Reset() override
 {
     _Reset();
     _inCombat = false;
     me->SummonCreatureGroup(SUMMON_COUNCIL_GROUP);
     DoCastSelf(SPELL_EMPYREAL_BALANCE, true);
 }
Пример #21
0
 void Reset() override
 {
     _scheduler.Schedule(Seconds(3), [this](TaskContext /*context*/)
     {
         DoCastSelf(SPELL_VOLCANIC_ERUPTION);
     });
 }
Пример #22
0
 void Reset() override
 {
     _scheduler.Schedule(Seconds(1), [this](TaskContext consumption)
     {
         DoCastSelf(SPELL_CONSUMPTION);
         consumption.Repeat();
     });
 }
            void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override
            {
                if (summon->GetEntry() == NPC_APOTHECARY_FRYE || summon->GetEntry() == NPC_APOTHECARY_BAXTER)
                    _deadCount++;

                if (me->HasAura(SPELL_PERMANENT_FEIGN_DEATH) && _deadCount == 2)
                    DoCastSelf(SPELL_QUIET_SUICIDE, true);
            }
Пример #24
0
 void DamageTaken(Unit* /*source*/, uint32& damage) override
 {
     if (_hadFrenzy || !me->HealthBelowPctDamaged(25, damage))
         return;
     _hadFrenzy = true;
     Talk(CRUSHER_EMOTE_FRENZY);
     DoCastSelf(SPELL_FRENZY);
 }
 void ExecuteEvent(uint32 eventId) override
 {
     switch (eventId)
     {
         case EVENT_DEADLY_STRIKE:
             DoCastSelf(SPELL_DEADLY_STRIKE);
             events.Repeat(Seconds(60));
             break;
         case EVENT_VANISH:
             DoCastSelf(SPELL_VANISH);
             Talk(SAY_COUNCIL_SPECIAL);
             events.Repeat(Seconds(60));
             break;
         default:
             break;
     }
 }
Пример #26
0
    void JustEngagedWith(Unit* /*who*/) override
    {
        DoZoneInCombat();

        DoCastSelf(SPELL_FROZEN_MALLET_2);

        _events.ScheduleEvent(EVENT_FROST_BLAST, 5000);
    }
Пример #27
0
    void IsSummonedBy(Unit* /*summoner*/) override
    {
        DoCastSelf(SPELL_FROZEN_ORB_AURA, true);
        DoCastSelf(SPELL_FROZEN_ORB_DMG, true);
        DoCastSelf(SPELL_RANDOM_AGGRO, true);

        if (Creature* toravon = me->GetInstanceScript()->GetCreature(DATA_TORAVON))
        {
            if (toravon->IsInCombat())
            {
                toravon->AI()->JustSummoned(me);
                DoZoneInCombat();
            }
            else
                me->DespawnOrUnsummon();
        }
    }
 void ExecuteEvent(uint32 eventId) override
 {
     switch (eventId)
     {
         case EVENT_ENGAGE:
             instance->DoCloseDoorOrButton(instance->GetGuidData(DATA_MAIN_GATE));
             me->SetImmuneToPC(false);
             events.SetPhase(PHASE_COMBAT);
             me->SetReactState(REACT_AGGRESSIVE);
             DoZoneInCombat();
             break;
         case EVENT_MASSIVE_CRASH:
             me->SetReactState(REACT_PASSIVE);
             me->AttackStop();
             events.SetPhase(PHASE_CHARGE);
             me->GetMotionMaster()->MoveJump(ToCCommonLoc[1], 20.0f, 20.0f, POINT_MIDDLE);
             break;
         case EVENT_SELECT_CHARGE_TARGET:
             if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
             {
                 DoCast(target, SPELL_FURIOUS_CHARGE_SUMMON, true);
                 me->SetTarget(target->GetGUID());
                 Talk(EMOTE_TRAMPLE_ROAR, target);
                 events.ScheduleEvent(EVENT_ICEHOWL_ROAR, 1s);
             }
             break;
         case EVENT_ICEHOWL_ROAR:
             if (Creature* stalker = instance->GetCreature(DATA_FURIOUS_CHARGE))
                 DoCast(stalker, SPELL_ROAR);
             events.ScheduleEvent(EVENT_JUMP_BACK, 3s, 0, PHASE_CHARGE);
             break;
         case EVENT_JUMP_BACK:
             if (Creature* stalker = instance->GetCreature(DATA_FURIOUS_CHARGE))
                 DoCast(stalker, SPELL_JUMP_BACK);
             events.ScheduleEvent(EVENT_TRAMPLE, 2s, 0, PHASE_CHARGE);
             break;
         case EVENT_TRAMPLE:
             if (Creature* stalker = instance->GetCreature(DATA_FURIOUS_CHARGE))
                 me->GetMotionMaster()->MoveCharge(stalker->GetPositionX(), stalker->GetPositionY(), stalker->GetPositionZ(), 42.0f, POINT_ICEHOWL_CHARGE);
             me->SetTarget(ObjectGuid::Empty);
             break;
         case EVENT_FEROCIOUS_BUTT:
             DoCastVictim(SPELL_FEROCIOUS_BUTT);
             events.Repeat(20s);
             break;
         case EVENT_ARCTIC_BREATH:
             if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
                 DoCast(target, SPELL_ARCTIC_BREATH);
             events.Repeat(24s);
             break;
         case EVENT_WHIRL:
             DoCastSelf(SPELL_WHIRL);
             events.Repeat(16s);
             break;
         default:
             break;
     }
 }
Пример #29
0
 void EnterCombat(Unit* /*who*/) override
 {
     DoCastSelf(SPELL_STATIC_CHARGED);
     _scheduler.Schedule(Seconds(12), [this](TaskContext spellShock)
     {
         DoCastVictim(SPELL_SHOCK);
         spellShock.Repeat();
     });
 }
Пример #30
0
 void DamageTaken(Unit* /*attacker*/, uint32& damage) override
 {
     if (me->HealthBelowPctDamaged(30, damage) && !_hasEnraged)
     {
         _hasEnraged = true;
         Talk(SAY_ENRAGE);
         DoCastSelf(SPELL_ENRAGE);
     }
 }