コード例 #1
0
    void UpdateAI(const uint32 diff)
    {
        //Return since we have no target
        if (!UpdateVictim())
            return;

        DoSpecialThings(diff, DO_COMBAT_N_SPEED, 200.0f, 1.6f);

        events.Update(diff);
        while (uint32 eventId = events.ExecuteEvent())
        {
            switch (eventId)
            {
                case EVENT_SPELL_SHIELD:
                {
                    ForceSpellCast(me, SPELL_SPELLSHIELD);
                    events.ScheduleEvent(eventId, 31000);
                    break;
                }
                case EVENT_BLAST_WAVE:
                {
                    if (Unit *pTarget = SelectUnit(SELECT_TARGET_NEAREST, 0, 15.0f, true))
                        ForceSpellCast(SPELL_BLAST_WAVE, CAST_SELF);

                    events.ScheduleEvent(eventId, urand(3000, 5000));
                    break;
                }
            }
        }

        CheckCasterNoMovementInRange(diff, 42.0f);
        CastNextSpellIfAnyAndReady(diff);
    }
コード例 #2
0
    void EnterCombat(Unit *who)
    {
        DoZoneInCombat();

        ForceSpellCast(me, SPELL_SPELLSHIELD, INTERRUPT_AND_CAST);
        StartAutocast();
    }
コード例 #3
0
    void KilledUnit(Unit* pVictim)
    {
        if (pVictim->ToPlayer())
            return;

        if (!HealthBelowPct(1))
            ForceSpellCast(SPELL_CAPTURESOUL, CAST_SELF);

        DoScriptText(RAND(SAY_KILL1, SAY_KILL2, SAY_KILL3), me);
    }
コード例 #4
0
ファイル: boss_vanndar.cpp プロジェクト: Blumfield/ptc2
    void UpdateAI(const uint32 diff)
    {
        if (!UpdateVictim())
            return;

        if (CheckTimer < diff)
        {
            if (!m_creature->IsWithinDistInMap(&wLoc, 20.0f))
                EnterEvadeMode();

            me->SetSpeed(MOVE_WALK, 2.0f, true);
            me->SetSpeed(MOVE_RUN, 2.0f, true);

            CheckTimer = 2000;
        }
        else
            CheckTimer -= diff;

        if (AvatarTimer < diff)
        {
            ForceSpellCast(m_creature->getVictim(), SPELL_AVATAR);
            AvatarTimer = urand(15000, 20000);
        }
        else
            AvatarTimer -= diff;

        if (ThunderclapTimer < diff)
        {
            AddSpellToCast(m_creature->getVictim(), SPELL_THUNDERCLAP);
            ThunderclapTimer = urand(5000, 15000);
        }
        else
            ThunderclapTimer -= diff;

        if (StormboltTimer < diff)
        {
            Unit * victim = SelectUnit(SELECT_TARGET_RANDOM, 1, 30.0f, true);
            if (victim)
                AddSpellToCast(victim, SPELL_STORMBOLT);
            StormboltTimer = urand(10000, 25000);
        }
        else
            StormboltTimer -= diff;

        if (YellTimer < diff)
        {
            DoScriptText(RAND(YELL_RANDOM1, YELL_RANDOM2, YELL_RANDOM3, YELL_RANDOM4, YELL_RANDOM5, YELL_RANDOM6, YELL_RANDOM7), m_creature);
            YellTimer = urand(20000, 30000); //20 to 30 seconds
        }
        else
            YellTimer -= diff;

        CastNextSpellIfAnyAndReady();
        DoMeleeAttackIfReady();
    }
コード例 #5
0
    void IsSummonedBy(Unit *pSummoner)
    {
        ForceSpellCast(SPELL_IMAGE_VISUAL, CAST_SELF, INTERRUPT_AND_CAST_INSTANTLY);
        DoZoneInCombat();

        //if (Unit *pTarget = SelectUnit(SELECT_TARGET_FARTHEST, urand(0, 4), 400, true))
        if(Creature* Alythess = me->GetCreature(pInstance->GetData64(DATA_ALYTHESS)))
        {
            if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0, 400, true, Alythess->getVictimGUID(), 10.0f))
                AttackStart(pTarget);
        }
    }
コード例 #6
0
ファイル: boss_halazzi.cpp プロジェクト: ekzobam/HGCore
 void EnterPhase(PhaseHalazzi NextPhase)
 {
     switch(NextPhase)
     {
     case PHASE_LYNX:
     case PHASE_ENRAGE:
         if(Phase == PHASE_MERGE)
         {
             ForceSpellCast(m_creature, SPELL_TRANSFORM_MERGE, INTERRUPT_AND_CAST_INSTANTLY, true);
             m_creature->Attack(m_creature->getVictim(), true);
             m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
         }
         if(Unit *Lynx = Unit::GetUnit(*m_creature, LynxGUID))
         {
             Lynx->SetVisibility(VISIBILITY_OFF);
             Lynx->setDeathState(JUST_DIED);
         }
         m_creature->SetMaxHealth(600000);
         m_creature->SetHealth(600000 - 150000 * TransformCount);
         FrenzyTimer = 16000;
         SaberlashTimer = 5000;
         ShockTimer = 10000;
         TotemTimer = 12000;
         break;
     case PHASE_SPLIT:
         AddSpellToCastWithScriptText(m_creature, SPELL_TRANSFORM_SPLIT, YELL_SPLIT, true);
         break;
     case PHASE_HUMAN:
         //DoCast(m_creature, SPELL_SUMMON_LYNX, true);
         DoSpawnCreature(MOB_SPIRIT_LYNX, 5,5,0,0, TEMPSUMMON_CORPSE_DESPAWN, 0);
         m_creature->SetMaxHealth(400000);
         m_creature->SetHealth(400000);
         ShockTimer = 10000;
         TotemTimer = 12000;
         break;
     case PHASE_MERGE:
         if(Unit *Lynx = Unit::GetUnit(*m_creature, LynxGUID))
         {
             DoScriptText(YELL_MERGE, m_creature);
             Lynx->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
             Lynx->GetMotionMaster()->Clear();
             Lynx->GetMotionMaster()->MoveFollow(m_creature, 0, 0);
             m_creature->GetMotionMaster()->Clear();
             m_creature->GetMotionMaster()->MoveFollow(Lynx, 0, 0);
             TransformCount++;
         }break;
     default:
         break;
     }
     Phase = NextPhase;
 }
