/* Copyright (C) 2006 - 2008 ScriptDev2 * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* ScriptData SDName: Boss_moroes SD%Complete: 100 SDComment: EndScriptData */ #include "def_karazhan.h" #include "TargetedMovementGenerator.h" #include "IdleMovementGenerator.h" #define SAY_AGGRO "Hmm, unannounced visitors? Preparations must be made." #define SOUND_AGGRO 9211 #define SAY_SPECIAL_1 "Now, where was I? Oh yes..." #define SOUND_SPECIAL_1 9215 #define SAY_SPECIAL_2 "You rang?" #define SOUND_SPECIAL_2 9316 #define SAY_KILL_1 "One more for dinner this evening" #define SOUND_KILL_1 9214 #define SAY_KILL_2 "Time... Never enough time." #define SOUND_KILL_2 9314 #define SAY_KILL_3 "I've gone and made a mess." #define SOUND_KILL_3 9315 #define SAY_DEATH "How terribly clumsy of me..." #define SOUND_DEATH 9213 #define SPELL_VANISH 24699 #define SPELL_GARROTE 37066 #define SPELL_BLIND 34654 #define SPELL_GOUGE 28456 #define SPELL_ENRAGE 37023 #define ORIENT 4.5784 #define POS_Z 81.73 float Locations[4][2]= { {-10976.2793, -1878.1736}, {-10979.7587, -1877.8706}, {-10985.6650, -1877.2458}, {-10989.1367, -1876.8309}, }; uint32 Adds[6] = {19875, 19874, 19872, 17007, 19876, 19873}; struct MANGOS_DLL_DECL boss_moroesAI : public ScriptedAI { boss_moroesAI(Creature *c) : ScriptedAI(c) { FirstTime = true; pInstance = ((ScriptedInstance*)c->GetInstanceData()); Reset(); } ScriptedInstance *pInstance; uint32 Vanish_Timer; uint32 Blind_Timer; uint32 Gouge_Timer; uint32 Wait_Timer; uint32 CheckAdds_Timer; uint64 AddGuid[4]; uint32 AddType[4]; bool InVanish; bool Enrage; bool FirstTime; void Reset() { Vanish_Timer = 30000; Blind_Timer = 35000; Gouge_Timer = 23000; Wait_Timer = 0; CheckAdds_Timer = 5000; Enrage = false; InVanish = false; DeSpawnAdds(); SpawnAdds(); m_creature->setFaction(16); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); if (pInstance) pInstance->SetData(DATA_MOROES_EVENT, 0); } void StartEvent() { if (!pInstance) return; DoYell(SAY_AGGRO, LANG_UNIVERSAL, NULL); DoPlaySoundToSet(m_creature, SOUND_AGGRO); if (pInstance) pInstance->SetData(DATA_MOROES_EVENT, 1); } void Aggro(Unit *who) { StartEvent(); DoYell(SAY_AGGRO, LANG_UNIVERSAL, NULL); DoPlaySoundToSet(m_creature, SOUND_AGGRO); InCombat = true; AddsAttack(); } void KilledUnit(Unit *victim) { switch (rand()%3) { case 0: DoYell(SAY_KILL_1, LANG_UNIVERSAL, NULL); DoPlaySoundToSet(victim, SOUND_KILL_1); break; case 1: DoYell(SAY_KILL_2, LANG_UNIVERSAL, NULL); DoPlaySoundToSet(victim, SOUND_KILL_2); break; case 2: DoYell(SAY_KILL_3, LANG_UNIVERSAL, NULL); DoPlaySoundToSet(victim, SOUND_KILL_3); break; } } void JustDied(Unit *victim) { DoYell(SAY_DEATH, LANG_UNIVERSAL, NULL); DoPlaySoundToSet(NULL, SOUND_DEATH); if (pInstance) pInstance->SetData(DATA_MOROES_EVENT, 0); DeSpawnAdds(); } bool isAddIsDeadOrDespawned(uint64 CreatureGuid) { if (CreatureGuid) { Unit *Temp; Temp = Unit::GetUnit((*m_creature),CreatureGuid); if (Temp && Temp->isAlive()) return false; } return true; } void SpawnAdds() { std::list AddList; for(uint8 i = 0; i < 6; ++i) AddList.push_back(Adds[i]); uint32 entry = rand()%6; Unit *pCreature = NULL; if(FirstTime) { if(AddList.empty()) { // Debug DoTextEmote(": Add List is empty", NULL); EnterEvadeMode(); return; } for(uint8 i = 0; i < 4; ++i) { uint32 entry = *(AddList.begin()) + rand()%(AddList.size()); char debug[400]; sprintf(debug, "Selecting add entry %d", entry); DoTextEmote(debug, NULL); AddList.remove(entry); pCreature = m_creature->SummonCreature(Adds[entry], Locations[i][0], Locations[i][1], POS_Z, ORIENT, TEMPSUMMON_CORPSE_DESPAWN, 60000); if(pCreature) AddGuid[i] = pCreature->GetGUID(); } } /*if (FirstTime) { pCreature = m_creature->SummonCreature(Adds[i], SPAWN1_X, SPAWN1_Y, SPAWN1_Z, ORIENT, TEMPSUMMON_CORPSE_DESPAWN, 60000); if (pCreature) AddGuid[0] = pCreature->GetGUID(); AddType[0] = Adds[i]; i1 = i; while (i == i1) { i = rand()%6; } pCreature = m_creature->SummonCreature(Adds[i], SPAWN2_X, SPAWN2_Y, SPAWN2_Z, ORIENT, TEMPSUMMON_CORPSE_DESPAWN, 60000); if (pCreature) AddGuid[1] = pCreature->GetGUID(); AddType[1] = Adds[i]; i2 = i; while (i == i1 || i == i2) { i = rand()%6; } pCreature = m_creature->SummonCreature(Adds[i], SPAWN3_X, SPAWN3_Y, SPAWN3_Z, ORIENT, TEMPSUMMON_CORPSE_DESPAWN, 60000); if (pCreature) AddGuid[2] = pCreature->GetGUID(); AddType[2] = Adds[i]; i3 = i; while (i == i1 || i == i2 || i == i3) { i = rand()%6; } pCreature = m_creature->SummonCreature(Adds[i], SPAWN4_X, SPAWN4_Y, SPAWN4_Z, ORIENT, TEMPSUMMON_CORPSE_DESPAWN, 60000); if (pCreature) AddGuid[3] = pCreature->GetGUID(); AddType[3] = Adds[i]; FirstTime = false; }*/ else { for(uint8 i = 0; i < 4; ++i) { if(isAddIsDeadOrDespawned(AddGuid[i])) { pCreature = m_creature->SummonCreature(AddType[i], Locations[i][0], Locations[i][1], POS_Z, 0, TEMPSUMMON_CORPSE_DESPAWN, 60000); if(pCreature) AddGuid[i] = pCreature->GetGUID(); } } } } void DeSpawnAdds() { for(uint8 i = 0; i < 4 ; ++i) { Unit *Temp = NULL; if(AddGuid[i]) { Temp = Unit::GetUnit((*m_creature),AddGuid[i]); if(Temp && Temp->isAlive()) Temp->DealDamage(Temp, Temp->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); } } } void AddsAttack() { if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() > 99) { for (uint8 i = 0; i < 4; ++i) { Unit *Temp = NULL; if (AddGuid[i]) { Temp = Unit::GetUnit((*m_creature),AddGuid[i]); if(Temp && Temp->isAlive()) ((Creature*)Temp)->AI()->AttackStart(m_creature->getVictim()); else EnterEvadeMode(); } } } } void UpdateAI(const uint32 diff) { if (!m_creature->SelectHostilTarget() || !m_creature->getVictim() ) return; if (pInstance && !pInstance->GetData(DATA_MOROES_EVENT)) EnterEvadeMode(); if (!Enrage && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 30) { DoCast(m_creature, SPELL_ENRAGE); Enrage = true; } if (CheckAdds_Timer < diff) { for (uint8 i = 0; i < 4; ++i) { Unit *Temp = NULL; if (AddGuid[i]) { Temp = Unit::GetUnit((*m_creature),AddGuid[i]); if (Temp && Temp->isAlive()) if (!Temp->SelectHostilTarget() || !Temp->getVictim() ) ((Creature*)Temp)->AI()->AttackStart(m_creature->getVictim()); } } CheckAdds_Timer = 5000; }else CheckAdds_Timer -= diff; //Cast Vanish, then Garrote random victim if (Vanish_Timer < diff) { m_creature->setFaction(35); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); DoCast(m_creature, SPELL_VANISH); InVanish = true; Vanish_Timer = 30000; Wait_Timer = 5000; }else Vanish_Timer -= diff; if(InVanish) { if (Wait_Timer < diff) { Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 0); if (target) target->CastSpell(target, SPELL_GARROTE,true); m_creature->setFaction(14); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); m_creature->AI()->AttackStart(m_creature->getVictim()); InVanish = false; }else Wait_Timer -= diff; } //Blind highest aggro, and attack second highest if (Gouge_Timer < diff) { DoCast(m_creature->getVictim(), SPELL_GOUGE); Unit *target = SelectUnit(SELECT_TARGET_TOPAGGRO, 0); if (target) m_creature->getThreatManager().modifyThreatPercent(target,-99); Gouge_Timer = 40000; }else Gouge_Timer -= diff; if (Blind_Timer < diff) { Unit *target; std::list t_list = m_creature->getThreatManager().getThreatList(); std::vector target_list; for (std::list::iterator itr = t_list.begin(); itr!= t_list.end(); ++itr) { target = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid()); if (target && target->GetDistance2dSq(m_creature) < 25) target_list.push_back(target); target = NULL; } if (target_list.size()) target = *(target_list.begin()+rand()%target_list.size()); DoCast(target, SPELL_BLIND); Blind_Timer = 40000; }else Blind_Timer -= diff; if (!InVanish) DoMeleeAttackIfReady(); } }; #define SPELL_MANABURN 29405 #define SPELL_MINDFLY 29570 #define SPELL_SWPAIN 34441 #define SPELL_SHADOWFORM 29406 struct MANGOS_DLL_DECL boss_baroness_dorothea_millstipeAI : public ScriptedAI { //Shadow Priest boss_baroness_dorothea_millstipeAI(Creature *c) : ScriptedAI(c) { pInstance = ((ScriptedInstance*)c->GetInstanceData()); Reset(); } ScriptedInstance *pInstance; uint32 ManaBurn_Timer; uint32 MindFlay_Timer; uint32 ShadowWordPain_Timer; bool InCombat; void Reset() { ManaBurn_Timer = 7000; MindFlay_Timer = 1000; ShadowWordPain_Timer = 6000; InCombat = false; if (pInstance) pInstance->SetData(DATA_MOROES_EVENT, 0); DoCast(m_creature,SPELL_SHADOWFORM); // It can be added in creature_addon table } void Aggro(Unit *who) { } void UpdateAI(const uint32 diff) { if (!m_creature->SelectHostilTarget() || !m_creature->getVictim() ) return; if (pInstance && !pInstance->GetData(DATA_MOROES_EVENT)) EnterEvadeMode(); if (MindFlay_Timer < diff) { DoCast(m_creature->getVictim(),SPELL_MINDFLY); MindFlay_Timer = 12000; //3sec channeled }else MindFlay_Timer -= diff; if (ManaBurn_Timer < diff) { Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 0); if (target && (target->getPowerType() == POWER_MANA)) DoCast(target,SPELL_MANABURN); ManaBurn_Timer = 5000; //3 sec cast }else ManaBurn_Timer -= diff; if (ShadowWordPain_Timer < diff) { Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 0); if (target) DoCast(target,SPELL_SWPAIN); ShadowWordPain_Timer = 7000; }else ShadowWordPain_Timer -= diff; DoMeleeAttackIfReady(); } }; #define SPELL_HAMMEROFJUSTICE 13005 #define SPELL_JUDGEMENTOFCOMMAND 29386 #define SPELL_SEALOFCOMMAND 29385 struct MANGOS_DLL_DECL boss_baron_rafe_dreugerAI : public ScriptedAI { //Retr Pally boss_baron_rafe_dreugerAI(Creature *c) : ScriptedAI(c) { pInstance = ((ScriptedInstance*)c->GetInstanceData()); Reset(); } ScriptedInstance *pInstance; uint32 HammerOfJustice_Timer; uint32 SealOfCommand_Timer; uint32 JudgementOfCommand_Timer; bool InCombat; void Reset() { HammerOfJustice_Timer = 1000; SealOfCommand_Timer = 7000; JudgementOfCommand_Timer = SealOfCommand_Timer + 29000;; if (pInstance) pInstance->SetData(DATA_MOROES_EVENT, 0); } void Aggro(Unit *who) { } void UpdateAI(const uint32 diff) { if (!m_creature->SelectHostilTarget() || !m_creature->getVictim() ) return; if (pInstance && !pInstance->GetData(DATA_MOROES_EVENT)) EnterEvadeMode(); if (SealOfCommand_Timer < diff) { DoCast(m_creature,SPELL_SEALOFCOMMAND); SealOfCommand_Timer = 32000; JudgementOfCommand_Timer = 29000; }else SealOfCommand_Timer -= diff; if (JudgementOfCommand_Timer < diff) { DoCast(m_creature->getVictim(),SPELL_JUDGEMENTOFCOMMAND); JudgementOfCommand_Timer = SealOfCommand_Timer + 29000; }else JudgementOfCommand_Timer -= diff; if (HammerOfJustice_Timer < diff) { DoCast(m_creature->getVictim(),SPELL_HAMMEROFJUSTICE); HammerOfJustice_Timer = 12000; }else HammerOfJustice_Timer -= diff; DoMeleeAttackIfReady(); } }; #define SPELL_DISPELMAGIC 15090 //Self or other guest+Moroes #define SPELL_GREATERHEAL 29564 //Self or other guest+Moroes #define SPELL_HOLYFIRE 29563 #define SPELL_PWSHIELD 29408 struct MANGOS_DLL_DECL boss_lady_catriona_von_indiAI : public ScriptedAI { //Holy Priest boss_lady_catriona_von_indiAI(Creature *c) : ScriptedAI(c) { for (uint8 i = 0; i < 5; ++i) AllGuestGuid[i] = 0; pInstance = (ScriptedInstance*)c->GetInstanceData(); Reset(); } ScriptedInstance *pInstance; uint64 AllGuestGuid[5]; uint32 DispelMagic_Timer; uint32 GreaterHeal_Timer; uint32 HolyFire_Timer; uint32 PowerWordShield_Timer; void Reset() { DispelMagic_Timer = 11000; GreaterHeal_Timer = 1500; HolyFire_Timer = 5000; PowerWordShield_Timer = 1000; FillAllGuestGuid(); if (pInstance) pInstance->SetData(DATA_MOROES_EVENT, 0); } void Aggro(Unit *who) { } void FillAllGuestGuid() { if (pInstance) { AllGuestGuid[0] = pInstance->GetData64(DATA_MOROES); Creature *pMoroes = (Creature *)Unit::GetUnit((*m_creature), AllGuestGuid[0]); if (pMoroes) for (uint8 i = 0; i < 5; ++i) AllGuestGuid[i] = ((boss_moroesAI*)pMoroes->AI())->AddGuid[i]; } } void UpdateAI(const uint32 diff) { if (!m_creature->SelectHostilTarget() || !m_creature->getVictim() ) return; if (pInstance && !pInstance->GetData(DATA_MOROES_EVENT)) EnterEvadeMode(); if (PowerWordShield_Timer < diff) { DoCast(m_creature,SPELL_PWSHIELD); PowerWordShield_Timer = 15000; }else PowerWordShield_Timer -= diff; if (GreaterHeal_Timer < diff) { Unit *Temp = NULL; uint64 TempGuid = AllGuestGuid[rand()%6]; if (TempGuid && TempGuid != m_creature->GetGUID()) { Temp = Unit::GetUnit((*m_creature),TempGuid); if (Temp && Temp->isAlive()) DoCast(Temp,SPELL_GREATERHEAL); else DoCast(m_creature,SPELL_GREATERHEAL); } else DoCast(m_creature,SPELL_GREATERHEAL); GreaterHeal_Timer = 17000; }else GreaterHeal_Timer -= diff; if (HolyFire_Timer < diff) { DoCast(m_creature->getVictim(),SPELL_HOLYFIRE); HolyFire_Timer = 22000; }else HolyFire_Timer -= diff; if (DispelMagic_Timer < diff) { Unit *Temp; uint64 TempGuid = AllGuestGuid[rand()%6]; if (rand()%2) { if (TempGuid && TempGuid != m_creature->GetGUID()) { Temp = Unit::GetUnit((*m_creature),TempGuid); if (Temp && Temp->isAlive() && m_creature->IsWithinLOSInMap(Temp)) DoCast(Temp,SPELL_DISPELMAGIC); else DoCast(m_creature,SPELL_DISPELMAGIC); } else DoCast(m_creature,SPELL_DISPELMAGIC); } else { Temp = SelectUnit(SELECT_TARGET_RANDOM, 0); if (Temp) DoCast(Temp,SPELL_DISPELMAGIC); } DispelMagic_Timer = 25000; }else DispelMagic_Timer -= diff; DoMeleeAttackIfReady(); } }; #define SPELL_CLEANSE 29380 //Self or other guest+Moroes #define SPELL_GREATERBLESSOFMIGHT 29381 //Self or other guest+Moroes #define SPELL_HOLYLIGHT 29562 //Self or other guest+Moroes #define SPELL_DIVINESHIELD 41367 struct MANGOS_DLL_DECL boss_lady_keira_berrybuckAI : public ScriptedAI { //Holy Pally boss_lady_keira_berrybuckAI(Creature *c) : ScriptedAI(c) { for (uint32 i = 0; i < 5; ++i) AllGuestGuid[i] = 0; pInstance = ((ScriptedInstance*)c->GetInstanceData()); Reset(); } ScriptedInstance *pInstance; uint64 AllGuestGuid[5]; uint32 Cleanse_Timer; uint32 GreaterBless_Timer; uint32 HolyLight_Timer; uint32 DivineShield_Timer; void Reset() { Cleanse_Timer = 13000; GreaterBless_Timer = 1000; HolyLight_Timer = 7000; DivineShield_Timer = 31000; FillAllGuestGuid(); if (pInstance) pInstance->SetData(DATA_MOROES_EVENT, 0); } void Aggro(Unit *who) { } void FillAllGuestGuid() { if (pInstance) { AllGuestGuid[0] = pInstance->GetData64(DATA_MOROES); Creature *pMoroes = (Creature *)Unit::GetUnit((*m_creature), AllGuestGuid[0]); if (pMoroes) for (uint32 i = 0; i < 5; ++i) AllGuestGuid[i] = ((boss_moroesAI*)pMoroes->AI())->AddGuid[i]; } } void UpdateAI(const uint32 diff) { if (!m_creature->SelectHostilTarget() || !m_creature->getVictim() ) return; if (pInstance && !pInstance->GetData(DATA_MOROES_EVENT)) EnterEvadeMode(); if (DivineShield_Timer < diff) { DoCast(m_creature,SPELL_DIVINESHIELD); DivineShield_Timer = 31000; }else DivineShield_Timer -= diff; if (HolyLight_Timer < diff) { Unit *Temp; uint64 TempGuid = AllGuestGuid[(rand()%6)]; if (TempGuid && TempGuid != m_creature->GetGUID()) { Temp = Unit::GetUnit((*m_creature),TempGuid); if (Temp && Temp->isAlive()) DoCast(Temp,SPELL_HOLYLIGHT); else DoCast(m_creature,SPELL_HOLYLIGHT); } else DoCast(m_creature,SPELL_HOLYLIGHT); HolyLight_Timer = 10000; }else HolyLight_Timer -= diff; if (GreaterBless_Timer < diff) { Unit *Temp; uint64 TempGuid = AllGuestGuid[rand()%6]; if (TempGuid && TempGuid != m_creature->GetGUID()) { Temp = Unit::GetUnit((*m_creature),TempGuid); if (Temp && Temp->isAlive()) DoCast(Temp,SPELL_GREATERBLESSOFMIGHT); else DoCast(m_creature,SPELL_GREATERBLESSOFMIGHT); } else DoCast(m_creature,SPELL_GREATERBLESSOFMIGHT); GreaterBless_Timer = 50000; }else GreaterBless_Timer -= diff; if (Cleanse_Timer < diff) { Unit *Temp; uint64 TempGuid = AllGuestGuid[rand()%6]; if (TempGuid && TempGuid != m_creature->GetGUID()) { Temp = Unit::GetUnit((*m_creature),TempGuid); if (Temp && Temp->isAlive() && m_creature->IsWithinLOSInMap(Temp)) DoCast(Temp,SPELL_CLEANSE); else DoCast(m_creature,SPELL_CLEANSE); } else DoCast(m_creature,SPELL_CLEANSE); Cleanse_Timer = 10000; }else Cleanse_Timer -= diff; DoMeleeAttackIfReady(); } }; #define SPELL_HAMSTRING 9080 #define SPELL_MORTALSTRIKE 29572 #define SPELL_WHIRLWIND 29573 struct MANGOS_DLL_DECL boss_lord_robin_darisAI : public ScriptedAI { //Arms Warr boss_lord_robin_darisAI(Creature *c) : ScriptedAI(c) { pInstance = ((ScriptedInstance*)c->GetInstanceData()); Reset(); } ScriptedInstance *pInstance; uint32 Hamstring_Timer; uint32 MortalStrike_Timer; uint32 WhirlWind_Timer; void Reset() { Hamstring_Timer = 7000; MortalStrike_Timer = 10000; WhirlWind_Timer = 21000; if (pInstance) pInstance->SetData(DATA_MOROES_EVENT, 0); } void Aggro(Unit *who) { return; } void UpdateAI(const uint32 diff) { if (!m_creature->SelectHostilTarget() || !m_creature->getVictim() ) return; if (pInstance && !pInstance->GetData(DATA_MOROES_EVENT)) EnterEvadeMode(); if (Hamstring_Timer < diff) { DoCast(m_creature->getVictim(),SPELL_HAMSTRING); Hamstring_Timer = 12000; }else Hamstring_Timer -= diff; if (MortalStrike_Timer < diff) { DoCast(m_creature->getVictim(), SPELL_MORTALSTRIKE); MortalStrike_Timer = 18000; }else MortalStrike_Timer -= diff; if (WhirlWind_Timer < diff) { DoCast(m_creature,SPELL_WHIRLWIND); WhirlWind_Timer = 21000; }else WhirlWind_Timer -= diff; DoMeleeAttackIfReady(); } }; #define SPELL_DISARM 8379 #define SPELL_HEROICSTRIKE 29567 #define SPELL_SHIELDBASH 11972 #define SPELL_SHIELDWALL 29390 struct MANGOS_DLL_DECL boss_lord_crispin_ferenceAI : public ScriptedAI { //Arms Warr boss_lord_crispin_ferenceAI(Creature *c) : ScriptedAI(c) { pInstance = ((ScriptedInstance*)c->GetInstanceData()); Reset(); } ScriptedInstance *pInstance; uint32 Disarm_Timer; uint32 HeroicStrike_Timer; uint32 ShieldBash_Timer; uint32 ShieldWall_Timer; void Reset() { Disarm_Timer = 6000; HeroicStrike_Timer = 10000; ShieldBash_Timer = 8000; ShieldWall_Timer = 4000; if (pInstance) pInstance->SetData(DATA_MOROES_EVENT, 0); } void Aggro(Unit *who) { } void UpdateAI(const uint32 diff) { if (!m_creature->SelectHostilTarget() || !m_creature->getVictim() ) return; if (pInstance && !pInstance->GetData(DATA_MOROES_EVENT)) EnterEvadeMode(); if (Disarm_Timer < diff) { DoCast(m_creature->getVictim(),SPELL_DISARM); Disarm_Timer = 12000; }else Disarm_Timer -= diff; if (HeroicStrike_Timer < diff) { DoCast(m_creature->getVictim(),SPELL_HEROICSTRIKE); HeroicStrike_Timer = 10000; }else HeroicStrike_Timer -= diff; if (ShieldBash_Timer < diff) { DoCast(m_creature->getVictim(),SPELL_SHIELDBASH); ShieldBash_Timer = 13000; }else ShieldBash_Timer -= diff; if (ShieldWall_Timer < diff) { DoCast(m_creature,SPELL_SHIELDWALL); ShieldWall_Timer = 21000; }else ShieldWall_Timer -= diff; DoMeleeAttackIfReady(); } }; CreatureAI* GetAI_boss_moroes(Creature *_Creature) { return new boss_moroesAI (_Creature); } CreatureAI* GetAI_baroness_dorothea_millstipe(Creature *_Creature) { return new boss_baroness_dorothea_millstipeAI (_Creature); } CreatureAI* GetAI_baron_rafe_dreuger(Creature *_Creature) { return new boss_baron_rafe_dreugerAI (_Creature); } CreatureAI* GetAI_lady_catriona_von_indi(Creature *_Creature) { return new boss_lady_catriona_von_indiAI (_Creature); } CreatureAI* GetAI_lady_keira_berrybuck(Creature *_Creature) { return new boss_lady_keira_berrybuckAI (_Creature); } CreatureAI* GetAI_lord_robin_daris(Creature *_Creature) { return new boss_lord_robin_darisAI (_Creature); } CreatureAI* GetAI_lord_crispin_ference(Creature *_Creature) { return new boss_lord_crispin_ferenceAI (_Creature); } void AddSC_boss_moroes() { Script *newscript; newscript = new Script; newscript->Name="boss_moroes"; newscript->GetAI = GetAI_boss_moroes; m_scripts[nrscripts++] = newscript; newscript = new Script; newscript->Name="baroness_dorothea_millstipe"; newscript->GetAI = GetAI_baroness_dorothea_millstipe; m_scripts[nrscripts++] = newscript; newscript = new Script; newscript->Name="baron_rafe_dreuger"; newscript->GetAI = GetAI_baron_rafe_dreuger; m_scripts[nrscripts++] = newscript; newscript = new Script; newscript->Name="lady_catriona_von_indi"; newscript->GetAI = GetAI_lady_catriona_von_indi; m_scripts[nrscripts++] = newscript; newscript = new Script; newscript->Name="lady_keira_berrybuck"; newscript->GetAI = GetAI_lady_keira_berrybuck; m_scripts[nrscripts++] = newscript; newscript = new Script; newscript->Name="lord_robin_daris"; newscript->GetAI = GetAI_lord_robin_daris; m_scripts[nrscripts++] = newscript; newscript = new Script; newscript->Name="lord_crispin_ference"; newscript->GetAI = GetAI_lord_crispin_ference; m_scripts[nrscripts++] = newscript; }