Example #1
0
            void UpdateAI(uint32 diff) override
            {
                if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_STUNNED) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED))
                    return;

                events.Update(diff);

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

                while (uint32 eventId = events.ExecuteEvent())
                {
                    switch (eventId)
                    {
                        case EVENT_CONJURE_FIRE:
                            if (summons.size() >= RAID_MODE<uint64>(2, 4))
                                break;
                            DoCast(me, SPELL_CONJURE_FIRE, true);
                            events.ScheduleEvent(EVENT_CONJURE_FIRE, 15s, 20s);
                            break;
                        case EVENT_MELT_ICE:
                            if (Creature* FlashFreeze = me->FindNearestCreature(NPC_FLASH_FREEZE, 50.0f, true))
                                DoCast(FlashFreeze, SPELL_MELT_ICE, true);
                            events.ScheduleEvent(EVENT_MELT_ICE, 10s, 15s);
                            break;
                    }

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

                DoSpellAttackIfReady(SPELL_FIREBALL);
            }
Example #2
0
            void UpdateAI(const uint32 diff)
            {
                if (!UpdateVictim())
                    return;

                DoSpellAttackIfReady(SPELL_CHAIN_LIGHTNING);
            }
Example #3
0
            void UpdateAI(uint32 const diff)
            {
                if (!UpdateVictim() || me->HasUnitState(UNIT_STAT_STUNNED) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED))
                    return;

                events.Update(diff);

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

                while (uint32 eventId = events.ExecuteEvent())
                {
                    switch (eventId)
                    {
                        case EVENT_STORM_CLOUD:
                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
                                DoCast(target, SPELL_STORM_CLOUD, true);
                            events.ScheduleEvent(EVENT_STORM_CLOUD, urand(15000, 20000));
                            break;
                        default:
                            break;
                    }
                }

                DoSpellAttackIfReady(SPELL_LAVA_BURST);
            }
void TurretAI::UpdateAI(uint32 /*diff*/)
{
    if (!UpdateVictim())
        return;

    DoSpellAttackIfReady(me->m_spells[0]);
}
Example #5
0
    void UpdateAI(uint32 /*diff*/) override
    {
        if (!UpdateVictim())
            return;

        DoSpellAttackIfReady(SPELL_ERUPTION);
    }
Example #6
0
            void UpdateAI(uint32 const diff)
            {
                if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_STUNNED) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED))
                    return;

                events.Update(diff);

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

                while (uint32 eventId = events.ExecuteEvent())
                {
                    switch (eventId)
                    {
                        case EVENT_CONJURE_FIRE:
                            if (summons.size() >= RAID_MODE<uint64>(2, 4))
                                break;
                            // The fire is gets positioned at a random coordinate.
                            DoCast(me, SPELL_CONJURE_FIRE, true);
                            events.ScheduleEvent(EVENT_CONJURE_FIRE, urand(15*IN_MILLISECONDS, 20*IN_MILLISECONDS));
                            return;
                        case EVENT_MELT_ICE:
                            if (Creature* FlashFreeze = me->FindNearestCreature(NPC_FLASH_FREEZE, 50.0f, true))
                                DoCast(FlashFreeze, SPELL_MELT_ICE, true);
                            events.ScheduleEvent(EVENT_MELT_ICE, urand(10*IN_MILLISECONDS, 15*IN_MILLISECONDS));
                            return;
                        default:
                            return;
                    }
                }

                DoSpellAttackIfReady(SPELL_FIREBALL);
            }
            void UpdateAI(const uint32 uiDiff)
            {
                if (!UpdateVictim())
                    return;

                DoSpellAttackIfReady(DUNGEON_MODE(CLAW_PUNCTURE,CLAW_PUNCTURE_H));
            }