コード例 #7
0
    void Reset()
    {
        events.Reset();
        ClearCastQueue();

        _phase = PHASE_ONE;

        instance->SetData(DATA_MAULGAREVENT, NOT_STARTED);
        events.ScheduleEvent(EVENT_MIGHTY_BLOW, urand(15000, 25000));
        events.ScheduleEvent(EVENT_ARCING_SMASH, urand(8000, 14000));
        events.ScheduleEvent(EVENT_WHIRLWIND, 30000);

        ForceSpellCast(me, SPELL_DUAL_WIELD);
    }
コード例 #8
0
    void Reset()
    {
        SlashTimer = 11000;
        StompTimer = 30000;
        BurnTimer = 20000;
        BerserkTimer = 360000;
        CheckTimer = 1000;
        CheckGroundTimer = 500;

        IntroPhase = 0;
        IntroPhaseTimer = 0;
        IntroFrostBoltTimer = 0;
        Enraged = false;

        ForceSpellCast(me, SPELL_DUAL_WIELD, INTERRUPT_AND_CAST_INSTANTLY);
        pInstance->SetData(DATA_BRUTALLUS_EVENT, NOT_STARTED);
        me->CombatStop();
    }
コード例 #9
0
ファイル: slave_pens_trash.cpp プロジェクト: Dolmero/L4G_Core
    void UpdateAI(const uint32 diff)
    {
        if(!me->isInCombat())
            if(yelltimer < diff)
            {
                me->Yell(RAND(YELL_OOC1,YELL_OOC2,YELL_OOC3,YELL_OOC4,YELL_OOC5,YELL_OOC6),0,0);
                yelltimer = urand(60000,120000);
            }
            else
                yelltimer -=diff;

        if(!UpdateVictim())
            return;

        if(hamstringtimer < diff)
        {
            AddSpellToCast(SPELL_DISARM);
            hamstringtimer = 9000;
        }
        else
            hamstringtimer -= diff;

        if(headcracktimer < diff)
        {
            AddSpellToCast(SPELL_GEYSER);
            headcracktimer = urand(20000,25000);
        }
        else
            headcracktimer -= diff;

        if (HealthBelowPct(20.0f) && !frenzy)
        {
            ForceSpellCast(me, SPELL_FRENZY, INTERRUPT_AND_CAST_INSTANTLY);
            frenzy = true;
        }

        DoMeleeAttackIfReady();
        CastNextSpellIfAnyAndReady(diff);
    }
コード例 #10
0
ファイル: illidari_council.cpp プロジェクト: Dolmero/L4G_Core
    void EnterCombat(Unit *pWho)
    {
        if (Creature *pController = pInstance->GetCreature(pInstance->GetData64(DATA_ILLIDARICOUNCIL)))
            ((mob_illidari_councilAI*)pController->AI())->StartEvent(pWho);

        DoZoneInCombat();

        if (me->GetEntry() == 22950)  // Zerevor
        {
            ClearCastQueue();
            ForceSpellCast(me, SPELL_DAMPEN_MAGIC);
            AddSpellToCast(pWho, SPELL_ARCANE_BOLT);
            StartAutocast();
        }

        if (!loadedGUIDs)
        {
            m_council[0] = pInstance->GetData64(DATA_LADYMALANDE);
            m_council[1] = pInstance->GetData64(DATA_HIGHNETHERMANCERZEREVOR);
            m_council[2] = pInstance->GetData64(DATA_GATHIOSTHESHATTERER);
            m_council[3] = pInstance->GetData64(DATA_VERASDARKSHADOW);
            loadedGUIDs = true;
        }
    }
コード例 #11
0
    void UpdateAI(const uint32 diff)
    {
        if (instance->GetData(DATA_LURKER_FISHING_EVENT) != DONE)
            return;

        //boss is invisible, don't attack
        if (!CanStartEvent)
        {            
                if (m_submerged)
                {
                    m_submerged = false;
                    WaitTimer2 = 500;
                }
                
                //wait 500ms before emerge anim
                if (!m_submerged && WaitTimer2 <= diff)
                {
                    me->SetVisibility(VISIBILITY_ON);
                    me->RemoveAllAuras();
                    me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0);                    
                    DoCast(me, SPELL_EMERGE, false);
                    WaitTimer2 = 60000;//never reached
                    WaitTimer = 3000;
                }
                else
                    WaitTimer2 -= diff;

                //wait 3secs for emerge anim, then attack
                if (WaitTimer <= diff)
                {
                    //fresh fished from pool
                    WaitTimer = 3000;                    
                    CanStartEvent = true;
                    me->RemoveAurasDueToSpell(SPELL_SUBMERGE);
                    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
                    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                    DoZoneInCombat();

                    if (ConsecutiveSubmerge)
                    {
                        events.RescheduleEvent(LURKER_EVENT_WHIRL, 2000);
                        events.RescheduleEvent(LURKER_EVENT_GEYSER, urand(5000, 15000));
                        events.RescheduleEvent(LURKER_EVENT_SUBMERGE, 90000);
                    }
                }
                else
                    WaitTimer -= diff;
            return;
        }

        if (!UpdateVictim())
            return;

        DoSpecialThings(diff, DO_PULSE_COMBAT);

        Rotate(diff);//always check rotate things

        events.Update(diff);

        if(!m_submerged && RotType == NOROTATE)//is not spouting and not submerged
        {
            if(SpoutTimer < diff)
            {
                if(me->getVictim() && RotType == NOROTATE)
                    StartRotate(me->getVictim());//start spout and random rotate

                SpoutTimer= 35000;
                return;
            } else SpoutTimer -= diff;
        }

        while (uint32 eventId = events.ExecuteEvent())
        {
            switch (eventId)
            {    
            case LURKER_EVENT_WHIRL:
                {
                    if (m_submerged == false) {
                        AddSpellToCast(me, SPELL_WHIRL);
                    }
                    events.RescheduleEvent(LURKER_EVENT_WHIRL, 18000);                    
                    break;
                }
            case LURKER_EVENT_GEYSER:
                {
                    AddSpellToCast(SPELL_GEYSER, CAST_RANDOM);
                    events.ScheduleEvent(LURKER_EVENT_GEYSER, urand(15000, 20000));
                    break;
                }
            case LURKER_EVENT_SUBMERGE:
                {
                    ForceSpellCast(me, SPELL_SUBMERGE, INTERRUPT_AND_CAST_INSTANTLY);

                    me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                    me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
                    me->SetVisibility(VISIBILITY_OFF);

                    SummonAdds();
                    m_submerged = true;
                    
                    // directly cast Spout after emerging!                    
                    SpoutTimer = 4000; 
                    events.CancelEvent(LURKER_EVENT_WHIRL);
                    events.CancelEvent(LURKER_EVENT_GEYSER);
                    events.ScheduleEvent(LURKER_EVENT_REEMERGE, 60000);
                    break;
                }
            case LURKER_EVENT_REEMERGE:
                {
                    me->SetVisibility(VISIBILITY_OFF);
                    DoStopAttack();

                    //Time values here is irrelevant, they just need to be set
                    WaitTimer = 60000;
                    WaitTimer2 = 60000;
                    CanStartEvent = false;
                    m_submerged = true;
                    ConsecutiveSubmerge = true;                    
                    break;
                }
            }
        }

        CastNextSpellIfAnyAndReady();
        DoMeleeAttackIfReady();
    }
