Public feed #890228

Untitled

public text v1 · immutable
Raw Edit
·published 2008-02-03 15:58 UTC
rendered paste body
#include "../../sc_defines.h"

#define SPELL_BELLOWING_ROAR        39427 // Bellowing Roar1.5 sec cast 8 sec cooldown - Fleeing in fear. 4 seconds remaining
#define SPELL_CHARRED_EARTH         30129 // Chars the ground, setting it flame, dealing 21880 to the inflamed area over 30 sec. - auch 30209
#define SPELL_DISTRACTING_ASH       30130 // Reduces the chance to hit with spells and abilities by 30%.
#define SPELL_SMOLDERING_BREATH     30210 // Inflicts 3700 to 4300 Fire damage to enemies in a cone in front of the caster.
#define SPELL_TAIL_SWEEP            25653 // Inflicts 450 damage on enemies in a cone behind the caster, knocking them back.

#define SPELL_RAIN_OF_BONES         37098 // Bombards the target and nearby allies with bone fragments, summoning 3 skeletons in the process.
#define SPELL_SMOKING_BLAST         37057 // Deals 1850 to 2150 physical damage to the target and additional fire damage over time.
#define SPELL_FIREBALL_BARRAGE      30282 // Throws fireballs at any enemies farther than 40 yards away.

#define SOUND_ATTACK        9451 // When should he say this?
#define SOUND_WOUND         9452 // When should he say this?
#define SOUND_WOUND_CRIT    9453 // When should he say this?
#define SOUND_DEATH         9454
#define SOUND_PRE_AGGRO     9455
#define SOUND_AGGRO         9456
#define SOUND_LOOP          9457 // When should he say this?

struct MANGOS_DLL_DECL boss_nightbaneAI : public ScriptedAI
{
    boss_nightbaneAI(Creature *c) : ScriptedAI(c) {EnterEvadeMode();}

    uint32 Bellowing_Timer;
    uint32 Charred_Timer;
    uint32 Distracting_Timer;
    uint32 Smoldering_Timer;
    uint32 Tail_Timer;
    uint32 Rain_Timer;
    uint32 Smoking_Timer;
    uint32 Fireball_Timer;

    bool InCombat;

    int Phase;

    int RandTime(int time) {return ((100+rand()%time)*1000);}

    void EnterEvadeMode()
    {
        Bellowing_Timer     = 50000;
        Distracting_Timer   = 70000;
        Charred_Timer       = 90000;
        Tail_Timer          = 110000;
        Rain_Timer          = 50000;
        Smoldering_Timer    = 70000;
        Smoking_Timer       = 90000;
        Fireball_Timer      = 110000;

        InCombat = false;

        Phase = 1;

        m_creature->RemoveAllAuras();
        m_creature->DeleteThreatList();
        m_creature->CombatStop();

        DoGoHome();

        DoPlaySoundToSet(m_creature, SOUND_PRE_AGGRO);
    }

    void JustDied(Unit* Killer)
    {
        DoPlaySoundToSet(m_creature, SOUND_DEATH);
    }

    void AttackStart(Unit *who)
    {
        if (!who) return;

        if (who->isTargetableForAttack() && who!= m_creature)
        {
            if (!InCombat)
            {
                DoPlaySoundToSet(m_creature, SOUND_AGGRO);
                InCombat = true;
            }
            DoStartMeleeAttack(who);
        }
    }

    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);

                if (!InCombat)
                {
                    DoPlaySoundToSet(m_creature, SOUND_AGGRO);
                    InCombat = true;
                }
                DoStartMeleeAttack(who);
            }
        }
    }

    void UpdateAI(const uint32 diff)
    {
        if (!m_creature->SelectHostilTarget()) return;

        if( m_creature->getVictim() && m_creature->isAlive())
        {
            if ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 75) &&
                (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() > 50)) Phase = 2;
            if ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 50) &&
                (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() > 25)) Phase = 1;
            if ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 25) &&
                (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() > 0)) Phase = 2;

            if (Phase == 1)
            {
                if (Bellowing_Timer < diff)
                {
                    DoCast(m_creature,SPELL_BELLOWING_ROAR);
                    Bellowing_Timer = RandTime(120);
                }else Bellowing_Timer -= diff;

                if (Distracting_Timer < diff)
                {
                    DoCast(m_creature->getVictim(),SPELL_DISTRACTING_ASH);
                    Distracting_Timer = RandTime(120);
                }else Distracting_Timer -= diff;

                if (Charred_Timer < diff)
                {
                    Unit* target = NULL;
                    target = SelectUnit(SELECT_TARGET_RANDOM,0);
                    
                    if (target)
                        DoCast(target,SPELL_CHARRED_EARTH);
                    else
                        DoCast(m_creature->getVictim(),SPELL_CHARRED_EARTH);
                    Charred_Timer = RandTime(120);
                }else Charred_Timer -= diff;

                if (Tail_Timer < diff)
                {
                    DoCast(m_creature->getVictim(),SPELL_TAIL_SWEEP);
                    Tail_Timer = RandTime(120);
                }else Tail_Timer -= diff;

            }

            if (Phase == 2)
            {   // Random player - is correct!
                if (Rain_Timer < diff)
                {
                    Unit* target = NULL;
                    target = SelectUnit(SELECT_TARGET_RANDOM,0);
                    
                    if (target)
                        DoCast(target,SPELL_RAIN_OF_BONES);
                    else
                        DoCast(m_creature->getVictim(),SPELL_RAIN_OF_BONES);
                    Rain_Timer = RandTime(120);
                }else Rain_Timer -= diff;

                if (Smoldering_Timer < diff)
                {
                    Unit* target = NULL;
                    target = SelectUnit(SELECT_TARGET_RANDOM,0);
                    
                    if (target)
                        DoCast(target,SPELL_SMOLDERING_BREATH);
                    else
                        DoCast(m_creature->getVictim(),SPELL_SMOLDERING_BREATH);
                    Smoldering_Timer = RandTime(120);
                }else Smoldering_Timer -= diff;

                if (Smoking_Timer < diff)
                {   // Sould be casted on the first aggro rang healer
                    // I see no option to do that!?
                    Unit* target = NULL;
                    target = SelectUnit(SELECT_TARGET_RANDOM,0);
                    
                    if (target)
                        DoCast(target,SPELL_SMOKING_BLAST);
                    else
                        DoCast(m_creature->getVictim(),SPELL_SMOKING_BLAST);
                    Smoking_Timer = RandTime(120);
                }else Smoking_Timer -= diff;

                if (Fireball_Timer < diff)
                {
                    DoCast(m_creature->getVictim(),SPELL_FIREBALL_BARRAGE);
                    Fireball_Timer = RandTime(120);
                }else Fireball_Timer -= diff;

            }
            DoMeleeAttackIfReady();
        }
    }
};

CreatureAI* GetAI_boss_nightbane(Creature *_Creature)
{
    return new boss_nightbaneAI (_Creature);
}

void AddSC_boss_nightbane()
{
    Script *newscript;
    newscript = new Script;
    newscript->Name="boss_nightbane";
    newscript->GetAI = GetAI_boss_nightbane;
    m_scripts[nrscripts++] = newscript;
}