All pastes #749026 Raw Edit

Untitled

public text v1 · immutable
#749026 ·published 2007-10-25 11:23 UTC
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 );
    }


};