コード例 #12
0
ファイル: illidari_council.cpp プロジェクト: Dolmero/L4G_Core
    void UpdateAI(const uint32 diff)
    {
        if (!UpdateVictim())
            return;

        if (m_checkTimer < diff)
        {
            if (me->IsWithinDistInMap(&wLoc, 100.0f))
                DoZoneInCombat();
            else
            {
                EnterEvadeMode();
                return;
            }

            me->SetSpeed(MOVE_RUN, 2.0);
            uint32 damage = 0;
            SharedRule(damage);
            m_checkTimer = 1000;
        }
        else
            m_checkTimer -= diff;

        if (m_blessingTimer < diff)
        {
            if (Unit *pUnit = SelectCouncil())
            {
                AddSpellToCast(pUnit, RAND(SPELL_BLESS_SPELLWARD, SPELL_BLESS_PROTECTION));
                m_blessingTimer = RAND(urand(15000, 20000), urand(25000, 35000));
            }
        }
        else
            m_blessingTimer -= diff;

        if (m_consecrationTimer < diff)
        {
            AddSpellToCast(me, SPELL_CONSECRATION);
            m_consecrationTimer = urand(30000, 35000);
        }
        else
            m_consecrationTimer -= diff;

        if (m_hammerTimer < diff)
        {
            if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0, 40, true, 0, 10.0f))
            {
                AddSpellToCast(pTarget, SPELL_HAMMER_OF_JUSTICE);
                m_hammerTimer = urand(10000, 20000);
            }
        }
        else
            m_hammerTimer -= diff;

        if (m_sealTimer < diff)
        {
            AddSpellToCast(me, RAND(SPELL_SEAL_OF_COMMAND, SPELL_SEAL_OF_BLOOD));
            m_sealTimer = urand(17000, 20000);
        }
        else
            m_sealTimer -= diff;

        if (m_judgementTimer < diff)
        {
            RegenMana();
            ForceSpellCast(me->getVictim(), SPELL_GATHIOS_JUDGEMENT, INTERRUPT_AND_CAST);
            m_judgementTimer = 15000;
        }
        else
            m_judgementTimer -= diff;

        if (m_auraTimer < diff)
        {
            AddSpellToCast(RAND(SPELL_DEVOTION_AURA, SPELL_CHROMATIC_AURA), CAST_SELF);
            m_auraTimer = 60000;
        }
        else
            m_auraTimer -= diff;

        DoMeleeAttackIfReady();
        CastNextSpellIfAnyAndReady();
    }
コード例 #13
0
ファイル: boss_balinda.cpp プロジェクト: Blumfield/ptc2
    void UpdateAI(const uint32 diff)
    {
        if (!UpdateVictim())
            return;

        if (CheckTimer < diff)
        {
            if (!m_creature->IsWithinDistInMap(&wLoc, 20))
            {
                m_creature->InterruptNonMeleeSpells(false);
                EnterEvadeMode();
                return;
            }
            CheckTimer = 2000;
        }
        else
            CheckTimer -= diff;

        if (WaterElementalTimer < diff)
        {
            ForceSpellCast(m_creature, SPELL_WATER_ELEMENTAL);
            WaterElementalTimer = 90000; // 90s
        }
        else
            WaterElementalTimer -= diff;

        if (IceBlockTimer < diff)
        {
            if (!m_creature->HasAura(SPELL_HYPOTHERMIA, 0))
            {
                uint32 negativeAuras = m_creature->GetAurasAmountByType(SPELL_AURA_PERIODIC_DAMAGE) + m_creature->GetAurasAmountByType(SPELL_AURA_PERIODIC_LEECH);
                // cast if no hypothermia && has 3 or more dot/leech auras
                if (negativeAuras >= 3)
                {
                    m_creature->InterruptNonMeleeSpells(false);
                    ForceSpellCast(m_creature, SPELL_HYPOTHERMIA, DONT_INTERRUPT, true);
                    ForceSpellCast(m_creature, SPELL_ICE_BLOCK);
                    IceBlockTimer = 60000; // 60s
                }
            }
        }
        else
            IceBlockTimer -= diff;

        // update CoC timer
        if (CoCTimer > diff)
            CoCTimer -= diff;
        else
            CoCTimer = 0;

        // select spell
        if (CastTimer < diff)
        {
            // if victim is in range of 6.5 yards and there are 3 attackers cast explosion or CoC if ready
            if (m_creature->getAttackers().size() >= 3 && m_creature->IsWithinDistInMap(m_creature->getVictim(), 6.5f, false))
            {
                if (!CoCTimer)
                {
                    ForceSpellCast(me->getVictim(), SPELL_CONE_OF_COLD);
                    CoCTimer = urand(8000, 12000);
                    CastTimer = 0;
                }
                else
                {
                    ForceSpellCast(me->getVictim(), SPELL_ARCANE_EXPLOSION);
                    CastTimer = 2000;
                }
            }
            else
            {
                AddSpellToCast(m_creature->getVictim(), RAND(SPELL_FROSTBOLT, SPELL_FIREBALL));
                CastTimer = 2500;
            }
        }
        else
            CastTimer -= diff;

        CastNextSpellIfAnyAndReady();
        //DoMeleeAttackIfReady();
    }
