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(*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 ); } };