Example #8
0
            void UpdateAI(uint32 const diff)
            {
                if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_STUNNED) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED))
                    return;

                events.Update(diff);

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

                while (uint32 eventId = events.ExecuteEvent())
                {
                    switch (eventId)
                    {
                        case EVENT_STARLIGHT:
                            // This was somehow senseless - the spell persists ~1 min, thus refreshing it every half a minute is ... curious.
                            DoCast(me, SPELL_STARLIGHT, true);
                            events.ScheduleEvent(EVENT_STARLIGHT, urand(25*IN_MILLISECONDS, 35*IN_MILLISECONDS));
                            break;
                        default:
                            break;
                    }
                }

                if (!me->HasAura(AURA_MOONKIN))
                    me->AddAura(AURA_MOONKIN, me);

                DoSpellAttackIfReady(SPELL_WRATH);
            }
Example #9
0
            void UpdateAI(uint32 const diff)
            {
                if (!UpdateVictim() || me->HasUnitState(UNIT_STAT_STUNNED) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED))
                    return;

                events.Update(diff);

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

                while (uint32 eventId = events.ExecuteEvent())
                {
                    switch (eventId)
                    {
                        case EVENT_STARLIGHT:
                            DoCast(me, SPELL_STARLIGHT, true);
                            events.ScheduleEvent(EVENT_STARLIGHT, urand(25000, 35000));
                            break;
                        default:
                            break;
                    }
                }

                DoSpellAttackIfReady(SPELL_WRATH);
            }
Example #10
0
            void UpdateAI(uint32 const diff)
            {
                if (!UpdateVictim() || me->HasUnitState(UNIT_STAT_STUNNED) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED))
                    return;

                events.Update(diff);

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

                while (uint32 eventId = events.ExecuteEvent())
                {
                    switch (eventId)
                    {
                        case EVENT_CONJURE_FIRE:
                            DoCast(me, SPELL_CONJURE_FIRE, true);
                            events.ScheduleEvent(EVENT_CONJURE_FIRE, urand(35000, 40000));
                            break;
                        case EVENT_MELT_ICE:
                            if (Creature* FlashFreeze = me->FindNearestCreature(NPC_FLASH_FREEZE, 50.0f, true))
                                DoCast(FlashFreeze, SPELL_MELT_ICE, true);
                            events.ScheduleEvent(EVENT_MELT_ICE, urand(10000, 15000));
                            break;
                    }
                }

                DoSpellAttackIfReady(SPELL_FIREBALL);
            }
Example #11
0
        void UpdateAI(const uint32 diff)
        {
            if (nextWP && movementStarted && !movementCompleted && !nextMovementStarted)
            {
                nextMovementStarted = true;
                me->GetMotionMaster()->MovePoint(nextWP, WaypointPositions[nextWP]);
            }

            if (!UpdateVictim() || !CheckInRoom() || !movementCompleted)
                return;

            events.Update(diff);

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

            while (uint32 eventId = events.ExecuteEvent())
            {
                switch (eventId)
                {
                    case EVENT_MARK:
                        Talk(SAY_SPECIAL);
                        DoCastAOE(SPELL_MARK[id]);
                        events.ScheduleEvent(EVENT_MARK, 15000);
                        break;
                    case EVENT_CAST:
                        Talk(SAY_TAUNT);
                        if (caster)
                        {
                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f))
                                DoCast(target, SPELL_PRIMARY(id));
                        }
                        else
                            DoCast(me->getVictim(), SPELL_PRIMARY(id));

                        events.ScheduleEvent(EVENT_CAST, 15000);
                        break;
                    case EVENT_BERSERK:
                        Talk(SAY_SPECIAL);
                        DoCast(me, EVENT_BERSERK);
                        break;
                }
            }

            if (punishTimer <= diff)
            {
                if (doDelayPunish)
                {
                    DoCastAOE(SPELL_PUNISH[id], true);
                    doDelayPunish = false;
                }
                punishTimer = 2000;
            } else punishTimer -= diff;

            if (!caster)
                DoMeleeAttackIfReady();
            else if ((!DoSpellAttackIfReady(SPELL_SECONDARY(id)) || !me->IsWithinLOSInMap(me->getVictim())) && movementCompleted && !doDelayPunish)
                doDelayPunish = true;
        }