コード例 #14
0
    void UpdateAI(const uint32 diff)
    {
        if (!UpdateVictim())
        {
            if(check_Timer < diff)
            {
                if (!m_creature->IsNonMeleeSpellCasted(false))
                {
                    float x, y, z;
                    me->GetRespawnCoord(x, y, z);
                    me->GetMotionMaster()->MovePoint(1, x, y, z);
                }

                check_Timer = 5000;
            }
            else
                check_Timer -= diff;

            return;
        }

        if (Firenova)
        {
            if (Firenova_Timer < diff)
            {
                ForceSpellCast(me, SPELL_FIRE_NOVA, INTERRUPT_AND_CAST_INSTANTLY);
                Firenova = false;
                ShadowVolley_Timer = 2000;
            }
            else
                Firenova_Timer -=diff;

            return;
        }

        if (ShadowVolley_Timer < diff)
        {
            AddSpellToCast(m_creature, SPELL_SHADOW_BOLT_VOLLEY);
            ShadowVolley_Timer = urand(5000, 13000);
        }
        else
            ShadowVolley_Timer -=diff;

        if (Corruption_Timer < diff)
        {
            AddSpellToCast(me,SPELL_CORRUPTION);
            Corruption_Timer = urand(30000, 50000);
        }
        else
            Corruption_Timer -=diff;

        if (BurningNova_Timer < diff)
        {
            if (m_creature->IsNonMeleeSpellCasted(false))
                m_creature->InterruptNonMeleeSpells(true);

            DoScriptText(SAY_NOVA, m_creature);

            if (HeroicMode)
                ForceSpellCast(me, SPELL_VORTEX, INTERRUPT_AND_CAST_INSTANTLY);

            if (SpellEntry *nova = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_BURNING_NOVA))
            {
                for (uint32 i = 0; i < 3; ++i)
                {
                    if (nova->Effect[i] == SPELL_EFFECT_APPLY_AURA)
                    {
                        Aura *Aur = new BurningNovaAura(nova, i, m_creature, m_creature);
                        m_creature->AddAura(Aur);
                    }
                }
            }

            BurningNova_Timer = urand(20000, 28000);
            Firenova_Timer= 5000;
            Firenova = true;
        }
        else
            BurningNova_Timer -= diff;

        CastNextSpellIfAnyAndReady();
        DoMeleeAttackIfReady();
    }
コード例 #15
0
    void UpdateAI(const uint32 diff)
    {
        if(!UpdateVictim())
            return;

        DoSpecialThings(diff, DO_EVERYTHING, 125.0f, 1.5f);

        // Void Zone
        if(VoidZoneTimer < diff)
        {
            if(Unit *target = SelectUnit(SELECT_TARGET_RANDOM,1,GetSpellMaxRange(SPELL_VOIDZONE),true, m_creature->getVictimGUID()))
                AddSpellToCast(target,SPELL_VOIDZONE,true);

            VoidZoneTimer = 15000;
        }
        else
            VoidZoneTimer -= diff;

        // NetherInfusion Berserk
        if(!Berserk && NetherInfusionTimer < diff)
        {
            m_creature->AddAura(SPELL_NETHER_INFUSION, m_creature);
            ForceSpellCast(m_creature, SPELL_NETHERSPITE_ROAR, INTERRUPT_AND_CAST_INSTANTLY);
            Berserk = true;
        }
        else
            NetherInfusionTimer -= diff;

        if(PortalPhase) // PORTAL PHASE
        {
            // Distribute beams and buffs
            if(PortalTimer < diff)
            {
                UpdatePortals();
                PortalTimer = 1000;
            }
            else
                PortalTimer -= diff;

            // Empowerment & Nether Burn
            if(EmpowermentTimer < diff)
            {
                ForceSpellCast(m_creature, SPELL_EMPOWERMENT);
                m_creature->AddAura(SPELL_NETHERBURN_AURA, m_creature);
                EmpowermentTimer = 90000;
            }
            else
                EmpowermentTimer -= diff;

            if(PhaseTimer < diff)
            {
                if(!m_creature->IsNonMeleeSpellCast(false))
                {
                    SwitchToBanishPhase();
                    return;
                }
            }
            else
                PhaseTimer -= diff;

            DoMeleeAttackIfReady();
        }
        else // BANISH PHASE
        {
            if(m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() != IDLE_MOTION_TYPE)
            {
                m_creature->GetMotionMaster()->Clear();
                m_creature->GetMotionMaster()->MoveIdle();
            }

            // Netherbreath
            if(NetherbreathTimer < diff)
            {
                if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0,GetSpellMaxRange(SPELL_NETHERBREATH),true))
                    AddSpellToCast(target,SPELL_NETHERBREATH);

                NetherbreathTimer = 5000+rand()%2000;
            }
            else
                NetherbreathTimer -= diff;

            if(PhaseTimer < diff)
            {
                if(!m_creature->IsNonMeleeSpellCast(false))
                {
                    SwitchToPortalPhase();
                    return;
                }
            }
            else
                PhaseTimer -= diff;
        }
        CastNextSpellIfAnyAndReady();
    }
コード例 #16
0
ファイル: illidari_council.cpp プロジェクト: Dolmero/L4G_Core
    void UpdateAI(const uint32 diff)
    {
        if (!UpdateVictim())
            return;

        if (m_checkTimer < diff)
        {
            if (me->IsWithinDistInMap(&wLoc, 100.0f))
                DoZoneInCombat();
            else
            {
                EnterEvadeMode();
                return;
            }

            if (me->GetDistance2d(me->getVictim()) <= 40.0f)
                me->GetMotionMaster()->MoveIdle();
            else
                me->GetMotionMaster()->MoveChase(me->getVictim(), 40);

            // On front stairs, do not let boss to go into textures;
            //CheckStairsPos();

            uint32 damage = 0;
            SharedRule(damage);
            me->SetSpeed(MOVE_RUN, 2.0);
            m_checkTimer = 1000;
        }
        else
            m_checkTimer -= diff;

        if (m_immunityTimer < diff)
        {
            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_INTERRUPT, false);
            m_immunityTimer = 60000;
        }
        else
            m_immunityTimer -= diff;

        if (m_dampenTimer < diff)
        {
            ForceSpellCast(me, SPELL_DAMPEN_MAGIC);
            m_dampenTimer = 67200;                      // almost 1,12 minutes (??)
        }
        else
            m_dampenTimer -= diff;

        if (m_blizzardTimer < diff)
        {
            if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0, 200, true))
            {
                AddSpellToCast(pTarget, SPELL_BLIZZARD, true);
                m_blizzardTimer = urand(12000, 17000);
            }
        }
        else
            m_blizzardTimer -= diff;

        if (m_flamestrikeTimer < diff)
        {
            if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0, 200, true))
            {
                me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_INTERRUPT, true);
                AddSpellToCast(pTarget, SPELL_FLAMESTRIKE);
                m_flamestrikeTimer = 12000;
                m_immunityTimer = 3000;
            }
        }
        else
            m_flamestrikeTimer -= diff;

        if (m_aexpTimer < diff)
        {
            std::list<HostilReference*>& m_threatlist = me->getThreatManager().getThreatList();
            for (std::list<HostilReference*>::iterator i = m_threatlist.begin(); i!= m_threatlist.end();++i)
            {
                if (Unit* pUnit = Unit::GetUnit((*me), (*i)->getUnitGuid()))
                {
                    if (pUnit->IsWithinDistInMap(me, 5) && pUnit->GetTypeId() == TYPEID_PLAYER && pUnit->isAlive() && !pUnit->IsImmunedToDamage(SPELL_SCHOOL_MASK_ARCANE))
                    {
                        ForceSpellCast(SPELL_ARCANE_EXPLOSION, CAST_SELF);
                        m_aexpTimer = 3000;
                        break;
                    }
                    else
                        m_aexpTimer = 1000;
                }
            }
        }
        else
            m_aexpTimer -= diff;

        CastNextSpellIfAnyAndReady(diff);
    }
