/* 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;
}