Example #12
0
void ArchorAI::UpdateAI(const uint32 /*diff*/) {
	if (!UpdateVictim())
		return;

	if (!me->IsWithinCombatRange(me->getVictim(), m_minRange))
		DoSpellAttackIfReady(me->m_spells[0]);
	else
		DoMeleeAttackIfReady();
}
Example #13
0
void TurretAI::UpdateAI(const uint32 diff)
{
    if (!UpdateVictim())
        return;

    DoSpellAttackIfReady(me->m_spells[0]);

    //if (!DoSpellAttackIfReady(me->m_spells[0]))
        //if (HostileReference *ref = me->getThreatManager().getCurrentVictim())
            //ref->removeReference();
}
Example #14
0
            void UpdateAI(uint32 diff) override
            {
                // Only update events if Millhouse is aggressive
                if (me->GetReactState() != REACT_AGGRESSIVE)
                    return;

                events.Update(diff);

                // Impending Doom is exception because it needs to be interrupted.
                if (me->HasUnitState(UNIT_STATE_CASTING) && !me->GetCurrentSpell(SPELL_IMPENDING_DOOM))
                    return;

                while (uint32 eventId = events.ExecuteEvent())
                {
                    switch (eventId)
                    {
                        case EVENT_FROSTBOLT_VOLLEY:
                            DoCast(SPELL_FROSTBOLT_VOLLEY);
                            events.ScheduleEvent(EVENT_FROSTBOLT_VOLLEY, 7000);
                            break;
                        case EVENT_SHADOWFURY:
                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
                                DoCast(target, SPELL_SHADOWFURY);
                            events.ScheduleEvent(EVENT_SHADOWFURY, 7000);
                            break;
                        case EVENT_FEAR:
                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
                                DoCast(target, SPELL_FEAR);
                            events.ScheduleEvent(EVENT_FEAR, 18000);
                            break;
                        case EVENT_READY_FOR_COMBAT:
                            me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT);
                            me->SetReactState(REACT_AGGRESSIVE);
                            ScheduleEvents();
                            break;
                        case EVENT_CAST_IMPENDING_DOOM:
                            DoCast(SPELL_IMPENDING_DOOM);
                            DoCast(SPELL_IMPENDING_DOOM_CHANNEL);
                            events.ScheduleEvent(EVENT_INTERRUPT_IMPENDING_DOOM, urand(15000,20000));
                            break;
                        case EVENT_INTERRUPT_IMPENDING_DOOM:
                            me->InterruptNonMeleeSpells(true);
                            me->RemoveAllAuras();
                            me->HandleEmoteCommand(EMOTE_ONESHOT_KNOCKDOWN);
                            events.ScheduleEvent(EVENT_CAST_IMPENDING_DOOM, 3000);
                            break;
                        default:
                            break;
                    }
                }

                DoSpellAttackIfReady(SPELL_SHADOW_BOLT);
            }
Example #15
0
        void UpdateAI(const uint32 uiDiff)
        {
            if (!UpdateVictim())
                return;

            // Shadow Burst ad area e reset threat
            if (BurstTimer <= uiDiff)
            {
                me->InterruptNonMeleeSpells(false);
                me->DeleteThreatList();
                DoCast(me->GetVictim(), SHADOW_BURST);
                BurstTimer = urand(25000,35000);
            } else BurstTimer -= uiDiff;

            // Storm of Grief ogni 20 sec colpisce ad area
            if (GriefTimer <= uiDiff)
            {
                me->InterruptNonMeleeSpells(false);
                if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM,0))
                    DoCast(pTarget, STORM_OF_GRIEF);
                GriefTimer = 20000;
            } else GriefTimer -= uiDiff;

            // Ogni 10 sec casta Piercing Shadow sul target a maggior aggro dopo il tank
            if (PiercingTimer <= uiDiff)
            {
                me->InterruptNonMeleeSpells(false);
                if (Unit *pTarget = SelectTarget(SELECT_TARGET_TOPAGGRO,0))
                    DoCast(pTarget, PIERCING_SHADOW);
                PiercingTimer = 10000;
            } else PiercingTimer -= uiDiff;

            // Ogni 15 sec casta Shadow Flame che fa danno a cono
            if (FlameTimer <= uiDiff)
            {
                me->InterruptNonMeleeSpells(false);
                DoCastAOE(SHADOW_FLAME);
                FlameTimer = 15000;
            } else FlameTimer -= uiDiff;

            // Ogni 45 sec casta Harvest Soul su tutto il raid
            if (HarvestTimer <= uiDiff)
            {
                me->InterruptNonMeleeSpells(false);
                me->MonsterYell(SAY_PEROTHARN_SOUL, LANG_UNIVERSAL, 0);
                DoCastAOE(HARVEST_SOUL);
                HarvestTimer = 45000;
            } else HarvestTimer -= uiDiff;

            DoSpellAttackIfReady(SHADOW_BOLT);
        }