コード例 #17
0
ファイル: boss_void_reaver.cpp プロジェクト: Dolmero/L4G_Core
    void UpdateAI(const uint32 diff)
    {
        if (!UpdateVictim() )
            return;

        //Check_Timer
        if (Check_Timer < diff)
        {
            if (!m_creature->IsWithinDistInMap(&wLoc, 135.0f))
                EnterEvadeMode();
            else
                DoZoneInCombat();

            Check_Timer = 3000;
        }
        else
            Check_Timer -= diff;

        // Pounding
        if (Pounding_Timer < diff)
        {
            AddSpellToCastWithScriptText(m_creature, SPELL_POUNDING, RAND(SAY_POUNDING1, SAY_POUNDING2));

            if (KnockAway_Timer < 3100)
                KnockAway_Timer = 3100;

            Pounding_Timer = 12000;
        }
        else
            Pounding_Timer -= diff;

        // Arcane Orb
        if (ArcaneOrb_Timer < diff)
        {
            Unit * target = SelectUnit(SELECT_TARGET_RANDOM, 0, 200.0f, true, 0, 18.0f);

            if (!target)
                target = m_creature->getVictim();

            if (target)
              if (Creature* t = DoSpawnCreature(TRIGGER, 0.0f, 0.0f, 10.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 40000))
                 t->CastSpell(target, SPELL_ARCANE_ORB, false, 0, 0, m_creature->GetGUID());

            ArcaneOrb_Timer = urand(3000, 4000);
        }
        else
            ArcaneOrb_Timer -= diff;

        // Single Target knock back, reduces aggro
        if (KnockAway_Timer < diff)
        {
            AddSpellToCast(m_creature->getVictim(), SPELL_KNOCK_AWAY);
            KnockAway_Timer = 30000;
        }
        else
            KnockAway_Timer -= diff;

        //Berserk
        if (Berserk_Timer < diff)
        {
            ForceSpellCast(m_creature, SPELL_BERSERK);
            Berserk_Timer = 600000;
        }
        else
            Berserk_Timer -= diff;

        m_creature->RemoveAurasWithDispelType(DISPEL_POISON);
        CastNextSpellIfAnyAndReady();
        DoMeleeAttackIfReady();
    }
コード例 #18
0
    void UpdateAI(const uint32 diff)
    {
        //Return since we have no target
        if (!UpdateVictim())
            return;

        DoSpecialThings(diff, DO_EVERYTHING, 200.0f, 1.6f);

        events.Update(diff);
        while (uint32 eventId = events.ExecuteEvent())
        {
            switch (eventId)
            {
                case EVENT_ARCING_SMASH:
                {
                    AddSpellToCast(SPELL_ARCING_SMASH);
                    events.ScheduleEvent(eventId, 10000);
                    break;
                }
                case EVENT_WHIRLWIND:
                {
                    AddSpellToCast(SPELL_WHIRLWIND, CAST_SELF);
                    events.ScheduleEvent(eventId, 55000);
                    break;
                }
                case EVENT_MIGHTY_BLOW:
                {
                    AddSpellToCast(SPELL_MIGHTY_BLOW);
                    events.ScheduleEvent(eventId, urand(30000, 40000));
                    break;
                }
                case EVENT_CHARGE_HKM:
                {
                    AddSpellToCast(SPELL_BERSERKER_C, CAST_RANDOM);
                    events.ScheduleEvent(eventId, 20000);
                    break;
                }
                case EVENT_ROAR:
                {
                    AddSpellToCast(SPELL_ROAR, CAST_SELF);
                    events.ScheduleEvent(eventId, 20000);
                    break;
                }
            }
        }

        //Entering Phase 2
        if (_phase == PHASE_ONE && HealthBelowPct(50))
        {
            _phase = PHASE_TWO;

            DoScriptText(SAY_ENRAGE, me);

            events.RescheduleEvent(EVENT_WHIRLWIND, 30000);
            events.ScheduleEvent(EVENT_CHARGE_HKM, 2000);
            events.ScheduleEvent(EVENT_ROAR, 3000);

            ForceSpellCast(me, SPELL_DUAL_WIELD);
            ForceSpellCast(me, SPELL_FLURRY);

            me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 0);
            me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);
        }

        CastNextSpellIfAnyAndReady();
        DoMeleeAttackIfReady();
    }
コード例 #19
0
ファイル: illidari_council.cpp プロジェクト: Dolmero/L4G_Core
    void UpdateAI(const uint32 diff)
    {
        if (!UpdateVictim())
            return;

        if (m_checkTimer < diff)
        {
            if (me->IsWithinDistInMap(&wLoc, 100.0f))
                DoZoneInCombat();
            else
            {
                EnterEvadeMode();
                return;
            }

            uint32 damage = 0;
            SharedRule(damage);
            me->SetSpeed(MOVE_RUN, 2.0);
            // move always after stun recovery
            if (!me->hasUnitState(UNIT_STAT_STUNNED) && !me->HasAura(SPELL_VANISH, 1))
                DoStartMovement(me->getVictim());
            m_checkTimer = 1000;
        }
        else
            m_checkTimer -= diff;

        if (m_vanishTimer < diff)
        {
            if (me->HasAuraType(SPELL_AURA_MOD_STUN))    // remove stun
                me->RemoveSpellsCausingAura(SPELL_AURA_MOD_STUN);

            if (me->HasAuraType(SPELL_AURA_MOD_STALKED)) // remove Hunter's Marks and similar trackers
                me->RemoveSpellsCausingAura(SPELL_AURA_MOD_STALKED);

            me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_STUN, true);

            ForceSpellCast(me, SPELL_VANISH, INTERRUPT_AND_CAST_INSTANTLY);
            ForceSpellCast(me, SPELL_DEADLY_POISON, INTERRUPT_AND_CAST_INSTANTLY);

            Position dest;
            if (Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 0, 35.0f, true))
                target->GetValidPointInAngle(dest, 5.0f, frand(0.0f, 2*M_PI), true);
            else
                me->GetValidPointInAngle(dest, 30.0f, frand(0.0f, 2*M_PI), true);

            DoTeleportTo(dest.x, dest.y, dest.z);

            // drop movement :P
            me->GetMotionMaster()->MoveIdle();

            m_vanishTimer = 60000;
        }
        else
                m_vanishTimer -= diff;

        if (me->HasAura(SPELL_VANISH, 1))
            return;

        DoMeleeAttackIfReady();
        CastNextSpellIfAnyAndReady();
    }
