rendered paste body
struct MANGOS_DLL_DECL boss_vazrudenAI : public ScriptedAI
{
boss_vazrudenAI(Creature *c) : ScriptedAI(c) {EnterEvadeMode();}
uint32 Revenge_Timer;
bool onetime;
bool InCombat;
void EnterEvadeMode()
{
Revenge_Timer = 4000; //These times are probably wrong
onetime = false;
// should be immune to all CC, as any other instance boss
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISARM, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_INTERRUPT, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_CHARM, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_ROOT, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FREEZE, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SILENCE, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_STUN, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_CONFUSED, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SLEEP, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_BANISH, true);
if (InCombat)
{
DoYell("Is there no one left to test me?!",LANG_UNIVERSAL,NULL);
}
//if(InCombat)
//{
//m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
//m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID,11686);//invisibile
InCombat = false;
//m_creature->Relocate(-1382,1751,-84,0);
//}
m_creature->RemoveAllAuras();
m_creature->DeleteThreatList();
m_creature->CombatStop();
DoGoHome();
}
void AttackStart(Unit *who)
{
if (!who)
return;
if (who->isTargetableForAttack() && who!= m_creature)
{//Begin melee attack if we are within range
DoStartMeleeAttack(who);
InCombat = true;
}
}
void KilledUnit(Unit* Victim)
{
if (rand()%2)
{
DoYell("It is over. Finished!", LANG_UNIVERSAL, NULL);
}else DoYell("Your days are done!", LANG_UNIVERSAL, NULL);
}
void MoveInLineOfSight(Unit *who)
{
if (!who || m_creature->getVictim())
return;
if (who->isTargetableForAttack() && who->isInAccessablePlaceFor(m_creature) && m_creature->IsHostileTo(who))
{
float attackRadius = m_creature->GetAttackDistance(who);
if (m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->GetDistanceZ(who) <= CREATURE_Z_ATTACK_RANGE && m_creature->IsWithinLOSInMap(who))
{
if(who->HasStealthAura())
who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
//Begin melee attack if we are within range
DoStartMeleeAttack(who);
switch (rand()%3)
{
case 0:
DoYell("Your time is running out!",LANG_UNIVERSAL,NULL);
break;
case 1:
DoYell("You are nothing, I answer a higher call!",LANG_UNIVERSAL,NULL);
break;
case 2:
DoYell("The Dark Lord laughs at you!",LANG_UNIVERSAL,NULL);
break;
}
}
}
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!m_creature->SelectHostilTarget())
return;
//Check if we have a current target
if( m_creature->getVictim() && m_creature->isAlive())
{
if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 38 && !onetime)
{
//DoCast(m_creature->getVictim(),33547);
onetime = true;
}
if (Revenge_Timer < diff)
{
DoCast(m_creature,40392);
Revenge_Timer = 8000;
}else Revenge_Timer -= diff;
DoMeleeAttackIfReady();
}
}
};
//VAZRUDEN THE HERALD
struct MANGOS_DLL_DECL boss_vazruden_the_heraldAI : public ScriptedAI
{
boss_vazruden_the_heraldAI(Creature *c) : ScriptedAI(c) {EnterEvadeMode();}
Creature* Sentry1;
Creature* Sentry2;
Creature* Nazan;
Creature* Vazruden;
Unit* Target;
bool Sentry;
bool NazVaz;
uint32 movement_timer;
bool InCombat;
uint32 Spawn_Timer;
uint32 phase;
bool die;
uint32 Reset_Timer;
void EnterEvadeMode()
{
// should be immune to all CC, as any other instance boss
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISARM, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_INTERRUPT, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_CHARM, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_ROOT, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FREEZE, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SILENCE, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_STUN, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_CONFUSED, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SLEEP, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_BANISH, true);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID,18944);
phase = 1;
Sentry = false;
NazVaz = false;
die = false;
Sentry1 = NULL;
Sentry2 = NULL;
Target = NULL;
Nazan = NULL;
Vazruden = NULL;
Spawn_Timer = 5000;
movement_timer = 10000;
Reset_Timer = 600000;
(*m_creature).GetMotionMaster()->Clear(false);
m_creature->SetHover(false);
m_creature->RemoveAllAuras();
m_creature->DeleteThreatList();
m_creature->CombatStop();
//DoGoHome();
}
void AttackStart(Unit *who)
{
if (!who)
return;
if (who->isTargetableForAttack() && who!= m_creature)
{
//DoStartMeleeAttack(who);
//Begin melee attack if we are within range
}
}
void MoveInLineOfSight(Unit *who)
{
if (who && who->GetTypeId() == TYPEID_PLAYER && m_creature->IsHostileTo(who)&& who->isInAccessablePlaceFor(m_creature))
{
//Add them to our threat list
m_creature->AddThreat(who,0.0f);
}
if (!who || m_creature->getVictim())
return;
if (m_creature->IsHostileTo(who))
if(!Target || !Target->isAlive())
Target = who;
if (who->isTargetableForAttack() && who->isInAccessablePlaceFor(m_creature) && m_creature->IsHostileTo(who))
{
float attackRadius = m_creature->GetAttackDistance(who);
if (m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->GetDistanceZ(who) <= CREATURE_Z_ATTACK_RANGE && m_creature->IsWithinLOSInMap(who))
{
if(who->HasStealthAura())
who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
}
if(!Target || !Target->isAlive() )
Target = who;
//DoStartMeleeAttack(who);
}
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
//if (!m_creature->SelectHostilTarget())
// return;
//Check if we have a current target
//if( m_creature->getVictim() && m_creature->isAlive())
//{
if (phase != 2) //phase 1
{
if (Sentry1 || Sentry2)
if (Sentry1->isAlive() || Sentry2->isAlive())
{
if (!m_creature->isHover())
{
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
m_creature->SetHover(true);
//DoCast(m_creature,18430);//Dragon hover?
DoCast(m_creature,11010);//hover?
}
if (movement_timer < diff)
{
uint32 position = rand()%2;
switch (position)
{
case 0:
SpecialMove(-1437.54,1719.36,100.41,10000);
m_creature->Relocate(-1437,1719,100,0);
break;
case 1:
SpecialMove(-1382.65,1751.32,100.41,10000);
m_creature->Relocate(-1382,1751,100,0);
break;
}
//DoCast(m_creature,11010);//hover?
movement_timer = 10000;
}else movement_timer -= diff;
}
}
if (Spawn_Timer < diff)
{ if (phase != 2)
if (!Sentry && m_creature->isAlive() )
{
DoYell("You have faced many challenges, pity they were all in vain. Soon your people will kneel to my lord!",LANG_UNIVERSAL,NULL);
Sentry1 = m_creature->SummonCreature(17517,-1369.22,1721.65,82.97,3.55,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,610000);
Sentry2 = m_creature->SummonCreature(17517,-1379.90,1708.64,82.72,1.18,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,610000);
Sentry = true;
}
}else Spawn_Timer -= diff;
if (Sentry1 && Sentry2) //phase2
if (!NazVaz)
if (!Sentry1->isAlive() && !Sentry2->isAlive() && !NazVaz)
{
if (phase != 2)
Spawn_Timer = 10000;
phase = 2;
SpecialMove(-1399.63,1740.17,82.47,5000); //va al centro dell'arena
m_creature->Relocate(-1399,1740,82,0);
if (Spawn_Timer < diff)
{
m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID,11686);//invisibile
Nazan = DoSpawnCreature(17536, 0, 0, 0, 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 602000);
Vazruden = DoSpawnCreature(17537, 0, 0, 0, 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 602000);
Reset_Timer = 600000;
NazVaz = true;
if(Target)
((CreatureAI*)Vazruden->AI())->AttackStart(Target);
//Spawn_Timer = 1900000;
}else Spawn_Timer -= diff;
}
//if (die)
//EnterEvadeMode();
if (NazVaz)
if (!Nazan->isAlive() && !Vazruden->isAlive())
{
m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_NORMAL, NULL, 0, false);
EnterEvadeMode();
}
if(Reset_Timer < diff)
{
EnterEvadeMode();
}else Reset_Timer -= diff;
//}
}
void SpecialMove(float X, float Y, float Z, uint32 Time)
{
WorldPacket data( SMSG_MONSTER_MOVE, (41+m_creature->GetPackGUID().size()) );
data.append(m_creature->GetPackGUID());
data << m_creature->GetPositionX() << m_creature->GetPositionY() << m_creature->GetPositionZ();
// unknown field - unrelated to orientation
// seems to increment about 1000 for every 1.7 seconds
// for now, we'll just use mstime
data << getMSTime();
data << uint8(0); // walkback when walking from A to B
data << uint32(0x0200); // flags
/* Flags:
512: Floating, moving without walking/running
*/
data << Time; // Time in between points
data << uint32(1); // 1 single waypoint
data << X << Y << Z; // the single waypoint Point B
m_creature->SendMessageToSet( &data, true );
}
};
struct MANGOS_DLL_DECL boss_nazanAI : public ScriptedAI
{
boss_nazanAI(Creature *c) : ScriptedAI(c) {EnterEvadeMode();}
bool phase2;
bool onetime;
uint32 Fireball_Timer1;
uint32 Fireball_Timer2;
uint32 Fireball_Timer3;
uint32 Fireball_Timer4;
Unit* Vazruden;
Unit* Target1;
uint32 ConeOfFire_Timer;
uint32 Movement_Timer;
bool InCombat;
void EnterEvadeMode()
{
phase2 = false;
onetime = false;
Fireball_Timer1 = 11000;
Fireball_Timer2 = 11200;
Fireball_Timer3 = 11400;
Fireball_Timer3 = 11600;
ConeOfFire_Timer = 10000;
Movement_Timer = 8000;
Vazruden = NULL;
m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
m_creature->SetHover(false);
(*m_creature).GetMotionMaster()->Clear(false);
m_creature->RemoveAllAuras();
m_creature->DeleteThreatList();
m_creature->CombatStop();
DoGoHome();
// should be immune to all CC, as any other instance boss
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISARM, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_INTERRUPT, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_CHARM, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_ROOT, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FREEZE, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SILENCE, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_STUN, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_CONFUSED, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SLEEP, true);
m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_BANISH, true);
InCombat = false;
}
void AttackStart(Unit *who)
{
if (!who)
return;
if (who->isTargetableForAttack() && who != m_creature)
{
DoStartMeleeAttack(who);
InCombat = true;
}
}
void MoveInLineOfSight(Unit *who)
{
if (who && who->GetTypeId() == TYPEID_PLAYER && m_creature->IsHostileTo(who) && !phase2)
{
//Add them to our threat list
m_creature->AddThreat(who,0.0f);
}
if(!Vazruden && !m_creature->IsHostileTo(who) && who->isAlive())
{
if (who->GetEntry() == 17537)
Vazruden = who;
}
if (!who || m_creature->getVictim())
return;
if (who->isTargetableForAttack() && who->isInAccessablePlaceFor(m_creature) && m_creature->IsHostileTo(who))
{
float attackRadius = m_creature->GetAttackDistance(who);
if (m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->GetDistanceZ(who) <= CREATURE_Z_ATTACK_RANGE && m_creature->IsWithinLOSInMap(who))
{
if(who->HasStealthAura())
who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
//Begin attack
DoStartMeleeAttack(who);
InCombat = true;
}
}
}
void UpdateAI(const uint32 diff)
{
if (!m_creature->SelectHostilTarget())
return;
if (Fireball_Timer1 < diff)
{
InCombat = true;
Unit* Target = NULL;
Target = SelectUnit(SELECT_TARGET_RANDOM,0);
Target1 = Target;
if (Target)
DoCast(Target,23970);
Fireball_Timer1 = 11000;
}else Fireball_Timer1 -= diff;
if (Fireball_Timer2 < diff)
{
if (Target1)
DoCast(Target1,23970);
Fireball_Timer2 = 11200;
}else Fireball_Timer2 -= diff;
if (Fireball_Timer3 < diff)
{
if (Target1)
DoCast(Target1,23970);
Fireball_Timer3 = 11400;
}else Fireball_Timer3 -= diff;
/*if (Fireball_Timer4 < diff)
{
if(Target1)
DoCast(Target1,23970);
Fireball_Timer4 = 11600;
}else Fireball_Timer4 -= diff;*/
if (!phase2) //phase 1
{
if (!m_creature->isHover())
{
//(*m_creature)->Clear(false);
(*m_creature).GetMotionMaster()->Idle();
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
m_creature->SetHover(true);
//DoCast(m_creature,18430);//Dragon hover?
DoCast(m_creature,11010);//hover?
SpecialMove(-1437.54,1719.36,98.41,8000);
m_creature->Relocate(-1437,1719,98,0);
}
//phase2 transition
if (Vazruden && ((Vazruden->GetHealth()*100) /Vazruden->GetMaxHealth() < 50) || ((m_creature->GetHealth()*100) /m_creature->GetMaxHealth() < 20))
if (m_creature->isHover())
{
m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
SpecialMove(-1399.63,1740.17,81.47,5000); //va al centro dell'arena
m_creature->Relocate(-1399,1740,81,0);
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
m_creature->SetHover(false);
(*m_creature).GetMotionMaster()->Clear(false);
//Unit* Target = NULL;
//Target = SelectUnit(SELECT_TARGET_RANDOM,0);
phase2 = true;
(*m_creature).GetMotionMaster()->Mutate(new TargetedMovementGenerator<Creature>(*m_creature->getVictim()));
}
if (Movement_Timer < diff)
{
uint32 position = rand()%2;
switch (position)
{
case 0:
SpecialMove(-1437.54,1719.36,98.41,8000);//COORD DA DEFINIRE
m_creature->Relocate(-1437,1719,98,0);
break;
case 1:
SpecialMove(-1382.65,1751.32,98.41,8000);
m_creature->Relocate(-1382,1751,98,0);
break;
}
Movement_Timer = 8000;
}else Movement_Timer -= diff;
}else if(phase2)//phase2 spell
{
if(ConeOfFire_Timer < diff)
{
Unit* Target = NULL;
Target = SelectUnit(SELECT_TARGET_RANDOM,0);
DoCast(Target,30926);
ConeOfFire_Timer = 10000;
}else ConeOfFire_Timer -= diff;
}
DoMeleeAttackIfReady();
}
void SpecialMove(float X, float Y, float Z, uint32 Time)
{
WorldPacket data( SMSG_MONSTER_MOVE, (41+m_creature->GetPackGUID().size()) );
data.append(m_creature->GetPackGUID());
data << m_creature->GetPositionX() << m_creature->GetPositionY() << m_creature->GetPositionZ();
// unknown field - unrelated to orientation
// seems to increment about 1000 for every 1.7 seconds
// for now, we'll just use mstime
data << getMSTime();
data << uint8(0); // walkback when walking from A to B
data << uint32(0x0200); // flags
/* Flags:
512: Floating, moving without walking/running
*/
data << Time; // Time in between points
data << uint32(1); // 1 single waypoint
data << X << Y << Z; // the single waypoint Point B
m_creature->SendMessageToSet( &data, true );
}
};