Example #16
0
    void UpdateAI(const uint32 uiDiff)
    {
        if (!UpdateVictim())
            return;
            
        if (StarlightTimer <= uiDiff)
        {
            DoCast(me, SPELL_STARLIGHT);
            StarlightTimer = urand(25000, 35000);
        }
        else StarlightTimer -= uiDiff;

        DoSpellAttackIfReady(SPELL_WRATH);
    }
Example #17
0
    void UpdateAI(const uint32 uiDiff)
    {
        if (!UpdateVictim())
            return;
            
        if (StormTimer <= uiDiff)
        {
            DoCast(me, RAID_MODE(SPELL_STORM_CLOUD_10, SPELL_STORM_CLOUD_25));
            StormTimer = urand(25000, 30000);
        }
        else StormTimer -= uiDiff;

        DoSpellAttackIfReady(SPELL_LAVA_BURST);
    }
Example #18
0
    void UpdateAI(const uint32 uiDiff)
    {
        if (!UpdateVictim())
            return;
            
        if (FireTimer <= uiDiff)
        {
            DoCast(me, SPELL_CONJURE_FIRE);
            FireTimer = urand(25000, 35000);
        }
        else FireTimer -= uiDiff;

        DoSpellAttackIfReady(SPELL_FIREBALL);
    }
Example #19
0
            void UpdateAI(uint32 diff) override
            {
                if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_STUNNED) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED))
                    return;

                events.Update(diff);

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

                if (HealthBelowPct(30))
                    DoCast(me, SPELL_GREATER_HEAL);

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

                while (uint32 eventId = events.ExecuteEvent())
                {
                    switch (eventId)
                    {
                        case EVENT_HEAL:
                            DoCastAOE(SPELL_GREATER_HEAL);
                            events.ScheduleEvent(EVENT_HEAL, 7500ms, 10s);
                            break;
                        case EVENT_DISPEL_MAGIC:
                        {
                            std::list<Unit*> TargetList;
                            Trinity::AnyFriendlyUnitInObjectRangeCheck checker(me, me, 30.0f);
                            Trinity::UnitListSearcher<Trinity::AnyFriendlyUnitInObjectRangeCheck> searcher(me, TargetList, checker);
                            Cell::VisitAllObjects(me, searcher, 30.0f);
                            for (std::list<Unit*>::iterator itr = TargetList.begin(); itr != TargetList.end(); ++itr)
                                if ((*itr)->HasAura(SPELL_FREEZE))
                                    DoCast(*itr, SPELL_DISPEL_MAGIC, true);
                            events.ScheduleEvent(EVENT_DISPEL_MAGIC, 15s, 20s);
                            break;
                        }
                        default:
                            break;
                    }

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

                DoSpellAttackIfReady(SPELL_SMITE);
            }