コード例 #20
0
    void UpdateAI(const uint32 diff)
    {
        if (instance->GetData(DATA_STRANGE_POOL) != IN_PROGRESS)
            return;

        if (me->GetVisibility() == VISIBILITY_OFF)
        {
            me->SetVisibility(VISIBILITY_ON);
            me->RemoveAurasDueToSpell(SPELL_SUBMERGE);

            me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
            me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);

            DoZoneInCombat();
        }

        if (!UpdateVictim())
            return;

        DoSpecialThings(diff, DO_PULSE_COMBAT);

        Rotate(diff);//always check rotate things

        events.Update(diff);

        if(!m_submerged && RotType == NOROTATE)//is not spouting and not submerged
        {
            if(SpoutTimer < diff)
            {
                if(me->getVictim() && RotType == NOROTATE)
                    StartRotate(me->getVictim());//start spout and random rotate

                SpoutTimer= 35000;
                return;
            } else SpoutTimer -= diff;
        }

        while (uint32 eventId = events.ExecuteEvent())
        {
            switch (eventId)
            {    
                /*case LURKER_EVENT_SPOUT_EMOTE:
                {
                me->MonsterTextEmote(EMOTE_SPOUT, 0, true);
                ForceSpellCast(me, SPELL_SPOUT_BREATH);
                events.ScheduleEvent(LURKER_EVENT_SPOUT, 3000);
                break;
                }
                case LURKER_EVENT_SPOUT:
                {
                me->SetReactState(REACT_PASSIVE);

                me->SetSelection(0);
                me->GetMotionMaster()->MoveRotate(20000, RAND(ROTATE_DIRECTION_LEFT, ROTATE_DIRECTION_RIGHT));

                ForceSpellCast(me, SPELL_SPOUT_VISUAL, INTERRUPT_AND_CAST_INSTANTLY);

                m_rotating = true;

                events.DelayEvents(20000, 0);
                events.ScheduleEvent(LURKER_EVENT_SPOUT_EMOTE, 45000);
                events.RescheduleEvent(LURKER_EVENT_WHIRL, 21000);
                break;
                }*/
            case LURKER_EVENT_WHIRL:
                {
                    AddSpellToCast(me, SPELL_WHIRL);
                    events.ScheduleEvent(LURKER_EVENT_WHIRL, 18000);
                    break;
                }
            case LURKER_EVENT_GEYSER:
                {
                    AddSpellToCast(SPELL_GEYSER, CAST_RANDOM);
                    events.ScheduleEvent(LURKER_EVENT_GEYSER, urand(15000, 20000));
                    break;
                }
            case LURKER_EVENT_SUBMERGE:
                {
                    ForceSpellCast(me, SPELL_SUBMERGE, INTERRUPT_AND_CAST_INSTANTLY);

                    me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                    me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);

                    SummonAdds();
                    m_submerged = true;

                    events.CancelEvent(LURKER_EVENT_SPOUT_EMOTE);
                    SpoutTimer = 4000; // directly cast Spout after emerging!
                    // events.CancelEvent(LURKER_EVENT_SPOUT);
                    events.CancelEvent(LURKER_EVENT_WHIRL);
                    events.CancelEvent(LURKER_EVENT_GEYSER);
                    events.ScheduleEvent(LURKER_EVENT_REEMERGE, 60000);
                    break;
                }
            case LURKER_EVENT_REEMERGE:
                {
                    me->RemoveAurasDueToSpell(SPELL_SUBMERGE);

                    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
                    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);

                    m_submerged = false;

                    events.ScheduleEvent(LURKER_EVENT_SPOUT_EMOTE, 0);
                    events.ScheduleEvent(LURKER_EVENT_WHIRL, 2000);
                    events.ScheduleEvent(LURKER_EVENT_GEYSER, urand(5000, 15000));
                    events.ScheduleEvent(LURKER_EVENT_SUBMERGE, 90000);
                    break;
                }
            }
        }

        CastNextSpellIfAnyAndReady();
        DoMeleeAttackIfReady();
    }
コード例 #21
0
    void UpdateAI(const uint32 diff)
    {
        //Return since we have no target
        if (!UpdateVictim())
            return;

        DoSpecialThings(diff, DO_EVERYTHING, 200.0f, 1.6f);
        
        //Slow his movement speed while he whirls
        //I'm not proud of this. Should be handled by the dbc, 
        //modaura slow of the spell only applied shortly (and once) in the beginning, afterwards he regains normal speed
        if (me->HasAura(33238)) {
            me->SetSpeed(MOVE_RUN, 0.80f);            
        }
        else {
            me->SetSpeed(MOVE_RUN, 1.71);            
        }
        
        events.Update(diff);
        while (uint32 eventId = events.ExecuteEvent())
        {
            switch (eventId)
            {
                case EVENT_ARCING_SMASH:
                {                    
                    AddSpellToCast(SPELL_ARCING_SMASH);
                    events.ScheduleEvent(eventId, urand(8000, 12000));
                    break;
                }
                case EVENT_WHIRLWIND:
                {
                    AddSpellToCast(SPELL_WHIRLWIND, CAST_SELF);
                    events.ScheduleEvent(eventId, urand(30000, 40000));
                    events.RescheduleEvent(EVENT_ARCING_SMASH, 16500);
                    break;
                }
                case EVENT_MIGHTY_BLOW:
                {
                    AddSpellToCast(SPELL_MIGHTY_BLOW);
                    events.ScheduleEvent(eventId, urand(20000, 35000));
                    break;
                }
                case EVENT_CHARGE_HKM:
                {
                    AddSpellToCast(SPELL_BERSERKER_C, CAST_RANDOM);
                    events.ScheduleEvent(eventId, urand(14000, 20000));
                    break;
                }
                case EVENT_ROAR:
                {
                    AddSpellToCast(SPELL_ROAR, CAST_SELF);
                    events.ScheduleEvent(eventId, urand(20000, 35000));
                    break;
                }
            }
        }

        //Entering Phase 2
        if (_phase == PHASE_ONE && HealthBelowPct(50))
        {
            _phase = PHASE_TWO;

            DoScriptText(SAY_ENRAGE, me);

            events.RescheduleEvent(EVENT_WHIRLWIND, urand(10000, 20000));
            events.ScheduleEvent(EVENT_CHARGE_HKM, 3000);
            events.ScheduleEvent(EVENT_ROAR, 2000);

            ForceSpellCast(me, SPELL_DUAL_WIELD);
            ForceSpellCast(me, SPELL_FLURRY);

            me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 0);
            me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);
        }

        CastNextSpellIfAnyAndReady();
        DoMeleeAttackIfReady();
    }
