void UpdateAI(const uint32 diff) { //Return since we have no target if (!UpdateVictim()) return; //Sleep_Timer if (Sleep_Timer < diff) { if( Unit *target = SelectUnit(SELECT_TARGET_RANDOM,0) ) DoCast(target,SPELL_SLEEP); Sleep_Timer = 8000 + rand()%8000; }else Sleep_Timer -= diff; //NoxiousBreath_Timer if (NoxiousBreath_Timer < diff) { DoCast(m_creature->getVictim(),SPELL_NOXIOUSBREATH); NoxiousBreath_Timer = 14000 + rand()%6000; }else NoxiousBreath_Timer -= diff; //Tailsweep every 2 seconds if (TailSweep_Timer < diff) { if( Unit *target = SelectUnit(SELECT_TARGET_RANDOM,0) ) DoCast(target,SPELL_TAILSWEEP); TailSweep_Timer = 2000; }else TailSweep_Timer -= diff; //MarkOfNature_Timer //if (MarkOfNature_Timer < diff) //{ // DoCast(m_creature->getVictim(),SPELL_MARKOFNATURE); // MarkOfNature_Timer = 45000; //}else MarkOfNature_Timer -= diff; //VolatileInfection_Timer if (VolatileInfection_Timer < diff) { DoCast(m_creature->getVictim(),SPELL_VOLATILEINFECTION); VolatileInfection_Timer = 7000 + rand()%5000; }else VolatileInfection_Timer -= diff; //CorruptionofEarth_Timer if ( (int) (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() +0.5) == 75) { if (CorruptionofEarth1_Timer < diff) { DoCast(m_creature->getVictim(),SPELL_CORRUPTIONOFEARTH); //1 minutes for next one. Means not again with this health value CorruptionofEarth1_Timer = 60000; } else CorruptionofEarth1_Timer -= diff; } //CorruptionofEarth_Timer if ( (int) (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() +0.5) == 50) { if (CorruptionofEarth2_Timer < diff) { DoCast(m_creature->getVictim(),SPELL_CORRUPTIONOFEARTH); //1 minutes for next one. Means not again with this health value CorruptionofEarth2_Timer = 60000; } else CorruptionofEarth2_Timer -= diff; } //CorruptionofEarth_Timer if ( (int) (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() +0.5) == 25) { if (CorruptionofEarth3_Timer < diff) { DoCast(m_creature->getVictim(),SPELL_CORRUPTIONOFEARTH); //1 minutes for next one. Means not again with this health value CorruptionofEarth3_Timer = 60000; } else CorruptionofEarth3_Timer -= diff; } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { ReduceCD(); if(IAmDead()) return; if(pet && pet != NULL && pet->isDead()) { master->SetBotsPetDied(); pet = NULL; } //if we think we have a pet, but master doesn't, it means we teleported if(pet && master->m_botHasPet == false) { master->SetBotsPetDied(); pet = NULL; } m_creature->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true); m_creature->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, true); if(m_creature->GetHealth() < m_creature->GetMaxHealth()*0.3 && isTimerReady(Potion_cd)) { doCast(m_creature, HEALINGPOTION); Potion_cd = Potion_cd; } if(m_creature->GetPower(POWER_MANA) < m_creature->GetMaxPower(POWER_MANA)*0.2) { if(isTimerReady(Potion_cd)) { doCast(m_creature, MANAPOTION); //MonsterSay("MANA POTION", LANG_UNIVERSAL, NULL); Potion_cd = Potion_cd; } else { if(oom_spam == false) { //MonsterSay("OOM", LANG_UNIVERSAL, NULL); oom_spam = true; } ScriptedAI::UpdateAI(diff); //return; //can't do anything without mana } } oom_spam = false; ScriptedAI::UpdateAI(diff); opponent = SelectUnit(SELECT_TARGET_TOPAGGRO, 0); if(!opponent && !m_creature->getVictim()) { ResetOrGetNextTarget(); //to reduce the number of crashes, remove pet whenever we are not in combat if(pet != NULL && pet->isAlive()) { master->SetBotsPetDied(); pet = NULL; } return; } if(pet == NULL) CreatePet(); if (pet && pet->isAlive() && !pet->isInCombat() && m_creature->getVictim()) { pet->Attack (m_creature->getVictim(), true); pet->GetMotionMaster()->MoveChase(m_creature->getVictim(), 1, 0); } if(m_creature->hasUnitState(UNIT_STAT_CASTING)) return; DoNormalAttack(diff); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; //BloodSiphon_Timer if (BloodSiphon_Timer <= diff) { DoCast(me->getVictim(), SPELL_BLOODSIPHON); BloodSiphon_Timer = 90000; } else BloodSiphon_Timer -= diff; //CorruptedBlood_Timer if (CorruptedBlood_Timer <= diff) { DoCast(me->getVictim(), SPELL_CORRUPTEDBLOOD); CorruptedBlood_Timer = 30000 + rand()%15000; } else CorruptedBlood_Timer -= diff; //CauseInsanity_Timer /*if (CauseInsanity_Timer <= diff) { if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(pTarget, SPELL_CAUSEINSANITY); CauseInsanity_Timer = 35000 + rand()%8000; } else CauseInsanity_Timer -= diff;*/ //WillOfHakkar_Timer if (WillOfHakkar_Timer <= diff) { if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(pTarget, SPELL_WILLOFHAKKAR); WillOfHakkar_Timer = 25000 + rand()%10000; } else WillOfHakkar_Timer -= diff; if (!Enraged && Enrage_Timer <= diff) { DoCast(me, SPELL_ENRAGE); Enraged = true; } else Enrage_Timer -= diff; //Checking if Jeklik is dead. If not we cast her Aspect if (CheckJeklik_Timer <= diff) { if (m_pInstance) { if (m_pInstance->GetData(TYPE_JEKLIK) != DONE) { if (AspectOfJeklik_Timer <= diff) { DoCast(me->getVictim(), SPELL_ASPECT_OF_JEKLIK); AspectOfJeklik_Timer = 10000 + rand()%4000; } else AspectOfJeklik_Timer -= diff; } } CheckJeklik_Timer = 1000; } else CheckJeklik_Timer -= diff; //Checking if Venoxis is dead. If not we cast his Aspect if (CheckVenoxis_Timer <= diff) { if (m_pInstance) { if (m_pInstance->GetData(TYPE_VENOXIS) != DONE) { if (AspectOfVenoxis_Timer <= diff) { DoCast(me->getVictim(), SPELL_ASPECT_OF_VENOXIS); AspectOfVenoxis_Timer = 8000; } else AspectOfVenoxis_Timer -= diff; } } CheckVenoxis_Timer = 1000; } else CheckVenoxis_Timer -= diff; //Checking if Marli is dead. If not we cast her Aspect if (CheckMarli_Timer <= diff) { if (m_pInstance) { if (m_pInstance->GetData(TYPE_MARLI) != DONE) { if (AspectOfMarli_Timer <= diff) { DoCast(me->getVictim(), SPELL_ASPECT_OF_MARLI); AspectOfMarli_Timer = 10000; } else AspectOfMarli_Timer -= diff; } } CheckMarli_Timer = 1000; } else CheckMarli_Timer -= diff; //Checking if Thekal is dead. If not we cast his Aspect if (CheckThekal_Timer <= diff) { if (m_pInstance) { if (m_pInstance->GetData(TYPE_THEKAL) != DONE) { if (AspectOfThekal_Timer <= diff) { DoCast(me, SPELL_ASPECT_OF_THEKAL); AspectOfThekal_Timer = 15000; } else AspectOfThekal_Timer -= diff; } } CheckThekal_Timer = 1000; } else CheckThekal_Timer -= diff; //Checking if Arlokk is dead. If yes we cast her Aspect if (CheckArlokk_Timer <= diff) { if (m_pInstance) { if (m_pInstance->GetData(TYPE_ARLOKK) != DONE) { if (AspectOfArlokk_Timer <= diff) { DoCast(me, SPELL_ASPECT_OF_ARLOKK); DoResetThreat(); AspectOfArlokk_Timer = 10000 + rand()%5000; } else AspectOfArlokk_Timer -= diff; } } CheckArlokk_Timer = 1000; } else CheckArlokk_Timer -= diff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; events.Update(diff); if (me->hasUnitState(UNIT_STAT_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) { switch(eventId) { case EVENT_MOVE_POS: MovePos(); events.RescheduleEvent(EVENT_MOVE_POS, 10000); break; case EVENT_ENRAGE: DoScriptText(SAY_BRUNDIR_BERSERK, me); DoCast(SPELL_BERSERK); break; case EVENT_CHAIN_LIGHTNING: if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(pTarget, SPELL_CHAIN_LIGHTNING); events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, urand(4000, 6000)); break; case EVENT_OVERLOAD: me->MonsterTextEmote(EMOTE_OVERLOAD, 0, true); DoScriptText(SAY_BRUNDIR_SPECIAL, me); me->GetMotionMaster()->Initialize(); DoCast(SPELL_OVERLOAD); events.ScheduleEvent(EVENT_OVERLOAD, urand(60000, 120000)); break; case EVENT_LIGHTNING_WHIRL: me->GetMotionMaster()->Initialize(); DoCast(SPELL_LIGHTNING_WHIRL); events.ScheduleEvent(EVENT_LIGHTNING_WHIRL, urand(15000, 20000)); break; case EVENT_LIGHTNING_TENDRILS: DoScriptText(SAY_BRUNDIR_FLIGHT, me); DoCast(SPELL_LIGHTNING_TENDRILS); me->AttackStop(); me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); DoCast(SPELL_LIGHTNING_TENDRILS_SELF_VISUAL); me->GetMotionMaster()->Initialize(); me->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), 440); events.DelayEvents(35000); events.ScheduleEvent(EVENT_FLIGHT, 2500); events.ScheduleEvent(EVENT_ENDFLIGHT, 28000); events.ScheduleEvent(EVENT_LIGHTNING_TENDRILS, 90000); break; case EVENT_FLIGHT: if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) me->GetMotionMaster()->MovePoint(0, pTarget->GetPositionX(), pTarget->GetPositionY(), 440); events.ScheduleEvent(EVENT_FLIGHT, 6000); break; case EVENT_ENDFLIGHT: me->GetMotionMaster()->Initialize(); me->GetMotionMaster()->MovePoint(0, 1586.920166f, 119.848984f, 440); events.CancelEvent(EVENT_FLIGHT); events.CancelEvent(EVENT_ENDFLIGHT); events.ScheduleEvent(EVENT_LAND, 4000); break; case EVENT_LAND: me->GetMotionMaster()->Initialize(); me->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), 427.28f); events.CancelEvent(EVENT_LAND); events.ScheduleEvent(EVENT_GROUND, 2500); break; case EVENT_GROUND: me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); me->RemoveAurasDueToSpell(SPELL_LIGHTNING_TENDRILS); me->RemoveAurasDueToSpell(SPELL_LIGHTNING_TENDRILS_SELF_VISUAL); events.CancelEvent(EVENT_GROUND); break; } } }
void UpdateAI(const uint32 diff) { //Return since we have no target if (!UpdateVictim()) return; if (Teleport_Timer <= diff) { DoScriptText(SAY_TELEPORT, me); std::list<HostileReference*>& m_threatlist = me->getThreatManager().getThreatList(); std::list<HostileReference*>::iterator i = m_threatlist.begin(); for (i = m_threatlist.begin(); i != m_threatlist.end();++i) { Unit* pUnit = Unit::GetUnit((*me), (*i)->getUnitGuid()); if (pUnit && (pUnit->GetTypeId() == TYPEID_PLAYER)) { DoTeleportPlayer(pUnit, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+3, pUnit->GetOrientation()); } } DoResetThreat(); Teleport_Timer = 30000; } else Teleport_Timer -= diff; // //MarkOfFrost_Timer // if (MarkOfFrost_Timer <= diff) // { // DoCast(me->getVictim(),SPELL_MARKOFFROST); // MarkOfFrost_Timer = 25000; // } else MarkOfFrost_Timer -= diff; //Chill_Timer if (Chill_Timer <= diff) { DoCast(me->getVictim(),SPELL_CHILL); Chill_Timer = 13000 + rand()%12000; } else Chill_Timer -= diff; //Breath_Timer if (Breath_Timer <= diff) { DoCast(me->getVictim(),SPELL_FROSTBREATH); Breath_Timer = 10000 + rand()%5000; } else Breath_Timer -= diff; //ManaStorm_Timer if (ManaStorm_Timer <= diff) { if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0)) DoCast(pTarget,SPELL_MANASTORM); ManaStorm_Timer = 7500 + rand()%5000; } else ManaStorm_Timer -= diff; //Reflect_Timer if (Reflect_Timer <= diff) { DoCast(me,SPELL_REFLECT); Reflect_Timer = 20000 + rand()%15000; } else Reflect_Timer -= diff; //Cleave_Timer if (Cleave_Timer <= diff) { DoCast(me->getVictim(),SPELL_CLEAVE); Cleave_Timer = 7000; } else Cleave_Timer -= diff; //Enrage_Timer if (me->GetHealth()*100 / me->GetMaxHealth() < 26 && !Enraged) { DoCast(me, SPELL_ENRAGE); Enraged = true; } DoMeleeAttackIfReady(); }
void JustSummoned(Creature* summoned) { if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,0)) summoned->AI()->AttackStart(pTarget); }
void UpdateAI(const uint32 diff) { if(!Intro) { if( !pInstance ) return; if( Intro_Timer < diff ) { switch( Intro_Phase ) { case 1: DoScriptText(SAY_INTRO, m_creature); pInstance->HandleGameObject(pInstance->GetData64(DATA_SPHERE_SHIELD), true); ++Intro_Phase; Intro_Timer = 25000; break; case 2: DoScriptText(SAY_AGGRO, m_creature); if( Unit *mellic = Unit::GetUnit(*m_creature,pInstance->GetData64(DATA_MELLICHAR)) ) { //should have a better way to do this. possibly spell exist. mellic->setDeathState(JUST_DIED); mellic->SetHealth(0); pInstance->SetData(TYPE_SHIELD_OPEN,IN_PROGRESS); } ++Intro_Phase; Intro_Timer = 3000; break; case 3: m_creature->RemoveFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NOT_ATTACKABLE_2); Intro = true; break; } }else Intro_Timer -=diff; } if( !UpdateVictim() ) return; if( !IsImage66 && ((m_creature->GetHealth()*100) / m_creature->GetMaxHealth() <= 66) ) { DoSplit(66); IsImage66 = true; } if( !IsImage33 && ((m_creature->GetHealth()*100) / m_creature->GetMaxHealth() <= 33) ) { DoSplit(33); IsImage33 = true; } if( MindRend_Timer < diff ) { if( Unit* target = SelectUnit(SELECT_TARGET_RANDOM,1) ) DoCast(target,HeroicMode ? H_SPELL_MIND_REND : SPELL_MIND_REND); else DoCast(m_creature->getVictim(),HeroicMode ? H_SPELL_MIND_REND : SPELL_MIND_REND); MindRend_Timer = 8000; }else MindRend_Timer -=diff; if( Fear_Timer < diff ) { if( m_creature->IsNonMeleeSpellCasted(false) ) return; switch(rand()%2) { case 0: DoScriptText(SAY_FEAR_1, m_creature); break; case 1: DoScriptText(SAY_FEAR_2, m_creature); break; } if( Unit* target = SelectUnit(SELECT_TARGET_RANDOM,1) ) DoCast(target,SPELL_FEAR); else DoCast(m_creature->getVictim(),SPELL_FEAR); Fear_Timer = 25000; }else Fear_Timer -=diff; if( Domination_Timer < diff ) { if( m_creature->IsNonMeleeSpellCasted(false) ) return; switch(rand()%2) { case 0: DoScriptText(SAY_MIND_1, m_creature); break; case 1: DoScriptText(SAY_MIND_2, m_creature); break; } if( Unit* target = SelectUnit(SELECT_TARGET_RANDOM,1) ) DoCast(target,HeroicMode ? H_SPELL_DOMINATION : SPELL_DOMINATION); else DoCast(m_creature->getVictim(),HeroicMode ? H_SPELL_DOMINATION : SPELL_DOMINATION); Domination_Timer = 16000+rand()%16000; }else Domination_Timer -=diff; if( HeroicMode ) { if( ManaBurn_Timer < diff ) { if( m_creature->IsNonMeleeSpellCasted(false) ) return; if( Unit* target = SelectUnit(SELECT_TARGET_RANDOM,1) ) DoCast(target,H_SPELL_MANA_BURN); ManaBurn_Timer = 16000+rand()%16000; }else ManaBurn_Timer -=diff; } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { //Only if not incombat check if the event is started if (!me->isInCombat() && pInstance && pInstance->GetData(DATA_KARATHRESSEVENT)) { Unit *pTarget = Unit::GetUnit((*me), pInstance->GetData64(DATA_KARATHRESSEVENT_STARTER)); if (pTarget) { AttackStart(pTarget); } } //Return since we have no target if (!UpdateVictim()) return; //someone evaded! if (pInstance && !pInstance->GetData(DATA_KARATHRESSEVENT)) { EnterEvadeMode(); return; } //WaterBoltVolley_Timer if (WaterBoltVolley_Timer <= diff) { DoCast(me->getVictim(), SPELL_WATER_BOLT_VOLLEY); WaterBoltVolley_Timer = 30000; } else WaterBoltVolley_Timer -= diff; //TidalSurge_Timer if (TidalSurge_Timer <= diff) { DoCast(me->getVictim(), SPELL_TIDAL_SURGE); // Hacky way to do it - won't trigger elseways me->getVictim()->CastSpell(me->getVictim(), SPELL_TIDAL_SURGE_FREEZE, true); TidalSurge_Timer = 15000+rand()%5000; } else TidalSurge_Timer -= diff; //Cyclone_Timer if (Cyclone_Timer <= diff) { //DoCast(me, SPELL_SUMMON_CYCLONE); // Doesn't work Cyclone_Timer = 30000+rand()%10000; Creature *Cyclone = me->SummonCreature(CREATURE_CYCLONE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), float(rand()%5), TEMPSUMMON_TIMED_DESPAWN, 15000); if (Cyclone) { CAST_CRE(Cyclone)->SetFloatValue(OBJECT_FIELD_SCALE_X, 3.0f); Cyclone->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); Cyclone->setFaction(me->getFaction()); Cyclone->CastSpell(Cyclone, SPELL_CYCLONE_CYCLONE, true); Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0); if (pTarget) { Cyclone->AI()->AttackStart(pTarget); } } } else Cyclone_Timer -= diff; //Heal_Timer if (Heal_Timer <= diff) { // It can be cast on any of the mobs Unit *pUnit = NULL; while (pUnit == NULL || !pUnit->isAlive()) { pUnit = selectAdvisorUnit(); } if (pUnit && pUnit->isAlive()) DoCast(pUnit, SPELL_HEAL); Heal_Timer = 60000; } else Heal_Timer -= diff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; if (Assassins_Timer) { if (Assassins_Timer <= diff) { SpawnAssassin(); Assassins_Timer = 0; } else Assassins_Timer -= diff; } if (InBlade) { if (Wait_Timer) { if (Wait_Timer <= diff) { if (target_num <= 0) { // stop bladedance InBlade = false; me->SetSpeed(MOVE_RUN, 2); (*me).GetMotionMaster()->MoveChase(me->getVictim()); Blade_Dance_Timer = 30000; Wait_Timer = 0; if (HeroicMode) Charge_timer = 5000; } else { //move in bladedance float x, y, randx, randy; randx = float(rand() % 40); randy = float(rand() % 40); x = 210 + randx ; y = -60 - randy ; (*me).GetMotionMaster()->MovePoint(1, x, y, me->GetPositionZ()); Wait_Timer = 0; } } else Wait_Timer -= diff; } } else { if (Blade_Dance_Timer) { if (Blade_Dance_Timer <= diff) { target_num = TARGET_NUM; Wait_Timer = 1; InBlade = true; Blade_Dance_Timer = 0; me->SetSpeed(MOVE_RUN, 4); return; } else Blade_Dance_Timer -= diff; } if (Charge_timer) { if (Charge_timer <= diff) { DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), H_SPELL_CHARGE); Charge_timer = 0; } else Charge_timer -= diff; } if (Summon_Assistant_Timer <= diff) { for (uint32 i = 0; i < summoned; i++) { switch (rand() % 3) { case 0: me->SummonCreature(MOB_HEARTHEN_GUARD, AddsEntrance[0], AddsEntrance[1], AddsEntrance[2], 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); break; case 1: me->SummonCreature(MOB_SHARPSHOOTER_GUARD, AddsEntrance[0], AddsEntrance[1], AddsEntrance[2], 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); break; case 2: me->SummonCreature(MOB_REAVER_GUARD, AddsEntrance[0], AddsEntrance[1], AddsEntrance[2], 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); break; } } if (rand() % 100 < 6) summoned++; Summon_Assistant_Timer = 15000 + (rand() % 5000) ; } else Summon_Assistant_Timer -= diff; DoMeleeAttackIfReady(); } if (resetcheck_timer <= diff) { float tempx; tempx = me->GetPositionX(); if (tempx > 255 || tempx < 205) { EnterEvadeMode(); return; } resetcheck_timer = 5000; } else resetcheck_timer -= diff; }
void UpdateAI(const uint32 diff) { //Only if not incombat check if the event is started if (!me->isInCombat() && pInstance && pInstance->GetData(DATA_KARATHRESSEVENT)) { Unit *pTarget = Unit::GetUnit((*me), pInstance->GetData64(DATA_KARATHRESSEVENT_STARTER)); if (pTarget) { AttackStart(pTarget); GetAdvisors(); } } //Return since we have no target if (!UpdateVictim()) return; //someone evaded! if (pInstance && !pInstance->GetData(DATA_KARATHRESSEVENT)) { EnterEvadeMode(); return; } //CataclysmicBolt_Timer if (CataclysmicBolt_Timer <= diff) { //select a random unit other than the main tank Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 1); //if there aren't other units, cast on the tank if (!pTarget) pTarget = me->getVictim(); if (pTarget) DoCast(pTarget, SPELL_CATACLYSMIC_BOLT); CataclysmicBolt_Timer = 10000; } else CataclysmicBolt_Timer -= diff; //SearNova_Timer if (SearNova_Timer <= diff) { DoCast(me->getVictim(), SPELL_SEAR_NOVA); SearNova_Timer = 20000+rand()%40000; } else SearNova_Timer -= diff; //Enrage_Timer if (Enrage_Timer <= diff) { DoCast(me, SPELL_ENRAGE); Enrage_Timer = 90000; } else Enrage_Timer -= diff; //Blessing of Tides Trigger if (!HealthAbovePct(75) && !BlessingOfTides) { BlessingOfTides = true; bool continueTriggering = false; Creature* Advisor; for (uint8 i = 0; i < MAX_ADVISORS; ++i) if (Advisors[i]) { Advisor = (Unit::GetCreature(*me, Advisors[i])); if (Advisor && Advisor->isAlive()) { continueTriggering = true; break; } } if (continueTriggering) { DoCast(me, SPELL_BLESSING_OF_THE_TIDES); me->MonsterYell(SAY_GAIN_BLESSING_OF_TIDES, LANG_UNIVERSAL, NULL); DoPlaySoundToSet(me, SOUND_GAIN_BLESSING_OF_TIDES); } } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { //Only if not incombat check if the event is started if (!me->isInCombat() && pInstance && pInstance->GetData(DATA_KARATHRESSEVENT)) { Unit *pTarget = Unit::GetUnit((*me), pInstance->GetData64(DATA_KARATHRESSEVENT_STARTER)); if (pTarget) { AttackStart(pTarget); } } //Return since we have no target if (!UpdateVictim()) return; //someone evaded! if (pInstance && !pInstance->GetData(DATA_KARATHRESSEVENT)) { EnterEvadeMode(); return; } //LeechingThrow_Timer if (LeechingThrow_Timer <= diff) { DoCast(me->getVictim(), SPELL_LEECHING_THROW); LeechingThrow_Timer = 20000; } else LeechingThrow_Timer -= diff; //Multishot_Timer if (Multishot_Timer <= diff) { DoCast(me->getVictim(), SPELL_MULTISHOT); Multishot_Timer = 20000; } else Multishot_Timer -= diff; //TheBeastWithin_Timer if (TheBeastWithin_Timer <= diff) { DoCast(me, SPELL_THE_BEAST_WITHIN); Creature *Pet = Unit::GetCreature(*me, SummonedPet); if (Pet && Pet->isAlive()) { Pet->CastSpell(Pet, SPELL_PET_ENRAGE, true); } TheBeastWithin_Timer = 30000; } else TheBeastWithin_Timer -= diff; //Pet_Timer if (Pet_Timer < diff && pet == false) { pet = true; //uint32 spell_id; uint32 pet_id; if (!urand(0,1)) { //spell_id = SPELL_SUMMON_FATHOM_LURKER; pet_id = CREATURE_FATHOM_LURKER; } else { //spell_id = SPELL_SUMMON_FATHOM_SPOREBAT; pet_id = CREATURE_FATHOM_SPOREBAT; } //DoCast(me, spell_id, true); Creature *Pet = DoSpawnCreature(pet_id,0,0,0,0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0); if (Pet && pTarget) { Pet->AI()->AttackStart(pTarget); SummonedPet = Pet->GetGUID(); } } else Pet_Timer -= diff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) { if(UnsummonCheck < diff && m_creature->isAlive()) { m_creature->SetLootRecipient(NULL); m_creature->SetVisibility(VISIBILITY_OFF); m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); m_creature->RemoveCorpse(); }else UnsummonCheck -= diff; return; } if(Fireball_Timer < diff) { if(Unit *victim = SelectUnit(SELECT_TARGET_RANDOM,0)) DoCast(victim, SPELL_FIREBALL,true); Fireball_Timer = 4000+rand()%3000; }else Fireball_Timer -= diff; if(flight) // phase 1 - the flight { Creature *Vazruden = Unit::GetCreature(*m_creature,VazrudenGUID); if(Fly_Timer < diff || !(Vazruden && Vazruden->isAlive() && (Vazruden->GetHealth()*5 > Vazruden->GetMaxHealth()))) { flight = false; BellowingRoar_Timer = 6000; ConeOfFire_Timer = 12000; m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT + MOVEMENTFLAG_LEVITATING); m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); m_creature->GetMotionMaster()->Clear(); if(Unit *victim = SelectUnit(SELECT_TARGET_NEAREST,0)) m_creature->AI()->AttackStart(victim); DoStartMovement(m_creature->getVictim()); DoScriptText(EMOTE, m_creature); return; }else Fly_Timer -= diff; if(Turn_Timer < diff) { uint32 waypoint = (Fly_Timer/10000)%2; if(m_creature->GetDistance(VazrudenRing[waypoint][0],VazrudenRing[waypoint][1],VazrudenRing[waypoint][2]) > 5) m_creature->GetMotionMaster()->MovePoint(0,VazrudenRing[waypoint][0],VazrudenRing[waypoint][1],VazrudenRing[waypoint][2]); Turn_Timer = 10000; }else Turn_Timer -= diff; } else // phase 2 - land fight { if(ConeOfFire_Timer < diff) { DoCast(m_creature, SPELL_CONE_OF_FIRE); ConeOfFire_Timer = 12000; Fireball_Timer = 4000; }else ConeOfFire_Timer -= diff; if(HeroicMode && BellowingRoar_Timer < diff) { DoCast(m_creature, SPELL_BELLOWING_ROAR); BellowingRoar_Timer = 45000; }else BellowingRoar_Timer -= diff; DoMeleeAttackIfReady(); } }
void UpdateAI(const uint32 uiDiff) { if (IntroText) { if(uiTextTimer <= uiDiff) { switch (uiTextPase) { case 1: DoScriptText(SAY_INTRO1, me); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_TALK); uiTextTimer = 30000; uiTextPase++; break; case 2: DoScriptText(SAY_INTRO2, me); uiTextTimer = 5000; uiTextPase++; break; case 3: DoScriptText(SAY_INTRO3, me); uiTextTimer = 3000; uiTextPase++; break; case 4: DoScriptText(SAY_INTRO4, me); uiTextTimer = 7000; uiTextPase++; break; case 5: DoScriptText(SAY_INTRO5, me); uiTextTimer = 3000; uiTextPase++; break; case 6: me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE); IntroText = false; uiTextTimer = 0; Phase = 1; me->SetReactState(REACT_AGGRESSIVE); break; } } else uiTextTimer -= uiDiff; } if (!UpdateVictim()) return; switch (Phase) { case PHASE_ONE: if (!PhaseDone) { if (me->GetHealthPercent() < 70.0f) Phase = 5; } if (Summon_Horror_Timer <= uiDiff) { DoCast(SPELL_SUMMON_HORROR); Summon_Horror_Timer = 60000; } else Summon_Horror_Timer -= uiDiff; if (Summon_Ghouls_Timer <= uiDiff) { DoCast(SPELL_SUMMON_GHOULS); Summon_Ghouls_Timer = 50000; } else Summon_Ghouls_Timer -= uiDiff; if (Infest_Timer <= uiDiff) { DoCast(SPELL_INFEST); Infest_Timer = 20000; } else Infest_Timer -= uiDiff; if (Necrotic_Plague_Timer <= uiDiff) { DoCast(SPELL_NECROTIC_PLAGUE); Necrotic_Plague_Timer = 30000; } else Necrotic_Plague_Timer -= uiDiff; break; case PHASE_TWO: if (!PhaseDone) { if (me->GetHealthPercent() < 40.0f) Phase = 6; } if (Summon_Valkyr_Timer < uiDiff) { DoCast(SPELL_SUMMON_VALKYR); DoScriptText(SAY_SUMMON_V,me); Summon_Valkyr_Timer = 50000; } else Summon_Valkyr_Timer -= uiDiff; if (Infest_Timer < uiDiff) { DoCast(SPELL_INFEST); Infest_Timer = 20000; } else Infest_Timer -= uiDiff; if (Soul_Reaper_Timer < uiDiff) { DoCast(SPELL_SOUL_REAPER); Soul_Reaper_Timer = 30000; } else Soul_Reaper_Timer -= uiDiff; if (Defile_Timer < uiDiff) { DoCast(SPELL_DEFILE); Defile_Timer = 35000; } else Defile_Timer -= uiDiff; break; case PHASE_THREE: if (Defile_Timer < uiDiff) { DoCast(SPELL_DEFILE); Defile_Timer = 35000; } else Defile_Timer -= uiDiff; if (Soul_Reaper_Timer < uiDiff) { DoCast(SPELL_SOUL_REAPER); Soul_Reaper_Timer = 30000; } else Soul_Reaper_Timer -= uiDiff; if (Harvest_Soul_Timer < uiDiff) { DoCast(SPELL_HARVEST_SOUL); Harvest_Soul_Timer = 60000; } else Harvest_Soul_Timer -= uiDiff; if (Vile_Spirits_Timer < uiDiff) { DoCast(SPELL_VILE_SPIRITS); Vile_Spirits_Timer = 30000; } else Vile_Spirits_Timer -= uiDiff; break; case PHASE_TRANSITION_1: if (!PhaseDone) { if (Phase_Timer <= uiDiff) { DoCast(me, SPELL_QUAKE); Phase = 3; Phase_Timer = 60000; break; } else Phase_Timer -= uiDiff; } if (Remorseless_Winter_Timer < uiDiff) { DoCast(SPELL_REMORSELESS_WINTER); Remorseless_Winter_Timer = 60000; } else Remorseless_Winter_Timer -= uiDiff; if (Pain_And_Suffering_Timer < uiDiff) { if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(pTarget, SPELL_PAIN_AND_SUFFERING); Pain_And_Suffering_Timer = 3000; } else Pain_And_Suffering_Timer -= uiDiff; if (Summon_Ice_Sphere_Timer < uiDiff) { DoCast(SPELL_SUMMON_ICE_SPHERE); Summon_Ice_Sphere_Timer = 5000; } else Summon_Ice_Sphere_Timer -= uiDiff; if (Raging_Spirit_Timer < uiDiff) { DoCast(SPELL_RAGING_SPIRIT); Raging_Spirit_Timer = 20000; } else Raging_Spirit_Timer -= uiDiff; break; case PHASE_TRANSITION_2: if (!PhaseDone) { if (Phase_Timer <= uiDiff) { DoCast(me, SPELL_QUAKE); Phase = 4; Phase_Timer = 60000; break; } else Phase_Timer -= uiDiff; } if (Remorseless_Winter_Timer < uiDiff) { DoCast(SPELL_REMORSELESS_WINTER); Remorseless_Winter_Timer = 60000; } else Remorseless_Winter_Timer -= uiDiff; if (Pain_And_Suffering_Timer < uiDiff) { if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 10)) DoCast(pTarget, SPELL_PAIN_AND_SUFFERING); Pain_And_Suffering_Timer = 3000; } else Pain_And_Suffering_Timer -= uiDiff; if (Summon_Ice_Sphere_Timer < uiDiff) { DoCast(SPELL_SUMMON_ICE_SPHERE); Summon_Ice_Sphere_Timer = 5000; } else Summon_Ice_Sphere_Timer -= uiDiff; if (Raging_Spirit_Timer < uiDiff) { DoCast(SPELL_RAGING_SPIRIT); Raging_Spirit_Timer = 20000; } else Raging_Spirit_Timer -= uiDiff; break; } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 uiDiff) { if (!UpdateVictim()) return; if (!m_bIsPhaseTwo) { if (m_uiShadowWordPain_Timer <= uiDiff) { DoCast(me->getVictim(), SPELL_SHADOWWORDPAIN); m_uiShadowWordPain_Timer = 15000; } else m_uiShadowWordPain_Timer -= uiDiff; if (m_uiMark_Timer <= uiDiff) { Unit *pMarkedTarget = SelectUnit(SELECT_TARGET_RANDOM, 0); if (pMarkedTarget) { DoCast(pMarkedTarget, SPELL_MARK); MarkedTargetGUID = pMarkedTarget->GetGUID(); } else sLog->outError("TSCR: boss_arlokk could not accuire pMarkedTarget."); m_uiMark_Timer = 15000; } else m_uiMark_Timer -= uiDiff; } else { //Cleave_Timer if (m_uiCleave_Timer <= uiDiff) { DoCast(me->getVictim(), SPELL_CLEAVE); m_uiCleave_Timer = 16000; } else m_uiCleave_Timer -= uiDiff; //Gouge_Timer if (m_uiGouge_Timer <= uiDiff) { DoCast(me->getVictim(), SPELL_GOUGE); DoModifyThreatPercent(me->getVictim(), -80); m_uiGouge_Timer = 17000+rand()%10000; } else m_uiGouge_Timer -= uiDiff; } if (m_uiSummonCount <= 30) { if (m_uiSummon_Timer <= uiDiff) { DoSummonPhanters(); m_uiSummon_Timer = 5000; } else m_uiSummon_Timer -= uiDiff; } if (m_uiVanish_Timer <= uiDiff) { //Invisble Model me->SetDisplayId(MODEL_ID_BLANK); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->AttackStop(); DoResetThreat(); m_bIsVanished = true; m_uiVanish_Timer = 45000; m_uiVisible_Timer = 6000; } else m_uiVanish_Timer -= uiDiff; if (m_bIsVanished) { if (m_uiVisible_Timer <= uiDiff) { //The Panther Model me->SetDisplayId(MODEL_ID_PANTHER); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); const CreatureInfo *cinfo = me->GetCreatureInfo(); me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35))); me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35))); me->UpdateDamagePhysical(BASE_ATTACK); if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) AttackStart(pTarget); m_bIsPhaseTwo = true; m_bIsVanished = false; } else m_uiVisible_Timer -= uiDiff; } else DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; boss_priestess_lackey_commonAI::UpdateAI(diff); if (Intercept_Stun_Timer <= diff) { bool InMeleeRange = false; std::list<HostileReference*>& t_list = me->getThreatManager().getThreatList(); for (std::list<HostileReference*>::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr) { if (Unit *pTarget = Unit::GetUnit(*me, (*itr)->getUnitGuid())) { //if in melee range if (pTarget->IsWithinDistInMap(me, ATTACK_DISTANCE)) { InMeleeRange = true; break; } } } //if nobody is in melee range than try to use Intercept if (!InMeleeRange) { if (Unit* pUnit = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(pUnit, SPELL_INTERCEPT_STUN); } Intercept_Stun_Timer = 10000; } else Intercept_Stun_Timer -= diff; if (Disarm_Timer <= diff) { DoCast(me->getVictim(), SPELL_DISARM); Disarm_Timer = 6000; } else Disarm_Timer -= diff; if (Hamstring_Timer <= diff) { DoCast(me->getVictim(), SPELL_HAMSTRING); Hamstring_Timer = 4500; } else Hamstring_Timer -= diff; if (Mortal_Strike_Timer <= diff) { DoCast(me->getVictim(), SPELL_MORTAL_STRIKE); Mortal_Strike_Timer = 4500; } else Mortal_Strike_Timer -= diff; if (Piercing_Howl_Timer <= diff) { DoCast(me->getVictim(), SPELL_PIERCING_HOWL); Piercing_Howl_Timer = 10000; } else Piercing_Howl_Timer -= diff; if (Frightening_Shout_Timer <= diff) { DoCast(me->getVictim(), SPELL_FRIGHTENING_SHOUT); Frightening_Shout_Timer = 18000; } else Frightening_Shout_Timer -= diff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { //Return since we have no target if (!UpdateVictim()) return; //MortalWound_Timer if (MortalWound_Timer <= diff) { DoCast(me->getVictim(),SPELL_MORTAL_WOUND); MortalWound_Timer = 10000 + rand()%10000; } else MortalWound_Timer -= diff; //Summon 1-3 Spawns of Fankriss at random time. if (SpawnSpawns_Timer <= diff) { switch (rand()%3) { case 0: SummonSpawn(SelectUnit(SELECT_TARGET_RANDOM,0)); break; case 1: SummonSpawn(SelectUnit(SELECT_TARGET_RANDOM,0)); SummonSpawn(SelectUnit(SELECT_TARGET_RANDOM,0)); break; case 2: SummonSpawn(SelectUnit(SELECT_TARGET_RANDOM,0)); SummonSpawn(SelectUnit(SELECT_TARGET_RANDOM,0)); SummonSpawn(SelectUnit(SELECT_TARGET_RANDOM,0)); break; } SpawnSpawns_Timer = 30000 + rand()%30000; } else SpawnSpawns_Timer -= diff; // Teleporting Random Target to one of the three tunnels and spawn 4 hatchlings near the gamer. //We will only telport if fankriss has more than 3% of hp so teleported gamers can always loot. if (me->GetHealth()*100 / me->GetMaxHealth() > 3) { if (SpawnHatchlings_Timer <= diff) { Unit* pTarget = NULL; pTarget = SelectUnit(SELECT_TARGET_RANDOM,0); if (pTarget && pTarget->GetTypeId() == TYPEID_PLAYER) { DoCast(pTarget, SPELL_ROOT); if (DoGetThreat(pTarget)) DoModifyThreatPercent(pTarget, -100); switch (rand()%3) { case 0: DoTeleportPlayer(pTarget, -8106.0142f,1289.2900f,-74.419533f,5.112f); Hatchling = me->SummonCreature(15962, pTarget->GetPositionX()-3, pTarget->GetPositionY()-3, pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) ((CreatureAI*)Hatchling->AI())->AttackStart(pTarget); Hatchling = me->SummonCreature(15962, pTarget->GetPositionX()-3, pTarget->GetPositionY()+3, pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) ((CreatureAI*)Hatchling->AI())->AttackStart(pTarget); Hatchling = me->SummonCreature(15962, pTarget->GetPositionX()-5, pTarget->GetPositionY()-5, pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) ((CreatureAI*)Hatchling->AI())->AttackStart(pTarget); Hatchling = me->SummonCreature(15962, pTarget->GetPositionX()-5, pTarget->GetPositionY()+5, pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) ((CreatureAI*)Hatchling->AI())->AttackStart(pTarget); break; case 1: DoTeleportPlayer(pTarget, -7990.135354f,1155.1907f,-78.849319f,2.608f); Hatchling = me->SummonCreature(15962, pTarget->GetPositionX()-3, pTarget->GetPositionY()-3, pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) ((CreatureAI*)Hatchling->AI())->AttackStart(pTarget); Hatchling = me->SummonCreature(15962, pTarget->GetPositionX()-3, pTarget->GetPositionY()+3, pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) ((CreatureAI*)Hatchling->AI())->AttackStart(pTarget); Hatchling = me->SummonCreature(15962, pTarget->GetPositionX()-5, pTarget->GetPositionY()-5, pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) ((CreatureAI*)Hatchling->AI())->AttackStart(pTarget); Hatchling = me->SummonCreature(15962, pTarget->GetPositionX()-5, pTarget->GetPositionY()+5, pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) ((CreatureAI*)Hatchling->AI())->AttackStart(pTarget); break; case 2: DoTeleportPlayer(pTarget,-8159.7753f,1127.9064f,-76.868660f,0.675f); Hatchling = me->SummonCreature(15962, pTarget->GetPositionX()-3, pTarget->GetPositionY()-3, pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) ((CreatureAI*)Hatchling->AI())->AttackStart(pTarget); Hatchling = me->SummonCreature(15962, pTarget->GetPositionX()-3, pTarget->GetPositionY()+3, pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) ((CreatureAI*)Hatchling->AI())->AttackStart(pTarget); Hatchling = me->SummonCreature(15962, pTarget->GetPositionX()-5, pTarget->GetPositionY()-5, pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) ((CreatureAI*)Hatchling->AI())->AttackStart(pTarget); Hatchling = me->SummonCreature(15962, pTarget->GetPositionX()-5, pTarget->GetPositionY()+5, pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) ((CreatureAI*)Hatchling->AI())->AttackStart(pTarget); break; } } SpawnHatchlings_Timer = 45000 + rand()%15000; } else SpawnHatchlings_Timer -= diff; } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!Phase) return; // Reset if event is begun and we don't have a threatlist if (Phase && m_creature->getThreatManager().getThreatList().empty()) EnterEvadeMode(); if (Phase == 1) { if (AnimationTimer < diff) { // Release the cube m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,374); AnimationTimer = 8300; }else AnimationTimer -= diff; if (SummonEssenceTimer < diff) { // Ribs: open m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,373); Creature* EssenceSuffering = NULL; EssenceSuffering = m_creature->SummonCreature(23418, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), 1.57f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10000); if (EssenceSuffering) { DoScriptText(SUFF_SAY_FREED, EssenceSuffering); if (Unit* target = SelectUnit(SELECT_TARGET_TOPAGGRO, 0)) { EssenceSuffering->AddThreat(target); EssenceSuffering->AI()->AttackStart(target); } SufferingGUID = EssenceSuffering->GetGUID(); } EndingPhase = false; Phase = 2; }else SummonEssenceTimer -= diff; } if (Phase == 2) { if (SufferingGUID) { Creature* EssenceSuffering = NULL; EssenceSuffering = ((Creature*)Unit::GetUnit((*m_creature), SufferingGUID)); if (!EssenceSuffering || (!EssenceSuffering->isAlive())) EnterEvadeMode(); if (!EndingPhase) { if (EssenceSuffering) { if (EssenceSuffering->GetHealthPercent() < 10.0f) { DoScriptText(SUFF_SAY_RECAP, EssenceSuffering); MergeThreatList(EssenceSuffering); EssenceSuffering->RemoveAllAuras(); EssenceSuffering->DeleteThreatList(); EssenceSuffering->GetMotionMaster()->MoveFollow(m_creature,0.0f,0.0f); EssenceSuffering->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); DespawnEssenceTimer = 4000; AnimationTimer = 2200; EndingPhase = true; } } } if ((EndingPhase) && (EssenceSuffering) && (EssenceSuffering->isAlive())) { if (AnimationTimer < diff) { // Return EssenceSuffering->SetUInt32Value(UNIT_NPC_EMOTESTATE,374); AnimationTimer = 10000; }else AnimationTimer -= diff; if (DespawnEssenceTimer < diff) { DoScriptText(SUFF_SAY_AFTER, EssenceSuffering); EssenceSuffering->DeleteThreatList(); EssenceSuffering->SetDisplayId(11686); EssenceSuffering->setFaction(35); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,0); SummonEssenceTimer = 20000; //60000; AnimationTimer = 18200; //58100; SoulDeathCount = 0; SoulCount = 0; SummonSoulTimer = 1000; EndingPhase = false; Phase = 3; SufferingGUID = 0; }else DespawnEssenceTimer -= diff; } } } if (Phase == 3) { if (SoulCount < 36) { if (SummonSoulTimer < diff) { SummonSoul(); SummonSoulTimer = 500; }else SummonSoulTimer -= diff; } if (SoulDeathCount >= SoulCount) { if (AnimationTimer < diff) { // Release the cube m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,374); AnimationTimer = 10000; }else AnimationTimer -= diff; if (SummonEssenceTimer < diff) { // Ribs: open m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,373); Creature* EssenceDesire = NULL; EssenceDesire = m_creature->SummonCreature(23419, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), 1.57f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10000); if (EssenceDesire) { DoScriptText(DESI_SAY_FREED, EssenceDesire); if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0)) { EssenceDesire->AddThreat(target); EssenceDesire->AI()->AttackStart(target); } DesireGUID = EssenceDesire->GetGUID(); SoulDeathCount = 0; } Phase = 4; }else SummonEssenceTimer -= diff; } } if (Phase == 4) { if (DesireGUID) { Creature* EssenceDesire = NULL; EssenceDesire = ((Creature*)Unit::GetUnit((*m_creature), DesireGUID)); if (!EssenceDesire || !EssenceDesire->isAlive()) EnterEvadeMode(); if (!EndingPhase && EssenceDesire) { if (EssenceDesire->GetHealthPercent() < 10.0f) { MergeThreatList(EssenceDesire); EssenceDesire->GetMotionMaster()->MoveFollow(m_creature,0.0f,0.0f); EssenceDesire->RemoveAllAuras(); EssenceDesire->DeleteThreatList(); DoScriptText(DESI_SAY_RECAP, EssenceDesire); EssenceDesire->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); DespawnEssenceTimer = 4000; AnimationTimer = 2200; EndingPhase = true; } } if (EndingPhase && EssenceDesire) { if (EssenceDesire->isAlive()) { if (AnimationTimer < diff) { // Return EssenceDesire->SetUInt32Value(UNIT_NPC_EMOTESTATE,374); AnimationTimer = 10000; }else AnimationTimer -= diff; if (DespawnEssenceTimer < diff) { EssenceDesire->DeleteThreatList(); EssenceDesire->setFaction(35); DoScriptText(DESI_SAY_AFTER, EssenceDesire); EssenceDesire->SetDisplayId(11686); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,0); SummonEssenceTimer = 20000; AnimationTimer = 18200; SoulDeathCount = 0; SoulCount = 0; SummonSoulTimer = 1000; EndingPhase = false; Phase = 5; DesireGUID = 0; }else DespawnEssenceTimer -= diff; } } } } if (Phase == 5) { if (SoulCount < 36) { if (SummonSoulTimer < diff) { SummonSoul(); SummonSoulTimer = 500; }else SummonSoulTimer -= diff; } if (SoulDeathCount >= SoulCount) { if (AnimationTimer < diff) { // Release the cube m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,374); AnimationTimer = 10000; }else AnimationTimer -= diff; if (SummonEssenceTimer < diff) { // Ribs: open m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,373); Creature* EssenceAnger = NULL; EssenceAnger = m_creature->SummonCreature(23420, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), 1.57f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 45000); if (EssenceAnger) { if (Unit* target = SelectUnit(SELECT_TARGET_TOPAGGRO, 0)) { EssenceAnger->AddThreat(target); EssenceAnger->AI()->AttackStart(target); } AngerGUID = EssenceAnger->GetGUID(); DoScriptText(ANGER_SAY_FREED, EssenceAnger); SoulDeathCount = 0; } Phase = 6; }else SummonEssenceTimer -= diff; } } if (Phase == 6) { if (AngerGUID) { Creature* EssenceAnger = NULL; EssenceAnger = ((Creature*)Unit::GetUnit((*m_creature), AngerGUID)); if (!EssenceAnger) EnterEvadeMode(); if (m_creature->isAlive() && EssenceAnger) { if (!EssenceAnger->isAlive()) { AngerGUID = 0; m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); } } } } }
void UpdateAI(const uint32 uiDiff) { if (m_uiTirionSpawnTimer < uiDiff && !m_bIsTirionSpawned) { me->SummonCreature(CREATURE_TIRION_ICC, 528.552002, -2124.620117, 1040.859985, 3.183670, TEMPSUMMON_CORPSE_DESPAWN, 5000); m_bIsTirionSpawned = true; } else m_uiTirionSpawnTimer -= uiDiff; if(!UpdateVictim()) return; if(!m_bIsDeathPhase) { if (m_uiRandomSpeechTimer < uiDiff) { DoScriptText(RAND(SAY_RANDOM_1,SAY_RANDOM_2), me); m_uiRandomSpeechTimer = 33000; } else m_uiRandomSpeechTimer -= uiDiff; } if (m_uiBerserkTimer < uiDiff && !m_bIsBerserk) { DoScriptText(SAY_BERSERK, me); DoCast(me, SPELL_BERSERK); m_bIsBerserk = true; } else m_uiBerserkTimer -= uiDiff; if(m_uiPhase == 1) { if (m_uiInfestTimer < uiDiff) { DoCast(me, SPELL_INFEST); m_uiInfestTimer = 30000; } else m_uiInfestTimer -= uiDiff; if (m_uiPlagueSiphonTimer < uiDiff) { DoCast(me, SPELL_PLAGUE_SIPHON); m_uiPlagueSiphonTimer = 30000; } else m_uiPlagueSiphonTimer -= uiDiff; if (m_uiSummonDrudgeGhoulsTimer < uiDiff) { DoCast(me, SPELL_SUMMON_DRUDGE_GHOULS); m_uiSummonDrudgeGhoulsTimer = 20000; } else m_uiSummonDrudgeGhoulsTimer -= uiDiff; if (m_uiSummonShamblingHorrorTimer < uiDiff) { DoCast(me, SPELL_SUMMON_SHAMBLING_HORROR); m_uiSummonShamblingHorrorTimer = 60000; } else m_uiSummonShamblingHorrorTimer -= uiDiff; if (m_uiNecroticPlagueTimer < uiDiff) { Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,0); DoCast(pTarget, SPELL_NECROTIC_PLAGUE); m_uiNecroticPlagueTimer = 5000; } else m_uiNecroticPlagueTimer -= uiDiff; } if(m_uiPhase == 2) { if (m_uiRemorselesWinterTimer < uiDiff) { DoScriptText(SAY_REMORSELESS_WINTER, me); DoCast(me, SPELL_REMORSELES_WINTER); m_uiRemorselesWinterTimer = 90000; } else m_uiRemorselesWinterTimer -= uiDiff; if (m_uiSummonSpiritTimer < uiDiff) { Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,0); DoCast(pTarget, SPELL_SUMMON_RAGING_SPIRIT); m_uiSummonSpiritTimer = 16000; } else m_uiSummonSpiritTimer -= uiDiff; if (m_uiIcePulsSummonTimer < uiDiff) { DoCast(me, SPELL_SUMMON_ICE_SPEHERE); m_uiIcePulsSummonTimer = 15000; } else m_uiIcePulsSummonTimer -= uiDiff; if (m_uiPainandSufferingTimer < uiDiff) { Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0); DoCast(pTarget, SPELL_PAIN_AND_SUFFERING); m_uiPainandSufferingTimer = 2000; } else m_uiPainandSufferingTimer -= uiDiff; if (m_uiQuakeTimer < uiDiff) { DoScriptText(SAY_BROKEN_ARENA, me); DoCast(me, SPELL_QUAKE); me->SetReactState(REACT_AGGRESSIVE); me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MoveChase(me->getVictim()); m_uiPhase = 3; } else m_uiQuakeTimer -= uiDiff; } if(m_uiPhase == 3) { if (m_uiDefileTimer < uiDiff) { Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,0); DoCast(pTarget, SPELL_SPAWN_DEFILE); m_uiDefileTimer = 20000; } else m_uiDefileTimer -= uiDiff; if (m_uiSummonValkyrTimer < uiDiff) { DoScriptText(SAY_SUMMON_VALKYR, me); me->SummonCreature(CREATURE_VALKYR, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+10, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 99999999); //DoCast(me, SPELL_SUMMON_VALKYR); m_uiSummonValkyrTimer = 20000; } else m_uiSummonValkyrTimer -= uiDiff; if (m_uiSoulReaperTimer < uiDiff) { DoCast(me->getVictim(), SPELL_SOUL_REAPER); m_uiSoulReaperTimer = 20000; } else m_uiSoulReaperTimer -= uiDiff; if (m_uiInfestTimer < uiDiff) { DoCast(me, SPELL_INFEST); m_uiInfestTimer = 30000; } else m_uiInfestTimer -= uiDiff; } if(m_uiPhase == 4) { if (m_uiRemorselesWinterTimer < uiDiff) { DoScriptText(SAY_REMORSELESS_WINTER, me); DoCast(me, SPELL_REMORSELES_WINTER); m_uiRemorselesWinterTimer = 90000; } else m_uiRemorselesWinterTimer -= uiDiff; if (m_uiSummonSpiritTimer < uiDiff) { Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,0); DoCast(pTarget, SPELL_SUMMON_RAGING_SPIRIT); m_uiSummonSpiritTimer = 16000; } else m_uiSummonSpiritTimer -= uiDiff; if (m_uiIcePulsSummonTimer < uiDiff) { DoCast(me, SPELL_SUMMON_ICE_SPEHERE); m_uiIcePulsSummonTimer = 15000; } else m_uiIcePulsSummonTimer -= uiDiff; if (m_uiPainandSufferingTimer < uiDiff) { Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,0); DoCast(pTarget, SPELL_PAIN_AND_SUFFERING); m_uiPainandSufferingTimer = 3000; } else m_uiPainandSufferingTimer -= uiDiff; if (m_uiQuakeTimer < uiDiff) { DoScriptText(SAY_BROKEN_ARENA, me); DoCast(me, SPELL_QUAKE); me->SetReactState(REACT_AGGRESSIVE); me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MoveChase(me->getVictim()); m_uiPhase = 5; } else m_uiQuakeTimer -= uiDiff; } if(m_uiPhase == 5) { if (m_uiSummonVileSpiritTimer < uiDiff) { DoCast(me, SPELL_SUMMON_VILE_SPIRIT); m_uiSummonVileSpiritTimer = 30000; } else m_uiSummonVileSpiritTimer -= uiDiff; if (m_uiHarvestSoulTimer < uiDiff) { DoScriptText(SAY_HARVEST_SOUL, me); Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 1); DoCast(pTarget, SPELL_HARVEST_SOULS); m_uiHarvestSoulTimer = 70000; } else m_uiHarvestSoulTimer -= uiDiff; } DoMeleeAttackIfReady(); if (m_uiEndingTimer <= uiDiff) EndingPhase(); else m_uiEndingTimer -= uiDiff; if (HealthBelowPct(70) && !m_bIsSwitchPhase1) { m_uiPhase = 2; Phasenswitch(); m_bIsSwitchPhase1 = true; } else if (HealthBelowPct(40) && !m_bIsSwitchPhase2) { m_uiPhase = 4; m_uiRemorselesWinterTimer = 5000; m_uiQuakeTimer = 70000; m_uiIcePulsSummonTimer = 10000; m_uiPainandSufferingTimer = 10000; m_uiSummonSpiritTimer = 18000; Phasenswitch(); m_bIsSwitchPhase2 = true; } else if (HealthBelowPct(11) && !m_bIsTriggerSpawned) { pSafeZone = me->SummonCreature(CREATURE_TRIGGER, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_CORPSE_DESPAWN, 360000); pSafeZone->AI()->AttackStart(me); pSafeZone->SetDisplayId(MODEL_INVISIBLE); m_bIsTriggerSpawned = true; } else if (HealthBelowPct(10) && !m_bIsDeathPhase) { m_uiPhase = 6; m_bIsDeathPhase = true; SetEnding(); } }
void UpdateAI(const uint32 diff) { if (WasBanished && Attack_Timer < diff) { //Become unbanished again m_creature->setFaction(14); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); DoCast(m_creature,SPELL_RAGEMERGE); WasBanished = false; } else if (WasBanished) { Attack_Timer -= diff; //Do nothing while banished return; } //Return since we have no target if (!UpdateVictim()) return; //WrathOfRagnaros_Timer if (WrathOfRagnaros_Timer < diff) { DoCast(m_creature->getVictim(),SPELL_WRATHOFRAGNAROS); if (rand()%2 == 0) { DoScriptText(SAY_WRATH, m_creature); } WrathOfRagnaros_Timer = 30000; }else WrathOfRagnaros_Timer -= diff; //HandOfRagnaros_Timer if (HandOfRagnaros_Timer < diff) { DoCast(m_creature,SPELL_HANDOFRAGNAROS); if (rand()%2==0) { DoScriptText(SAY_HAND, m_creature); } HandOfRagnaros_Timer = 25000; }else HandOfRagnaros_Timer -= diff; //LavaBurst_Timer if (LavaBurst_Timer < diff) { DoCast(m_creature->getVictim(),SPELL_LAVABURST); LavaBurst_Timer = 10000; }else LavaBurst_Timer -= diff; //Erruption_Timer if (LavaBurst_Timer < diff) { DoCast(m_creature->getVictim(),SPELL_ERRUPTION); Erruption_Timer = 20000 + rand()%25000; }else Erruption_Timer -= diff; //ElementalFire_Timer if (ElementalFire_Timer < diff) { DoCast(m_creature->getVictim(),SPELL_ELEMENTALFIRE); ElementalFire_Timer = 10000 + rand()%4000; }else ElementalFire_Timer -= diff; //Submerge_Timer if (!WasBanished && Submerge_Timer < diff) { //Creature spawning and ragnaros becomming unattackable //is not very well supported in the core //so added normaly spawning and banish workaround and attack again after 90 secs. m_creature->InterruptNonMeleeSpells(false); //Root self DoCast(m_creature,23973); m_creature->setFaction(35); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); m_creature->HandleEmoteCommand(EMOTE_ONESHOT_SUBMERGE); if (!HasSubmergedOnce) { DoScriptText(SAY_REINFORCEMENTS1, m_creature); // summon 10 elementals for(uint8 i = 0; i < 9; ++i) { if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,0)) { if (Creature* pSummoned = m_creature->SummonCreature(12143,pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(),0.0f,TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN,900000)) pSummoned->AI()->AttackStart(pTarget); } } HasSubmergedOnce = true; WasBanished = true; DoCast(m_creature,SPELL_RAGSUBMERGE); Attack_Timer = 90000; } else { DoScriptText(SAY_REINFORCEMENTS2, m_creature); for(uint8 i = 0; i < 9; ++i) { if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,0)) { if (Creature* pSummoned = m_creature->SummonCreature(12143,pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(),0.0f,TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN,900000)) pSummoned->AI()->AttackStart(pTarget); } } WasBanished = true; DoCast(m_creature,SPELL_RAGSUBMERGE); Attack_Timer = 90000; } Submerge_Timer = 180000; }else Submerge_Timer -= diff; //If we are within range melee the target if (m_creature->IsWithinMeleeRange(m_creature->getVictim())) { //Make sure our attack is ready and we arn't currently casting if (m_creature->isAttackReady() && !m_creature->IsNonMeleeSpellCasted(false)) { m_creature->AttackerStateUpdate(m_creature->getVictim()); m_creature->resetAttackTimer(); } } else { //MagmaBurst_Timer if (MagmaBurst_Timer < diff) { DoCast(m_creature->getVictim(),SPELL_MAGMABURST); if (!HasYelledMagmaBurst) { //Say our dialog DoScriptText(SAY_MAGMABURST, m_creature); HasYelledMagmaBurst = true; } MagmaBurst_Timer = 2500; }else MagmaBurst_Timer -= diff; } }
void UpdateAI(const uint32 uiDiff) { if (!UpdateVictim()) return; if (m_uiPhase == PHASE_START || m_uiPhase == PHASE_END) { if (m_uiFlameBreathTimer <= uiDiff) { DoCast(me->getVictim(), SPELL_FLAMEBREATH); m_uiFlameBreathTimer = urand(10000, 20000); } else m_uiFlameBreathTimer -= uiDiff; if (m_uiTailSweepTimer <= uiDiff) { DoCast(me, SPELL_TAILSWEEP); m_uiTailSweepTimer = urand(15000, 20000); } else m_uiTailSweepTimer -= uiDiff; if (m_uiCleaveTimer <= uiDiff) { DoCast(me->getVictim(), SPELL_CLEAVE); m_uiCleaveTimer = urand(2000, 5000); } else m_uiCleaveTimer -= uiDiff; if (m_uiWingBuffetTimer <= uiDiff) { DoCast(me->getVictim(), SPELL_WINGBUFFET); m_uiWingBuffetTimer = urand(15000, 30000); } else m_uiWingBuffetTimer -= uiDiff; if (m_uiPhase == PHASE_END) { if (m_uiBellowingRoarTimer <= uiDiff) { DoCast(me->getVictim(), SPELL_BELLOWINGROAR); m_uiBellowingRoarTimer = 30000; } else m_uiBellowingRoarTimer -= uiDiff; } else { if (me->GetHealth()*100 / me->GetMaxHealth() < 60) { m_uiPhase = PHASE_BREATH; SetCombatMovement(false); me->GetMotionMaster()->Clear(false); me->GetMotionMaster()->MoveIdle(); DoScriptText(SAY_PHASE_2_TRANS, me); if (m_pPointData) me->GetMotionMaster()->MovePoint(m_pPointData->uiLocId, m_pPointData->fX, m_pPointData->fY, m_pPointData->fZ); SetNextRandomPoint(); return; } } DoMeleeAttackIfReady(); } else { if (me->GetHealth()*100 / me->GetMaxHealth() < 40) { m_uiPhase = PHASE_END; DoScriptText(SAY_PHASE_3_TRANS, me); SetCombatMovement(true); me->GetMotionMaster()->MoveChase(me->getVictim()); return; } if (m_uiMovementTimer <= uiDiff) { m_pPointData = GetMoveData(); SetNextRandomPoint(); m_uiMovementTimer = 25000; if (!m_pPointData) return; if (m_uiMovePoint == m_pPointData->uiLocIdEnd) { if (me->IsNonMeleeSpellCasted(false)) me->InterruptNonMeleeSpells(false); DoScriptText(EMOTE_BREATH, me); DoCast(me, m_pPointData->uiSpellId); } else { me->GetMotionMaster()->MovePoint(m_pPointData->uiLocId, m_pPointData->fX, m_pPointData->fY, m_pPointData->fZ); } } else m_uiMovementTimer -= uiDiff; if (m_uiEngulfingFlamesTimer <= uiDiff) { if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE) { if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(pTarget, SPELL_FIREBALL); m_uiEngulfingFlamesTimer = 8000; } } else m_uiEngulfingFlamesTimer -= uiDiff; //engulfingflames is supposed to be activated by a fireball but haven't come by if (m_bIsSummoningWhelps) { if (m_uiSummonCount < MAX_WHELP) { if (m_uiWhelpTimer <= uiDiff) { me->SummonCreature(NPC_WHELP, afSpawnLocations[0][0], afSpawnLocations[0][1], afSpawnLocations[0][2], 0.0f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000); me->SummonCreature(NPC_WHELP, afSpawnLocations[1][0], afSpawnLocations[1][1], afSpawnLocations[1][2], 0.0f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000); m_uiWhelpTimer = 1000; } else m_uiWhelpTimer -= uiDiff; } else { m_bIsSummoningWhelps = false; m_uiSummonCount = 0; m_uiSummonWhelpsTimer = 30000; } } else { if (m_uiSummonWhelpsTimer <= uiDiff) m_bIsSummoningWhelps = true; else m_uiSummonWhelpsTimer -= uiDiff; } if (m_bIsSummoningLairGuards) { if (m_uiLairGuardTimer <= uiDiff) { me->SummonCreature(NPC_LAIRGUARD, afSpawnLocations[0][0], afSpawnLocations[0][1], afSpawnLocations[0][2], 0.0f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000); me->SummonCreature(NPC_LAIRGUARD, afSpawnLocations[1][0], afSpawnLocations[1][1], afSpawnLocations[1][2], 0.0f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000); m_uiLairGuardTimer = 30000; } else m_uiLairGuardTimer -= uiDiff; } else { if (m_uiLairGuardTimer <= uiDiff) m_bIsSummoningLairGuards = true; else m_uiLairGuardTimer -= uiDiff; } } }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch(eventId) { case EVENT_ENRAGE: DoScriptText(SAY_MOLGEIM_BERSERK, me); DoCast(SPELL_BERSERK); break; case EVENT_RUNE_OF_POWER: // random alive friendly { Creature* bosschoosed; uint32 choice = urand(0,2); if (!pInstance) break; bosschoosed = Unit::GetCreature(*me, pInstance->GetData64(DATA_STEELBREAKER+choice)); if (!bosschoosed || !bosschoosed->isAlive()) { choice = ((choice == 2) ? 0 : choice++); bosschoosed = Unit::GetCreature(*me, pInstance->GetData64(DATA_STEELBREAKER+choice)); if (!bosschoosed || !bosschoosed->isAlive()) { choice = ((choice == 2) ? 0 : choice++); bosschoosed = Unit::GetCreature(*me, pInstance->GetData64(DATA_STEELBREAKER+choice)); } } if (!bosschoosed || !bosschoosed->isAlive()) bosschoosed = Unit::GetCreature(*me, pInstance->GetData64(DATA_MOLGEIM)); DoCast(bosschoosed, SPELL_RUNE_OF_POWER); events.ScheduleEvent(EVENT_RUNE_OF_POWER, 35000); } break; case EVENT_SHIELD_OF_RUNES: DoCast(me, SPELL_SHIELD_OF_RUNES); events.ScheduleEvent(EVENT_SHIELD_OF_RUNES, urand(60000, 80000)); break; case EVENT_RUNE_OF_DEATH: { DoScriptText(SAY_MOLGEIM_RUNE_DEATH, me); if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(pTarget, SPELL_RUNE_OF_DEATH); events.ScheduleEvent(EVENT_RUNE_OF_DEATH, 30000); } break; case EVENT_RUNE_OF_SUMMONING: { DoScriptText(SAY_MOLGEIM_SUMMON, me); if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(pTarget, SPELL_RUNE_OF_SUMMONING); events.ScheduleEvent(EVENT_RUNE_OF_SUMMONING, urand(40000, 50000)); } break; } } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; // Evade if too far if (check_Timer <= diff) { float x, y, z, o; me->GetHomePosition(x, y, z, o); if (!me->IsWithinDist3d(x, y, z, 60)) { EnterEvadeMode(); return; } check_Timer = 1000; } else check_Timer -= diff; // Spore Striders if (IsHeroic() && SporeStriders_Timer <= diff) { DoCast(me, SPELL_SUMMON_SPORE_STRIDER); SporeStriders_Timer = 10000+rand()%5000; } else SporeStriders_Timer -= diff; // Levitate if (LevitatedTarget) { if (LevitatedTarget_Timer <= diff) { if (Unit *pTarget = Unit::GetUnit(*me, LevitatedTarget)) { if (!pTarget->HasAura(SPELL_LEVITATE)) { LevitatedTarget = 0; return; } if (InAir) { pTarget->AddAura(SPELL_SUSPENSION, pTarget); LevitatedTarget = 0; } else { pTarget->CastSpell(pTarget, SPELL_MAGNETIC_PULL, true); InAir = true; LevitatedTarget_Timer = 1500; } } else LevitatedTarget = 0; } else LevitatedTarget_Timer -= diff; } if (Levitate_Timer <= diff) { if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 1)) { DoCast(pTarget, SPELL_LEVITATE); LevitatedTarget = pTarget->GetGUID(); LevitatedTarget_Timer = 2000; InAir = false; } Levitate_Timer = 12000+rand()%3000; } else Levitate_Timer -= diff; // Chain Lightning if (ChainLightning_Timer <= diff) { if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(pTarget, SPELL_CHAIN_LIGHTNING); ChainLightning_Timer = 7000; } else ChainLightning_Timer -= diff; // Static Charge if (StaticCharge_Timer <= diff) { if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 30, true)) DoCast(pTarget, SPELL_STATIC_CHARGE); StaticCharge_Timer = 10000; } else StaticCharge_Timer -= diff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; if (phase == 1) { if (FrostAura_Timer < diff) { DoCast(m_creature->getVictim(),SPELL_FROST_AURA); FrostAura_Timer = 5000; }else FrostAura_Timer -= diff; if (LifeDrain_Timer < diff) { if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0)) DoCast(target, m_bIsRegularMode ? SPELL_LIFE_DRAIN : SPELL_LIFE_DRAIN_H); LifeDrain_Timer = 24000; }else LifeDrain_Timer -= diff; if (Blizzard_Timer < diff) { if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0)) DoCast(target,SPELL_BLIZZARD); Blizzard_Timer = 20000; }else Blizzard_Timer -= diff; // Cleave if (m_uiCleaveTimer < diff) { DoCast(m_creature->getVictim(), SPELL_CLEAVE); m_uiCleaveTimer = 7000 + rand()%3000; } else m_uiCleaveTimer -= diff; // Tail Sweep if (m_uiTailSweepTimer < diff) { DoCast(m_creature->getVictim(), m_bIsRegularMode ? SPELL_TAIL_LASH : SPELL_TAIL_LASH_H); m_uiTailSweepTimer = 15000 + rand()%5000; } else m_uiTailSweepTimer -= diff; if (m_creature->GetHealthPercent() > 10.0f) { if (Fly_Timer < diff) { phase = 2; m_creature->InterruptNonMeleeSpells(false); m_creature->StopMoving(); m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); m_creature->GetMotionMaster()->Clear(false); m_creature->GetMotionMaster()->MoveIdle(); m_creature->MonsterMove(SAPPHIRON_X, SAPPHIRON_Y, SAPPHIRON_Z + 20, 1); //DoCast(m_creature,11010); //m_creature->SetHover(true); //DoCast(m_creature,18430); Icebolt_Timer = 4000; Icebolt_Count = 0; landoff = false; }else Fly_Timer -= diff; } } if (phase == 2) { if (Icebolt_Timer < diff && Icebolt_Count < 5) { if (Icebolt_Count == 1 || Icebolt_Count == 3) if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0)) { DoCast(target, SPELL_ICEBOLT); targets.push_back(target); } ++Icebolt_Count; Icebolt_Timer = 4000; }else Icebolt_Timer -= diff; if (Icebolt_Count == 5 && !landoff) { if (FrostBreath_Timer < diff) { // apply immune ThreatList const& tList = m_creature->getThreatManager().getThreatList(); for (ThreatList::const_iterator iter = tList.begin();iter != tList.end(); ++iter) { Unit* pUnit = Unit::GetUnit((*m_creature), (*iter)->getUnitGuid()); if (pUnit && (pUnit->GetTypeId() == TYPEID_PLAYER) && pUnit->isAlive()) { if (!pUnit->HasAura(SPELL_ICEBOLT)) { for(std::vector<Unit*>::iterator itr = targets.begin(); itr!= targets.end(); ++itr) { if (*itr) { if(!(*itr)->isAlive()) return; if (pUnit->GetDistance2d(*itr) <= 5 && (*itr)->HasAura(SPELL_ICEBOLT)) pUnit->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true); } } } } } DoScriptText(EMOTE_BREATH, m_creature); DoCast(m_creature->getVictim(),m_bIsRegularMode ? SPELL_FROST_BREATH : SPELL_FROST_BREATH_H); land_Timer = 2000; landoff = true; FrostBreath_Timer = 6000; }else FrostBreath_Timer -= diff; } if (landoff) { if (land_Timer < diff) { phase = 1; m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LAND); //m_creature->SetHover(false); //m_creature->GetMotionMaster()->Clear(false); //m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); ThreatList const& tList = m_creature->getThreatManager().getThreatList(); for (ThreatList::const_iterator iter = tList.begin();iter != tList.end(); ++iter) { Unit* pUnit = Unit::GetUnit((*m_creature), (*iter)->getUnitGuid()); if (pUnit && (pUnit->GetTypeId() == TYPEID_PLAYER)) pUnit->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false); } targets.clear(); Fly_Timer = 67000; isAtGround = false; land_time = 3500; }else land_Timer -= diff; } } if(phase == 1 && isAtGround == false) { if(land_time < diff) { isAtGround = true; DoStartMovement(m_creature->getVictim()); }else land_time -=diff; } if (Beserk_Timer < diff) { DoScriptText(EMOTE_ENRAGE, m_creature); DoCast(m_creature,SPELL_BESERK); Beserk_Timer = 900000; }else Beserk_Timer -= diff; if (phase!=2 && isAtGround == true) DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { //Return since we have no target if (!UpdateVictim() ) return; DoSpecialThings(diff, DO_EVERYTHING, 135.0f); //Earthquake_Timer if (Earthquake_Timer < diff) { if (!Earthquake) { AddSpellToCastWithScriptText(SPELL_EARTHQUAKE, CAST_NULL, EMOTE_EARTHQUAKE); Earthquake = true; Earthquake_Timer = 10000; } else { DoScriptText(RAND(SAY_SUMMON1, SAY_SUMMON2), m_creature); for (uint8 i = 0; i < 10; ++i) { Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0); Creature* Murloc = m_creature->SummonCreature(MurlocCords[i][0], MurlocCords[i][1], MurlocCords[i][2], MurlocCords[i][3], MurlocCords[i][4], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); if (target && Murloc) { Murloc->setActive(true); Murloc->AI()->AttackStart(target); } } Earthquake = false; Earthquake_Timer = urand(40000, 45000); } } else Earthquake_Timer -= diff; //TidalWave_Timer if (TidalWave_Timer < diff) { AddSpellToCast(SPELL_TIDAL_WAVE, CAST_NULL); TidalWave_Timer = 20000; } else TidalWave_Timer -= diff; if (!Phase2) { //WateryGrave_Timer if (WateryGrave_Timer < diff) { //Teleport 4 players under the waterfalls std::list<Unit*> tmpList; SelectUnitList(tmpList, 4, SELECT_TARGET_RANDOM, 200.0f, true, me->getVictimGUID()); int i = 0; for (std::list<Unit*>::const_iterator itr = tmpList.begin(); itr != tmpList.end(); ++itr) me->CastSpell(*itr, wateryGraves[i++], true); DoScriptText(RAND(SAY_SUMMON_BUBL1, SAY_SUMMON_BUBL2), m_creature); DoScriptText(EMOTE_WATERY_GRAVE, m_creature); WateryGrave_Timer = 30000; } else WateryGrave_Timer -= diff; //Start Phase2 if (HealthBelowPct(25)) Phase2 = true; } else { //WateryGlobules_Timer if (WateryGlobules_Timer < diff) { std::list<Unit*> tmpList; SelectUnitList(tmpList, 4, SELECT_TARGET_RANDOM, 200.0f, true, me->getVictimGUID()); int i = 0; for (std::list<Unit*>::const_iterator itr = tmpList.begin(); itr != tmpList.end(); ++itr) (*itr)->CastSpell((*itr), summonGlobules[i++], true); DoScriptText(EMOTE_WATERY_GLOBULES, m_creature); WateryGlobules_Timer = 25000; } else WateryGlobules_Timer -= diff; } CastNextSpellIfAnyAndReady(); DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; if (AppearDelay) { m_creature->StopMoving(); m_creature->AttackStop(); if (AppearDelay_Timer < diff) { AppearDelay = false; if (Phase == 2) { m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); m_creature->SetVisibility(VISIBILITY_OFF); } AppearDelay_Timer = 2000; }else AppearDelay_Timer -= diff; } if (Phase == 1) { //ArcaneMissiles_Timer if (ArcaneMissiles_Timer < diff) { //Solarian casts Arcane Missiles on on random targets in the raid. Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0); if (target && !m_creature->HasInArc(2.5f, target)) target = m_creature->getVictim(); if (target) DoCast(target, SPELL_ARCANE_MISSILES); ArcaneMissiles_Timer = 3000; }else ArcaneMissiles_Timer -= diff; //Wrath of the Astromancer targets a random player which will explode after 6 secondes if (m_uiWrathOfTheAstromancer_Timer < diff) { m_creature->InterruptNonMeleeSpells(false); //Target the tank ? if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 1)) { if (pTarget->GetTypeId() == TYPEID_PLAYER) { DoCast(pTarget, SPELL_WRATH_OF_THE_ASTROMANCER); m_uiWrathOfTheAstromancer_Timer = 25000; } else m_uiWrathOfTheAstromancer_Timer = 1000; } }else m_uiWrathOfTheAstromancer_Timer -= diff; //BlindingLight_Timer if (BlindingLight_Timer < diff) { //She casts this spell every 45 seconds. It is a kind of Moonfire spell, which she strikes down on the whole raid simultaneously. It hits everyone in the raid for 2280 to 2520 arcane damage. DoCast(m_creature->getVictim(), SPELL_BLINDING_LIGHT); BlindingLight_Timer = 45000; }else BlindingLight_Timer -= diff; //Phase1_Timer if (Phase1_Timer < diff) { Phase = 2; Phase1_Timer = 50000; //After these 50 seconds she portals to the middle of the room and disappears, leaving 3 light portals behind. m_creature->GetMotionMaster()->Clear(); m_creature->GetMap()->CreatureRelocation(m_creature, CENTER_X, CENTER_Y, CENTER_Z, CENTER_O); for(int i = 0; i <= 2; ++i) { if (!i) { Portals[i][0] = Portal_X(SMALL_PORTAL_RADIUS); Portals[i][1] = Portal_Y(Portals[i][0], SMALL_PORTAL_RADIUS); Portals[i][2] = CENTER_Z; } else { Portals[i][0] = Portal_X(LARGE_PORTAL_RADIUS); Portals[i][1] = Portal_Y(Portals[i][0], LARGE_PORTAL_RADIUS); Portals[i][2] = PORTAL_Z; } } if ((abs(int(Portals[2][0]) - int(Portals[1][0])) < 7) && (abs(int(Portals[2][1]) - int(Portals[1][1])) < 7)) { int i = 1; if (abs(int(CENTER_X) + int(26.0f) - int(Portals[2][0])) < 7) i = -1; Portals[2][0] = Portals[2][0]+7*i; Portals[2][1] = Portal_Y(Portals[2][0], LARGE_PORTAL_RADIUS); } for (int i = 0; i <= 2; ++i) { if (Creature* Summoned = m_creature->SummonCreature(NPC_ASTROMANCER_SOLARIAN_SPOTLIGHT, Portals[i][0], Portals[i][1], Portals[i][2], CENTER_O, TEMPSUMMON_TIMED_DESPAWN, Phase2_Timer+Phase3_Timer+AppearDelay_Timer+1700)) { Summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); Summoned->CastSpell(Summoned, SPELL_SPOTLIGHT, false); } } AppearDelay = true; }else Phase1_Timer -= diff; } else if (Phase == 2) { m_creature->AttackStop(); m_creature->StopMoving(); //Check Phase2_Timer if (Phase2_Timer < diff) { //10 seconds after Solarian disappears, 12 mobs spawn out of the three portals. Phase = 3; for (int i = 0; i <= 2; ++i) { for (int j = 1; j <= 4; ++j) SummonMinion(NPC_SOLARIUM_AGENT, Portals[i][0], Portals[i][1], Portals[i][2]); } DoScriptText(SAY_SUMMON1, m_creature); Phase2_Timer = 10000; } else Phase2_Timer -= diff; } else if (Phase == 3) { m_creature->AttackStop(); m_creature->StopMoving(); //Check Phase3_Timer if (Phase3_Timer < diff) { Phase = 1; //15 seconds later Solarian reappears out of one of the 3 portals. Simultaneously, 2 healers appear in the two other portals. int i = irand(0, 2); m_creature->GetMotionMaster()->Clear(); m_creature->GetMap()->CreatureRelocation(m_creature, Portals[i][0], Portals[i][1], Portals[i][2], CENTER_O); for (int j = 0; j <= 2; ++j) if (j != i) SummonMinion(NPC_SOLARIUM_PRIEST, Portals[j][0], Portals[j][1], Portals[j][2]); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); m_creature->SetVisibility(VISIBILITY_ON); DoScriptText(SAY_SUMMON2, m_creature); AppearDelay = true; Phase3_Timer = 15000; }else Phase3_Timer -= diff; } else if (Phase == 4) { //Fear_Timer if (Fear_Timer < diff) { DoCast(m_creature, SPELL_FEAR); Fear_Timer = 20000; }else Fear_Timer -= diff; //VoidBolt_Timer if (VoidBolt_Timer < diff) { DoCast(m_creature->getVictim(), SPELL_VOID_BOLT); VoidBolt_Timer = 10000; }else VoidBolt_Timer -= diff; } //When Solarian reaches 20% she will transform into a huge void walker. if (Phase != 4 && ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth())<20)) { Phase = 4; //To make sure she wont be invisible or not selecatble m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); m_creature->SetVisibility(VISIBILITY_ON); DoScriptText(SAY_VOIDA, m_creature); DoScriptText(SAY_VOIDB, m_creature); m_creature->SetArmor(WV_ARMOR); m_creature->SetDisplayId(MODEL_VOIDWALKER); m_creature->SetFloatValue(OBJECT_FIELD_SCALE_X, defaultsize*2.5f); } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; //BrainWashTotem_Timer if (BrainWashTotem_Timer <= diff) { DoCast(me, SPELL_BRAINWASHTOTEM); BrainWashTotem_Timer = 18000 + rand()%8000; } else BrainWashTotem_Timer -= diff; //HealingWard_Timer if (HealingWard_Timer <= diff) { //DoCast(me, SPELL_POWERFULLHEALINGWARD); me->SummonCreature(14987, me->GetPositionX()+3, me->GetPositionY()-2, me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 30000); HealingWard_Timer = 14000 + rand()%6000; } else HealingWard_Timer -= diff; //Hex_Timer if (Hex_Timer <= diff) { DoCast(me->getVictim(), SPELL_HEX); if (DoGetThreat(me->getVictim())) DoModifyThreatPercent(me->getVictim(), -80); Hex_Timer = 12000 + rand()%8000; } else Hex_Timer -= diff; //Casting the delusion curse with a shade. So shade will attack the same target with the curse. if (Delusions_Timer <= diff) { if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) { DoCast(pTarget, SPELL_DELUSIONSOFJINDO); Creature *Shade = me->SummonCreature(14986, pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Shade) Shade->AI()->AttackStart(pTarget); } Delusions_Timer = 4000 + rand()%8000; } else Delusions_Timer -= diff; //Teleporting a random gamer and spawning 9 skeletons that will attack this gamer if (Teleport_Timer <= diff) { Unit *pTarget = NULL; pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0); if (pTarget && pTarget->GetTypeId() == TYPEID_PLAYER) { DoTeleportPlayer(pTarget, -11583.7783f, -1249.4278f, 77.5471f, 4.745f); if (DoGetThreat(me->getVictim())) DoModifyThreatPercent(pTarget, -100); Creature *Skeletons; Skeletons = me->SummonCreature(14826, pTarget->GetPositionX()+2, pTarget->GetPositionY(), pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Skeletons) Skeletons->AI()->AttackStart(pTarget); Skeletons = me->SummonCreature(14826, pTarget->GetPositionX()-2, pTarget->GetPositionY(), pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Skeletons) Skeletons->AI()->AttackStart(pTarget); Skeletons = me->SummonCreature(14826, pTarget->GetPositionX()+4, pTarget->GetPositionY(), pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Skeletons) Skeletons->AI()->AttackStart(pTarget); Skeletons = me->SummonCreature(14826, pTarget->GetPositionX()-4, pTarget->GetPositionY(), pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Skeletons) Skeletons->AI()->AttackStart(pTarget); Skeletons = me->SummonCreature(14826, pTarget->GetPositionX(), pTarget->GetPositionY()+2, pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Skeletons) Skeletons->AI()->AttackStart(pTarget); Skeletons = me->SummonCreature(14826, pTarget->GetPositionX(), pTarget->GetPositionY()-2, pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Skeletons) Skeletons->AI()->AttackStart(pTarget); Skeletons = me->SummonCreature(14826, pTarget->GetPositionX(), pTarget->GetPositionY()+4, pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Skeletons) Skeletons->AI()->AttackStart(pTarget); Skeletons = me->SummonCreature(14826, pTarget->GetPositionX(), pTarget->GetPositionY()-4, pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Skeletons) Skeletons->AI()->AttackStart(pTarget); Skeletons = me->SummonCreature(14826, pTarget->GetPositionX()+3, pTarget->GetPositionY(), pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Skeletons) Skeletons->AI()->AttackStart(pTarget); } Teleport_Timer = 15000 + rand()%8000; } else Teleport_Timer -= diff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (IsEvent) { //Must update npc_escortAI npc_escortAI::UpdateAI(diff); if(!go) { go = true; if(pInstance) { ((npc_escortAI*)(m_creature->AI()))->AddWaypoint(0, 5492.91, -2404.61, 1462.63); ((npc_escortAI*)(m_creature->AI()))->AddWaypoint(1, 5531.76, -2460.87, 1469.55); ((npc_escortAI*)(m_creature->AI()))->AddWaypoint(2, 5554.58, -2514.66, 1476.12); ((npc_escortAI*)(m_creature->AI()))->AddWaypoint(3, 5554.16, -2567.23, 1479.90); ((npc_escortAI*)(m_creature->AI()))->AddWaypoint(4, 5540.67, -2625.99, 1480.89); ((npc_escortAI*)(m_creature->AI()))->AddWaypoint(5, 5508.16, -2659.2, 1480.15); ((npc_escortAI*)(m_creature->AI()))->AddWaypoint(6, 5489.62, -2704.05, 1482.18); ((npc_escortAI*)(m_creature->AI()))->AddWaypoint(7, 5457.04, -2726.26, 1485.10); ((npc_escortAI*)(m_creature->AI()))->Start(false, true, true); ((npc_escortAI*)(m_creature->AI()))->SetDespawnAtEnd(false); } } } //Return since we have no target if (!UpdateVictim() ) return; if(RainTimer < diff) { DoCast(SelectUnit(SELECT_TARGET_RANDOM,0,30,true), SPELL_RAIN_OF_FIRE); RainTimer = 20000+rand()%15000; }else RainTimer -= diff; if(DoomTimer < diff) { DoCast(SelectUnit(SELECT_TARGET_RANDOM,1,100,true), SPELL_DOOM);//never on tank DoomTimer = 45000+rand()%5000; }else DoomTimer -= diff; if(HowlTimer < diff) { DoCast(m_creature, SPELL_HOWL_OF_AZGALOR); HowlTimer = 30000; }else HowlTimer -= diff; if(CleaveTimer < diff) { DoCast(m_creature->getVictim(), SPELL_CLEAVE); CleaveTimer = 10000+rand()%5000; }else CleaveTimer -= diff; if(EnrageTimer < diff && !enraged) { m_creature->InterruptNonMeleeSpells(false); DoCast(m_creature, SPELL_BERSERK, true); enraged = true; EnrageTimer = 600000; }else EnrageTimer -= diff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; boss_priestess_lackey_commonAI::UpdateAI(diff); if (Polymorph_Timer <= diff) { if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) { DoCast(pTarget, SPELL_POLYMORPH); Polymorph_Timer = 20000; } } else Polymorph_Timer -= diff; if (((me->GetHealth()*100 / me->GetMaxHealth()) < 35) && !HasIceBlocked) { DoCast(me, SPELL_ICE_BLOCK); HasIceBlocked = true; } if (Blizzard_Timer <= diff) { if (Unit* pUnit = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(pUnit, SPELL_BLIZZARD); Blizzard_Timer = 8000; } else Blizzard_Timer -= diff; if (Ice_Lance_Timer <= diff) { DoCast(me->getVictim(), SPELL_ICE_LANCE); Ice_Lance_Timer = 12000; } else Ice_Lance_Timer -= diff; if (Cone_of_Cold_Timer <= diff) { DoCast(me->getVictim(), SPELL_CONE_OF_COLD); Cone_of_Cold_Timer = 10000; } else Cone_of_Cold_Timer -= diff; if (Frostbolt_Timer <= diff) { DoCast(me->getVictim(), SPELL_FROSTBOLT); Frostbolt_Timer = 8000; } else Frostbolt_Timer -= diff; if (Blink_Timer <= diff) { bool InMeleeRange = false; std::list<HostileReference*>& t_list = me->getThreatManager().getThreatList(); for (std::list<HostileReference*>::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr) { if (Unit *pTarget = Unit::GetUnit(*me, (*itr)->getUnitGuid())) { //if in melee range if (pTarget->IsWithinDistInMap(me, 5)) { InMeleeRange = true; break; } } } //if anybody is in melee range than escape by blink if (InMeleeRange) DoCast(me, SPELL_BLINK); Blink_Timer = 8000; } else Blink_Timer -= diff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; if (HealthAbovePct(50)) { if (Dispell_Timer <= diff) { DoCast(me, SPELL_DISPELL); Dispell_Timer = 15000 + rand()%15000; } else Dispell_Timer -= diff; if (Renew_Timer <= diff) { DoCast(me, SPELL_RENEW); Renew_Timer = 20000 + rand()%10000; } else Renew_Timer -= diff; if (HolyWrath_Timer <= diff) { DoCast(me->getVictim(), SPELL_HOLY_WRATH); HolyWrath_Timer = 15000 + rand()%10000; } else HolyWrath_Timer -= diff; if (HolyNova_Timer <= diff) { TargetInRange = 0; for (uint8 i = 0; i < 10; ++i) { if (Unit *pTarget = SelectUnit(SELECT_TARGET_TOPAGGRO, i)) if (me->IsWithinMeleeRange(pTarget)) ++TargetInRange; } if (TargetInRange > 1) { DoCast(me->getVictim(), SPELL_HOLY_NOVA); HolyNova_Timer = 1000; } else { HolyNova_Timer = 2000; } } else HolyNova_Timer -= diff; if (HolyFire_Timer < diff && TargetInRange < 3) { if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(pTarget, SPELL_HOLY_FIRE); HolyFire_Timer = 8000; } else HolyFire_Timer -= diff; } else { if (!PhaseTwo) { DoScriptText(SAY_TRANSFORM, me); me->InterruptNonMeleeSpells(false); DoCast(me, SPELL_SNAKE_FORM); me->SetFloatValue(OBJECT_FIELD_SCALE_X, 2.00f); const CreatureInfo *cinfo = me->GetCreatureInfo(); me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 25))); me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 25))); me->UpdateDamagePhysical(BASE_ATTACK); DoResetThreat(); PhaseTwo = true; } if (PhaseTwo && PoisonCloud_Timer <= diff) { DoCast(me->getVictim(), SPELL_POISON_CLOUD); PoisonCloud_Timer = 15000; }PoisonCloud_Timer -=diff; if (PhaseTwo && VenomSpit_Timer <= diff) { if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(pTarget, SPELL_VENOMSPIT); VenomSpit_Timer = 15000 + rand()%5000; } else VenomSpit_Timer -= diff; if (PhaseTwo && HealthBelowPct(11)) { if (!InBerserk) { me->InterruptNonMeleeSpells(false); DoCast(me, SPELL_BERSERK); InBerserk = true; } } } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; if(event_inProgress) { if(SpawnResTimer) if(SpawnResTimer< diff) { DoCast(m_creature,SPELL_SUMMON_BANSHEE); // Summons direktly on caster position //DoCast(m_creature,SPELL_SCOURG_RESURRECTION_EFFEKTSPAWN); // Dont needet ? SpawnResTimer = 0; }else SpawnResTimer -= diff; return; } // This is used for a spell queue ... the spells should not castet if one spell is already casting if(wait_Timer) if(wait_Timer < diff) { wait_Timer = 0; }else wait_Timer -= diff; if(Cleave_Timer < diff) { if(!wait_Timer) { if(undead) DoCast(m_creature->getVictim(),HeroicMode ? H_SPELL_WOE_STRIKE : SPELL_WOE_STRIKE); else DoCast(m_creature->getVictim(),SPELL_CLEAVE); Cleave_Timer = rand()%5000 + 2000; wait_Timer = 1000; } }else Cleave_Timer -= diff; if(Smash_Timer < diff) { if(!wait_Timer) { if(undead) DoCast(m_creature->getVictim(), SPELL_DARK_SMASH); else DoCast(m_creature->getVictim(),HeroicMode ? H_SPELL_SMASH : SPELL_SMASH); Smash_Timer = 10000; wait_Timer = 5000; } }else Smash_Timer -= diff; if(!undead) { if(Enrage_Timer < diff) { DoCast(m_creature,HeroicMode ? H_SPELL_ENRAGE : SPELL_ENRAGE); Enrage_Timer = 10000; }else Enrage_Timer -= diff; }else // In Undead form used to summon weapon { if(Enrage_Timer < diff) { if(!wait_Timer) { // Spawn target for Axe Unit* target = SelectUnit(SELECT_TARGET_TOPAGGRO, 1); if(target) { Creature* temp = m_creature->SummonCreature(ENTRY_THROW_TARGET,target->GetPositionX(),target->GetPositionY(),target->GetPositionZ(),0,TEMPSUMMON_TIMED_DESPAWN,2000); DoCast(m_creature,SPELL_SHADOW_AXE_SUMMON); } Enrage_Timer = 30000; } }else Enrage_Timer -= diff; } if(Roar_Timer < diff) { if(!wait_Timer) { if(undead) DoCast(m_creature,HeroicMode ? H_SPELL_DREADFUL_ROAR : SPELL_DREADFUL_ROAR); else DoCast(m_creature,HeroicMode ? H_SPELL_STAGGERING_ROAR : SPELL_STAGGERING_ROAR); Roar_Timer = 10000; wait_Timer = 5000; } }else Roar_Timer -= diff; DoMeleeAttackIfReady(); }