Example #20
0
    void UpdateAI(const uint32 uiDiff)
    {
        if (!UpdateVictim())
            return;
            
        if (HealthBelowPct(35))
            DoCastAOE(SPELL_GREATER_HEAL);

        if (HealTimer <= uiDiff)
        {
            DoCastAOE(SPELL_GREATER_HEAL);
            HealTimer = urand(12000, 14000);
        }
        else HealTimer -= uiDiff;

        DoSpellAttackIfReady(SPELL_SMITE);
    }
Example #21
0
        void UpdateAI(const uint32 diff)
        {
            if (tSeek <= diff)
            {
                if ((me->isAlive()) && (!me->isInCombat() && (me->GetDistance2d(me->GetHomePosition().GetPositionX(), me->GetHomePosition().GetPositionY()) <= 1.0f)))
                    if (Creature* enemy = me->FindNearestCreature(NPC_BLOODFANG_WORGEN, 5.0f, true))
                        me->AI()->AttackStart(enemy); //She should really only grab agro when npc Cleese is not there, so we will keep this range small
                tSeek = urand(1000, 2000); //optimize cpu load, seeking only sometime between 1 and 2 seconds
            }
            else tSeek -= diff;

            if (!UpdateVictim())
                return;

            if (dmgCount < 2)
                DoSpellAttackIfReady(SPELL_FROSTBOLT_VISUAL_ONLY); //Dummy spell, visual only to prevent getting agro (Blizz-like)
        }
    void UpdateAI(const uint32 diff)
    {
        if(!me->isInCombat())
            return;

        if(me->getThreatManager().isThreatListEmpty())
        {
            EnterEvadeMode();
            return;
        }

        events.Update(diff);

        if(me->hasUnitState(UNIT_STAT_CASTING))
            return;

        uint32 eventId = events.GetEvent();
        if(!me->getVictim())
            eventId = EVENT_PURSUE;

        switch(eventId)
        {
            case 0:
                return;
            case EVENT_PURSUE:
                DoCastAOE(SPELL_PURSUED);
                events.RepeatEvent(35000);
                return;
            case EVENT_MISSILE:
                //TODO: without unittarget no visual effect
                //DoCastAOE(SPELL_MISSILE_BARRAGE);
                DoCast(me->getVictim(), SPELL_MISSILE_BARRAGE);
                events.RepeatEvent(1500);
                return;
            case EVENT_VENT:
                DoCastAOE(SPELL_FLAME_VENTS);
                events.RepeatEvent(20000);
                return;
            default:
                events.PopEvent();
                break;
        }

        DoSpellAttackIfReady(SPELL_BATTERING_RAM);
    }
Example #23
0
            void UpdateAI(const uint32 diff)
            {
                if (!UpdateVictim())
                    return;

                events.Update(diff);
                
                while(uint32 eventId = events.ExecuteEvent())
                {
                    switch(eventId)
                    {
                        case EVENT_DEFLECTING_WINDS:
                            DoCast(me, SPELL_DEFLECTING_WINDS, true);
                            break;
                        case EVENT_STORM_BOLT_RANDOM:
                            DoCastRandom(SPELL_STORM_BOLT_RANDOM, 100.0f, true);
                            events.ScheduleEvent(EVENT_STORM_BOLT_RANDOM, urand(20000, 25000), 0, PHASE_ONE);
                            break;
                        case EVENT_SUMMON_NPC_SERVANT_OF_SIAMAT:
                            DoCast(SPELL_STATIC_SHOCK);
                            events.ScheduleEvent(EVENT_SUMMON_NPC_SERVANT_OF_SIAMAT, 20000, 0, PHASE_ONE);
                            break;
                        case EVENT_SUMMON_NPC_MINION_OF_SIAMAT:
                            Talk(SAY_EVENT);
                            DoCast(SPELL_CALL_OF_SKY);
                            events.ScheduleEvent(EVENT_SUMMON_NPC_MINION_OF_SIAMAT, 20000, 0, PHASE_ALL);
                            break;
                        case EVENT_ABSORB_STORMS:
                            DoCastAOE(SPELL_ABSORB_STORMS);
                            events.ScheduleEvent(EVENT_ABSORB_STORMS, 25 * IN_MILLISECONDS, 0, PHASE_TWO);
                            break;
                        case EVENT_CLOUD_BURST_SUMMON:
                            DoCastRandom(SPELL_CLOUD_BURST_SUMMON, 100.0f, true);
                            events.ScheduleEvent(EVENT_CLOUD_BURST_SUMMON, urand(15000, 20000), 0, PHASE_ALL);
                            break;
                        default:
                            break;
                    }
                }
                if (events.IsInPhase(PHASE_ONE))
                    DoSpellAttackIfReady(SPELL_STORM_BOLT);
                else
                    DoMeleeAttackIfReady();
            }