コード例 #22
0
 void JustRespawned()
 {
     ForceSpellCast(me, SPELL_DEATH_CLOUD, INTERRUPT_AND_CAST_INSTANTLY);
     Phase = 1;
     SummonTimer = Timer = CalculateSummonTimer();
 }
コード例 #23
0
ファイル: dark_portal.cpp プロジェクト: Dolmero/L4G_Core
    void UpdateAI(const uint32 diff)
    {
        if (m_creature->getVictim() && m_creature->getVictim()->GetTypeId() == TYPEID_PLAYER)
        {
            switch (m_creature->GetEntry())
            {
                case C_RKEEP:
                {
                    if (Type)    //mage
                    {
                        if (Spell_Timer1 < diff)   //frostbolt
                        {
                            AddSpellToCast(m_creature->getVictim(), HeroicMode?38534:36279);
                            Spell_Timer1 = urand(8000, HeroicMode ? 10000 : 16000);
                        }
                        else
                            Spell_Timer1 -= diff;

                        if (Spell_Timer2 < diff)    //pyroblast
                        {
                            Spell_Timer1 = 8000;

                            Unit* target = SelectUnit(SELECT_TARGET_NEAREST, 0, 70, true, m_creature->getVictimGUID());
                            if (!target)
                                target = m_creature->getVictim();

                            if (target)
                                AddSpellToCast(target, HeroicMode?38535:36277);

                            Spell_Timer2 = HeroicMode ? urand(14000, 24000) : urand(12000, 17000);
                        }
                        else
                            Spell_Timer2 -= diff;

                        if (Spell_Timer3 < diff)    //blast wave
                        {
                            ForceSpellCast(m_creature, HeroicMode?38536:36278, DONT_INTERRUPT, true);
                            Spell_Timer3 = HeroicMode ? urand(15000, 25000) : 13000;
                        }
                        else
                            Spell_Timer3 -= diff;

                        if (HeroicMode && Spell_Timer4 < diff)    //polymorph
                        {
                            Unit* target = SelectUnit(SELECT_TARGET_NEAREST, 0, 70, true, m_creature->getVictimGUID());
                            if (target)
                                AddSpellToCast(target, 13323);
                            Spell_Timer4 = 30000;
                        }
                        else
                            Spell_Timer4 -= diff;
                    }
                    else       //warlock
                    {
                        if (Spell_Timer1 < diff)   //shadow bolt volley
                        {
                            AddSpellToCast(m_creature->getVictim(), HeroicMode?38533:36275);
                            Spell_Timer1 = HeroicMode ? Spell_Timer2+1500 : urand(10000, 25000);
                        }
                        else
                            Spell_Timer1 -= diff;

                        if (Spell_Timer2 < diff)    //curse of vulnerability
                        {
                            Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0,70,true);
                            if (target)
                                AddSpellToCast(target, 36276, true);
                            Spell_Timer2 = HeroicMode ? urand(9000, 14000) : Spell_Timer1+2000;
                        }
                        else
                            Spell_Timer2 -= diff;

                        if (Spell_Timer3 < diff)    //fear
                        {
                            Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0, 70, true);
                            if (target)
                                AddSpellToCast(target, 12542);
                            Spell_Timer3 = urand(15000, 25000);
                        }
                        else
                            Spell_Timer3 -= diff;

                        if (!frenzy && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 30)
                        {
                            AddSpellToCast(m_creature, 8269, true);
                            frenzy = true;
                        }
                    }
                    break;
                }
                case C_RLORD:
                {
                    if(Type)    //protection type
                    {
                        if (Spell_Timer1 < diff)   //sunder armor
                        {
                            AddSpellToCast(m_creature->getVictim(), 16145, true);
                            Spell_Timer1 = urand(6000, 9000);
                        }
                        else
                            Spell_Timer1 -= diff;

                        if (Spell_Timer2 < diff)    //thunderclap
                        {
                            AddSpellToCast(m_creature, HeroicMode?38537:36214, true);
                            Spell_Timer2 = HeroicMode ? urand(12000, 17000) : urand(10000, 25000);
                        }
                        else
                            Spell_Timer2 -= diff;
                    }
                    else    //fury-arms
                    {
                        if (Spell_Timer1 < diff)   //knockback
                        {
                            AddSpellToCast(m_creature->getVictim(), 11428, true);
                            Spell_Timer1 = HeroicMode ? urand(13300, 19100) : urand(18100, 38500);
                        }
                        else
                            Spell_Timer1 -= diff;

                        if (Spell_Timer2 < diff)    //mortal strike
                        {
                            AddSpellToCast(m_creature->getVictim(), HeroicMode?35054:15708, true);
                            Spell_Timer2 = HeroicMode ? urand(10300, 14500) : urand(10800, 15800);
                        }
                        else
                            Spell_Timer2 -= diff;

                        if (Spell_Timer3 < diff)    //harmstring
                        {
                            AddSpellToCast(m_creature->getVictim(), 9080, true);
                            Spell_Timer3 = HeroicMode ? urand(11600, 18100) : urand(15500, 26500);
                        }
                        else
                            Spell_Timer3 -= diff;
                    }

                    if (!frenzy && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 30)
                    {
                        AddSpellToCast(m_creature, 8269, true);
                        frenzy = true;
                    }
                    break;
                }
                case C_ASSAS:
                {
                    if (Type)    //combat
                    {
                        if (Spell_Timer1 < diff)   //sinister strike
                        {
                            AddSpellToCast(m_creature->getVictim(), HeroicMode?15667:14873, true);
                            Spell_Timer1 = HeroicMode ? urand(3500, 14500) : urand(4500, 15300);
                        }
                        else
                            Spell_Timer1 -= diff;

                        if (Spell_Timer2 < diff)    //rupture
                        {
                            AddSpellToCast(m_creature->getVictim(), HeroicMode?15583:14874, true);
                            Spell_Timer2 = HeroicMode ? urand(10100, 20500) : urand(10400, 21600);
                        }
                        else
                            Spell_Timer2 -= diff;

                        if (Spell_Timer3 && Spell_Timer3 <= diff)    //crippling poison
                        {
                            AddSpellToCast(m_creature->getVictim(), 9080, true);
                            Spell_Timer3 = HeroicMode ? urand(12200, 62800) : 0;
                        }
                        else
                            Spell_Timer3 -= diff;
                    }
                    else        //assasin
                    {
                        if (Spell_Timer1 < diff)   //kidney shot
                        {
                            AddSpellToCast(m_creature->getVictim(), 30832, true);
                            Spell_Timer1 = urand(20100, 24900);
                        }
                        else
                            Spell_Timer1 -= diff;

                        if (Spell_Timer2 && Spell_Timer2 <= diff)    //deadly poison
                        {
                            AddSpellToCast(m_creature->getVictim(), 38520, true);
                            Spell_Timer2 = HeroicMode ? urand(12300, 24200) : 0;
                        }
                        else
                            Spell_Timer2 -= diff;

                        if (Spell_Timer3 < diff)    //backstab
                        {
                            AddSpellToCast(m_creature->getVictim(), HeroicMode?15657:7159, true);
                            Spell_Timer3 = urand(4800, 7200);
                        }
                        else
                            Spell_Timer3 -= diff;
                    }
                    break;
                }
                case C_WHELP:
                    break;
                case C_CHRON:
                {
                    if (m_creature->GetPower(POWER_MANA)*100/m_creature->GetMaxPower(POWER_MANA) > 15)
                    {
                        if (Type)    //frost
                        {
                            if (Spell_Timer1 < diff)   //frostbolt
                            {
                                AddSpellToCast(m_creature->getVictim(), HeroicMode?12675:15497);
                                Spell_Timer1 = urand(2900, 5400);
                            }
                            else
                                Spell_Timer1 -= diff;

                            if (Spell_Timer2 < diff && m_creature->IsWithinCombatRange(m_creature->getVictim(), 10))    //frost nova
                            {
                                AddSpellToCast(m_creature, HeroicMode?15531:15063, true);
                                Spell_Timer2 = HeroicMode ? urand(22200, 25700) : urand(33800, 39800);
                            }
                            else
                                Spell_Timer2 -= diff;
                        }
                        else    //arcane
                        {
                            if (Spell_Timer1 < diff)   //arcane bolt
                            {
                                AddSpellToCast(m_creature->getVictim(), HeroicMode?15230:15124);
                                Spell_Timer1 = HeroicMode ? urand(1200, 3400) : urand(2900, 5400);
                            }
                            else
                                Spell_Timer1 -= diff;

                            if (Spell_Timer2 < diff && m_creature->IsWithinCombatRange(m_creature->getVictim(), 10))    //arcane explosion
                            {
                                AddSpellToCast(m_creature, HeroicMode?33623:33860, true);
                                Spell_Timer2 = HeroicMode ? urand(8000, 10100) : urand(9500, 10100);
                            }
                            else
                                Spell_Timer2 -= diff;
                        }
                    }
                    break;
                }
                case C_EXECU:
                {
                    if (Spell_Timer1 < diff)   //cleave
                    {
                        AddSpellToCast(m_creature->getVictim(), 15496, true);
                        Spell_Timer1 = HeroicMode ? urand(6000, 11700) : urand(7300, 14000);
                    }
                    else
                        Spell_Timer1 -= diff;

                    if (Spell_Timer2 < diff)    //strike
                    {
                        AddSpellToCast(m_creature->getVictim(), HeroicMode?34920:15580, true);
                        Spell_Timer2 = HeroicMode ? urand(3900, 9700) : urand(9700, 20300);
                    }
                    else
                        Spell_Timer2 -= diff;

                    if (Spell_Timer3 && Spell_Timer3 < diff)    //harmstring
                    {
                        AddSpellToCast(m_creature->getVictim(), 9080, true);
                        Spell_Timer3 = HeroicMode ? urand(10800, 15800) : 0;
                    }
                    else
                        Spell_Timer3 -= diff;

                    break;
                }
                case C_VANQU:
                {
                    if (m_creature->GetPower(POWER_MANA)*100/m_creature->GetMaxPower(POWER_MANA) > 15)
                    {
                        if (Spell_Timer1 < diff)   //scorch + shadow bolt
                        {
                            bool fire = urand(0,1);
                            if (fire)
                                AddSpellToCast(m_creature->getVictim(), HeroicMode?36807:15241);
                            else
                                AddSpellToCast(m_creature->getVictim(), HeroicMode?15472:12739);
                            Spell_Timer1 = urand(3500, 4500);
                        }
                        else
                            Spell_Timer1 -= diff;

                        if (Spell_Timer2 < diff)    //fire blast
                        {
                            AddSpellToCast(m_creature->getVictim(), HeroicMode?38526:13341, true);
                            Spell_Timer2 = urand(5900, 6000);
                        }
                        else
                            Spell_Timer2 -= diff;
                    }
                    break;
                }
                default:
                    break;
            }

            CastNextSpellIfAnyAndReady();
            DoMeleeAttackIfReady();
        }

        if (pInstance->GetData(TYPE_MEDIVH) == FAIL)
        {
            m_creature->Kill(m_creature, false);
            m_creature->RemoveCorpse();
        }
    }
