All pastes #942571 Raw Edit

Untitled

public text v1 · immutable
·published 2008-03-14 16:47 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 );
    }
};