Example #24
0
		void UpdateAI(const uint32 uiDiff)
		{
			if (!UpdateVictim())
				return;

			// Army of the dead
			if (ArmyTimer <= uiDiff)
			{
				me->InterruptNonMeleeSpells(false);
				if (Unit *pTarget = SelectTarget(SELECT_TARGET_TOPAGGRO,0))
					DoCast(pTarget, SPELL_ARMY_OF_THE_DEAD);
				ArmyTimer = 45000;
			} else ArmyTimer -= uiDiff;


			// Mind Control
			if (ControlTimer <= uiDiff)
			{
				me->InterruptNonMeleeSpells(false);
				if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM,0))
					DoCast(pTarget, SPELL_MIND_CONTROL);
				me->MonsterYell(SAY_LYS_LADIMORE_MIND_CONTROL, LANG_UNIVERSAL, 0);
				ControlTimer = 30000;
			} else ControlTimer -= uiDiff;

			// Piercing shadow
			if (PiercingTimer <= uiDiff)
			{
				me->InterruptNonMeleeSpells(false);
				if (Unit *pTarget = SelectTarget(SELECT_TARGET_TOPAGGRO,0))
					DoCast(pTarget, SPELL_PIERCING_SHADOW);
				PiercingTimer = 10000;
			} else PiercingTimer -= uiDiff;

			// AOE Shadow Bolt Volley
			if (VolleyTimer <= uiDiff)
			{
				DoCastAOE(SPELL_SHADOW_BOLT_VOLLEY);
				VolleyTimer = 15000;
			} else VolleyTimer -= uiDiff;


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

            events.Update(diff);

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

            while (uint32 eventId = events.ExecuteEvent())
            {
                ExecuteEvent(eventId);
                if (me->HasUnitState(UNIT_STATE_CASTING))
                    return;
            }

            DoSpellAttackIfReady(SPELL_EMPOWERED_SMITE);
        }
Example #26
0
            void UpdateAI(uint32 diff) override
            {
                if (!UpdateVictim())
                    return;

                if (_phase == 0 && !CheckGuardAlive())
                {
                    _phase = 1;
                    me->SetCanDualWield(true);
                    DoCast(me, SPELL_WINDFURY, true);
                }

                scheduler.Update(diff, [this]
                {
                    if (_phase == 1)
                        DoSpellAttackIfReady(SPELL_STORMSTRIKE);
                    else
                        DoMeleeAttackIfReady();
                });
            }
Example #27
0
            void UpdateAI(uint32 const diff)
            {
                if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_STUNNED) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED))
                    return;

                events.Update(diff);

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

                if (HealthBelowPct(30))
                    DoCast(me, SPELL_GREATER_HEAL);

                while (uint32 eventId = events.ExecuteEvent())
                {
                    switch (eventId)
                    {
                        case EVENT_HEAL:
                            DoCastAOE(SPELL_GREATER_HEAL);
                            events.ScheduleEvent(EVENT_HEAL, urand(7.5*IN_MILLISECONDS, 10*IN_MILLISECONDS));
                            return;
                        case EVENT_DISPEL_MAGIC:
                        {
                            std::list<Unit*> allies;
                            Trinity::AnyFriendlyUnitInObjectRangeCheck checker(me, me, 30.0f);
                            Trinity::UnitListSearcher<Trinity::AnyFriendlyUnitInObjectRangeCheck> searcher(me, allies, checker);
                            me->VisitNearbyObject(30.0f, searcher);
                            // TODO: Check if the below is intended: it will dispell freeze from every player
                            for (std::list<Unit*>::iterator itr = allies.begin(); itr != allies.end(); ++itr)
                                if ((*itr)->HasAura(SPELL_FREEZE))
                                    DoCast(*itr, SPELL_DISPEL_MAGIC, true);
                            events.ScheduleEvent(EVENT_DISPEL_MAGIC, urand(15*IN_MILLISECONDS, 20*IN_MILLISECONDS));
                            return;
                        }
                        default:
                            break;
                    }
                }

                DoSpellAttackIfReady(SPELL_SMITE);
            }