コード例 #24
0
    void UpdateAI(const uint32 diff)
    {
      if(!me->IsNonMeleeSpellCasted(false) && !me->isInCombat())
      {
          if(OOCTimer < diff)
          {
             HandleOffCombatEffects();
             OOCTimer = 10000;
          }
          else
              OOCTimer -= diff;
      }

      if(!UpdateVictim())
          return;

      if(Check_Timer < diff)
      {
          if(HealthBelowPct(51) && canShield)
          {
              canShield = false;
              ForceSpellCast(SPELL_MANA_SHIELD, CAST_SELF);
          }
          Check_Timer = 1500;
      }
      else
          Check_Timer -= diff;

      if(Shoot_Timer < diff)
      {
          if(me->GetMotionMaster()->GetCurrentMovementGeneratorType() == IDLE_MOTION_TYPE)
          {
              if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0, 30.0f, true, 5.0f))
                  AddSpellToCast(target, SPELL_SHOOT);
          }
          Shoot_Timer = 3000;
      }
      else
          Shoot_Timer -= diff;

      if(FrostArrow_Timer < diff)
      {
          if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0, 50.0f, true))
              AddSpellToCast(target, SPELL_FROST_ARROW);
          FrostArrow_Timer = urand(9000, 12000);
      }
      else
          FrostArrow_Timer -= diff;

      if(ForkedLightning_Timer < diff)
      {
          AddSpellToCast(SPELL_FORKED_LIGHTNING, CAST_NULL);
          ForkedLightning_Timer = urand(12000, 18000);
      }
      else
          ForkedLightning_Timer -= diff;

      CheckShooterNoMovementInRange(diff);
      CastNextSpellIfAnyAndReady();
      DoMeleeAttackIfReady();
    }