Example #28
0
    void UpdateAI(const uint32 diff)
    {
        if (!UpdateVictim() || !CheckInRoom())
            return;

        events.Update(diff);

        if (me->hasUnitState(UNIT_STAT_CASTING))
            return;

        while(uint32 eventId = events.ExecuteEvent())
        {
            switch(eventId)
            {
                case EVENT_MARK:
                    if (!(rand()%5))
                        DoScriptText(SAY_SPECIAL[id], me);
                    DoCastAOE(SPELL_MARK[id]);
                    events.ScheduleEvent(EVENT_MARK, 15000);
                    return;
                case EVENT_CAST:
                    if (!(rand()%5))
                        DoScriptText(SAY_TAUNT[rand()%3][id], me);
                    DoCast(SPELL_PRIMARY(id));
                    events.ScheduleEvent(EVENT_CAST, 15000);
                    return;
                case EVENT_BERSERK:
                    DoScriptText(SAY_SPECIAL[id], me);
                    DoCast(me, EVENT_BERSERK);
                    return;
            }
        }

        if (!caster)
            DoMeleeAttackIfReady();
        else if (!DoSpellAttackIfReady(SPELL_SECONDARY(id)))
            DoCastAOE(SPELL_PUNISH[id]);
    }
Example #29
0
            void UpdateAI(uint32 const diff)
            {
                if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_STUNNED) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED))
                    return;

                events.Update(diff);

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

                while (uint32 eventId = events.ExecuteEvent())
                {
                    switch (eventId)
                    {
                        case EVENT_STORM_CLOUD:
                            {
                                std::list<Unit*> allies;
                                Trinity::AnyFriendlyUnitInObjectRangeCheck checker(me, me, 30.0f);
                                Trinity::UnitListSearcher<Trinity::AnyFriendlyUnitInObjectRangeCheck> searcher(me, allies, checker);
                                me->VisitNearbyWorldObject(30.0f, searcher);
                                if (!allies.empty())
                                {
                                    std::list<Unit*>::iterator iter = allies.begin();
                                    DoCast((*iter), SPELL_STORM_CLOUD, true);
                                    events.ScheduleEvent(EVENT_STORM_CLOUD, urand(15*IN_MILLISECONDS, 20*IN_MILLISECONDS));
                                }
                                else
                                    events.ScheduleEvent(EVENT_STORM_CLOUD, urand(2*IN_MILLISECONDS, 3*IN_MILLISECONDS)); // No target found, check again in a short period of time
                            
                            }
                            break;
                        default:
                            break;
                    }
                }

                DoSpellAttackIfReady(SPELL_LAVA_BURST);
            }
Example #30
0
                void UpdateAI(uint32 const diff)
                {
                    if (!UpdateVictim())
                        return;

                    events.Update(diff);

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

                    while (uint32 eventId = events.ExecuteEvent())
                    {
                        switch (eventId)
                        {
                            case EVENT_LAVA_SHOWER:
                                DoCast(me, SPELL_LAVA_SHOWER);
                                events.ScheduleEvent(EVENT_LAVA_SHOWER, urand(45000, 55000));
                                break;
                        }
                    }

                    DoSpellAttackIfReady(SPELL_LAVA_SPIT);
                }