All pastes #990246 Raw Edit

Untested Moroes By Seline

public cpp v1 · immutable
#990246 ·published 2008-04-20 01:45 UTC
rendered paste body
/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>* This program is free software; you can redistribute it and/or modify* it under the terms of the GNU General Public License as published by* the Free Software Foundation; either version 2 of the License, or* (at your option) any later version.** This program is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the* GNU General Public License for more details.** You should have received a copy of the GNU General Public License* along with this program; if not, write to the Free Software* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA*//* ScriptDataSDName: Boss_moroesSD%Complete: 100SDComment:EndScriptData */#include "def_karazhan.h"#include "TargetedMovementGenerator.h"#include "IdleMovementGenerator.h"#define SAY_AGGRO           "Hmm, unannounced visitors? Preparations must be made."#define SOUND_AGGRO         9211#define SAY_SPECIAL_1       "Now, where was I? Oh yes..."#define SOUND_SPECIAL_1     9215#define SAY_SPECIAL_2       "You rang?"#define SOUND_SPECIAL_2     9316#define SAY_KILL_1          "One more for dinner this evening"#define SOUND_KILL_1        9214#define SAY_KILL_2          "Time... Never enough time."#define SOUND_KILL_2        9314#define SAY_KILL_3          "I've gone and made a mess."#define SOUND_KILL_3        9315#define SAY_DEATH           "How terribly clumsy of me..."#define SOUND_DEATH         9213#define SPELL_VANISH        24699#define SPELL_GARROTE       37066#define SPELL_BLIND         34654#define SPELL_GOUGE         28456#define SPELL_ENRAGE        37023#define ORIENT              4.5784#define POS_Z               81.73float Locations[4][2]={    {-10976.2793, -1878.1736},    {-10979.7587, -1877.8706},    {-10985.6650, -1877.2458},    {-10989.1367, -1876.8309},};uint32 Adds[6] = {19875, 19874, 19872, 17007, 19876, 19873};struct MANGOS_DLL_DECL boss_moroesAI : public ScriptedAI{    boss_moroesAI(Creature *c) : ScriptedAI(c)    {        FirstTime = true;        pInstance = ((ScriptedInstance*)c->GetInstanceData());        Reset();    }    ScriptedInstance *pInstance;    uint32 Vanish_Timer;    uint32 Blind_Timer;    uint32 Gouge_Timer;    uint32 Wait_Timer;    uint32 CheckAdds_Timer;    uint64 AddGuid[4];    uint32 AddType[4];    bool InVanish;    bool Enrage;    bool FirstTime;    void Reset()    {        Vanish_Timer = 30000;        Blind_Timer = 35000;        Gouge_Timer = 23000;        Wait_Timer = 0;        CheckAdds_Timer = 5000;        Enrage = false;        InVanish = false;        DeSpawnAdds();        SpawnAdds();        m_creature->setFaction(16);        m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);        if (pInstance)            pInstance->SetData(DATA_MOROES_EVENT, 0);    }    void StartEvent()    {        if (!pInstance)            return;        DoYell(SAY_AGGRO, LANG_UNIVERSAL, NULL);        DoPlaySoundToSet(m_creature, SOUND_AGGRO);        if (pInstance)            pInstance->SetData(DATA_MOROES_EVENT, 1);    }    void Aggro(Unit *who)    {        StartEvent();                DoYell(SAY_AGGRO, LANG_UNIVERSAL, NULL);        DoPlaySoundToSet(m_creature, SOUND_AGGRO);        InCombat = true;        AddsAttack();    }    void KilledUnit(Unit *victim)    {        switch (rand()%3)        {            case 0:                DoYell(SAY_KILL_1, LANG_UNIVERSAL, NULL);                DoPlaySoundToSet(victim, SOUND_KILL_1);                break;            case 1:                DoYell(SAY_KILL_2, LANG_UNIVERSAL, NULL);                DoPlaySoundToSet(victim, SOUND_KILL_2);                break;            case 2:                DoYell(SAY_KILL_3, LANG_UNIVERSAL, NULL);                DoPlaySoundToSet(victim, SOUND_KILL_3);                break;        }    }    void JustDied(Unit *victim)    {        DoYell(SAY_DEATH, LANG_UNIVERSAL, NULL);        DoPlaySoundToSet(NULL, SOUND_DEATH);        if (pInstance)            pInstance->SetData(DATA_MOROES_EVENT, 0);        DeSpawnAdds();    }    bool isAddIsDeadOrDespawned(uint64 CreatureGuid)    {        if (CreatureGuid)        {            Unit *Temp;            Temp = Unit::GetUnit((*m_creature),CreatureGuid);            if (Temp && Temp->isAlive())                return false;        }        return true;    }    void SpawnAdds()    {        std::list<uint32> AddList;        for(uint8 i = 0; i < 6; ++i)            AddList.push_back(Adds[i]);        uint32 entry = rand()%6;        Unit *pCreature = NULL;        if(FirstTime)        {            if(AddList.empty())            {                // Debug                DoTextEmote(": Add List is empty", NULL);                EnterEvadeMode();                return;            }            for(uint8 i = 0; i < 4; ++i)            {                uint32 entry = *(AddList.begin()) + rand()%(AddList.size());                char debug[400];                sprintf(debug, "Selecting add entry %d", entry);                DoTextEmote(debug, NULL);                                AddList.remove(entry);                pCreature = m_creature->SummonCreature(Adds[entry], Locations[i][0], Locations[i][1], POS_Z, ORIENT, TEMPSUMMON_CORPSE_DESPAWN, 60000);                if(pCreature)                    AddGuid[i] = pCreature->GetGUID();            }        }        /*if (FirstTime)        {            pCreature = m_creature->SummonCreature(Adds[i], SPAWN1_X, SPAWN1_Y, SPAWN1_Z, ORIENT, TEMPSUMMON_CORPSE_DESPAWN, 60000);            if (pCreature) AddGuid[0] = pCreature->GetGUID();            AddType[0] = Adds[i];            i1 = i;            while (i == i1)            {                i = rand()%6;            }            pCreature = m_creature->SummonCreature(Adds[i], SPAWN2_X, SPAWN2_Y, SPAWN2_Z, ORIENT, TEMPSUMMON_CORPSE_DESPAWN, 60000);            if (pCreature) AddGuid[1] = pCreature->GetGUID();            AddType[1] = Adds[i];            i2 = i;            while (i == i1 || i == i2)            {                i = rand()%6;            }            pCreature = m_creature->SummonCreature(Adds[i], SPAWN3_X, SPAWN3_Y, SPAWN3_Z, ORIENT, TEMPSUMMON_CORPSE_DESPAWN, 60000);            if (pCreature) AddGuid[2] = pCreature->GetGUID();            AddType[2] = Adds[i];            i3 = i;            while (i == i1 || i == i2 || i == i3)            {                i = rand()%6;            }            pCreature = m_creature->SummonCreature(Adds[i], SPAWN4_X, SPAWN4_Y, SPAWN4_Z, ORIENT, TEMPSUMMON_CORPSE_DESPAWN, 60000);            if (pCreature) AddGuid[3] = pCreature->GetGUID();            AddType[3] = Adds[i];            FirstTime = false;        }*/        else         {            for(uint8 i = 0; i < 4; ++i)            {                if(isAddIsDeadOrDespawned(AddGuid[i]))                {                    pCreature = m_creature->SummonCreature(AddType[i], Locations[i][0], Locations[i][1], POS_Z, 0, TEMPSUMMON_CORPSE_DESPAWN, 60000);                    if(pCreature)                        AddGuid[i] = pCreature->GetGUID();                }            }        }    }    void DeSpawnAdds()    {        for(uint8 i = 0; i < 4 ; ++i)        {            Unit *Temp = NULL;            if(AddGuid[i])            {                Temp = Unit::GetUnit((*m_creature),AddGuid[i]);                if(Temp && Temp->isAlive())                    Temp->DealDamage(Temp, Temp->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);            }        }    }    void AddsAttack()    {        if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() > 99)        {            for (uint8 i = 0; i < 4; ++i)            {                Unit *Temp = NULL;                if (AddGuid[i])                {                    Temp = Unit::GetUnit((*m_creature),AddGuid[i]);                    if(Temp && Temp->isAlive())                        ((Creature*)Temp)->AI()->AttackStart(m_creature->getVictim());                    else                        EnterEvadeMode();                }            }        }    }    void UpdateAI(const uint32 diff)    {        if (!m_creature->SelectHostilTarget() || !m_creature->getVictim() )            return;        if (pInstance && !pInstance->GetData(DATA_MOROES_EVENT))            EnterEvadeMode();        if (!Enrage && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 30)        {            DoCast(m_creature, SPELL_ENRAGE);            Enrage = true;        }        if (CheckAdds_Timer < diff)        {            for (uint8 i = 0; i < 4; ++i)            {                Unit *Temp = NULL;                if (AddGuid[i])                {                    Temp = Unit::GetUnit((*m_creature),AddGuid[i]);                    if (Temp && Temp->isAlive())                        if (!Temp->SelectHostilTarget() || !Temp->getVictim() )                            ((Creature*)Temp)->AI()->AttackStart(m_creature->getVictim());                }            }            CheckAdds_Timer = 5000;        }else CheckAdds_Timer -= diff;        //Cast Vanish, then Garrote random victim        if (Vanish_Timer < diff)        {            m_creature->setFaction(35);            m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);            DoCast(m_creature, SPELL_VANISH);            InVanish = true;            Vanish_Timer = 30000;            Wait_Timer = 5000;        }else Vanish_Timer -= diff;        if(InVanish)        {            if (Wait_Timer < diff)            {                Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 0);                if (target)                    target->CastSpell(target, SPELL_GARROTE,true);                m_creature->setFaction(14);                m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);                m_creature->AI()->AttackStart(m_creature->getVictim());                InVanish = false;            }else Wait_Timer -= diff;        }        //Blind highest aggro, and attack second highest        if (Gouge_Timer < diff)        {            DoCast(m_creature->getVictim(), SPELL_GOUGE);            Unit *target = SelectUnit(SELECT_TARGET_TOPAGGRO, 0);            if (target)                m_creature->getThreatManager().modifyThreatPercent(target,-99);            Gouge_Timer = 40000;        }else Gouge_Timer -= diff;        if (Blind_Timer < diff)        {            Unit *target;            std::list<HostilReference *> t_list = m_creature->getThreatManager().getThreatList();            std::vector<Unit *> target_list;            for (std::list<HostilReference *>::iterator itr = t_list.begin(); itr!= t_list.end(); ++itr)            {                target = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid());                if (target && target->GetDistance2dSq(m_creature) < 25)                    target_list.push_back(target);                target = NULL;            }            if (target_list.size())                target = *(target_list.begin()+rand()%target_list.size());            DoCast(target, SPELL_BLIND);            Blind_Timer = 40000;        }else Blind_Timer -= diff;        if (!InVanish)            DoMeleeAttackIfReady();    }};#define SPELL_MANABURN       29405#define SPELL_MINDFLY        29570#define SPELL_SWPAIN         34441#define SPELL_SHADOWFORM     29406struct MANGOS_DLL_DECL boss_baroness_dorothea_millstipeAI : public ScriptedAI{    //Shadow Priest    boss_baroness_dorothea_millstipeAI(Creature *c) : ScriptedAI(c)    {        pInstance = ((ScriptedInstance*)c->GetInstanceData());        Reset();    }    ScriptedInstance *pInstance;    uint32 ManaBurn_Timer;    uint32 MindFlay_Timer;    uint32 ShadowWordPain_Timer;    bool InCombat;    void Reset()    {        ManaBurn_Timer = 7000;        MindFlay_Timer = 1000;        ShadowWordPain_Timer = 6000;        InCombat = false;        if (pInstance)            pInstance->SetData(DATA_MOROES_EVENT, 0);        DoCast(m_creature,SPELL_SHADOWFORM); // It can be added in creature_addon table    }    void Aggro(Unit *who)    {    }    void UpdateAI(const uint32 diff)    {        if (!m_creature->SelectHostilTarget() || !m_creature->getVictim() )            return;        if (pInstance && !pInstance->GetData(DATA_MOROES_EVENT))            EnterEvadeMode();        if (MindFlay_Timer < diff)        {            DoCast(m_creature->getVictim(),SPELL_MINDFLY);            MindFlay_Timer = 12000; //3sec channeled        }else MindFlay_Timer -= diff;        if (ManaBurn_Timer < diff)        {            Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 0);            if (target && (target->getPowerType() == POWER_MANA))                DoCast(target,SPELL_MANABURN);            ManaBurn_Timer = 5000; //3 sec cast        }else ManaBurn_Timer -= diff;        if (ShadowWordPain_Timer < diff)        {            Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 0);            if (target)                DoCast(target,SPELL_SWPAIN);            ShadowWordPain_Timer = 7000;        }else ShadowWordPain_Timer -= diff;        DoMeleeAttackIfReady();    }};#define SPELL_HAMMEROFJUSTICE       13005#define SPELL_JUDGEMENTOFCOMMAND    29386#define SPELL_SEALOFCOMMAND         29385struct MANGOS_DLL_DECL boss_baron_rafe_dreugerAI : public ScriptedAI{    //Retr Pally    boss_baron_rafe_dreugerAI(Creature *c) : ScriptedAI(c)    {        pInstance = ((ScriptedInstance*)c->GetInstanceData());        Reset();    }    ScriptedInstance *pInstance;    uint32 HammerOfJustice_Timer;    uint32 SealOfCommand_Timer;    uint32 JudgementOfCommand_Timer;    bool InCombat;    void Reset()    {        HammerOfJustice_Timer = 1000;        SealOfCommand_Timer = 7000;        JudgementOfCommand_Timer = SealOfCommand_Timer + 29000;;        if (pInstance)            pInstance->SetData(DATA_MOROES_EVENT, 0);    }    void Aggro(Unit *who)    {    }    void UpdateAI(const uint32 diff)    {        if (!m_creature->SelectHostilTarget() || !m_creature->getVictim() )            return;        if (pInstance && !pInstance->GetData(DATA_MOROES_EVENT))            EnterEvadeMode();        if (SealOfCommand_Timer < diff)        {            DoCast(m_creature,SPELL_SEALOFCOMMAND);            SealOfCommand_Timer = 32000;            JudgementOfCommand_Timer = 29000;        }else SealOfCommand_Timer -= diff;        if (JudgementOfCommand_Timer < diff)        {            DoCast(m_creature->getVictim(),SPELL_JUDGEMENTOFCOMMAND);            JudgementOfCommand_Timer = SealOfCommand_Timer + 29000;        }else JudgementOfCommand_Timer -= diff;        if (HammerOfJustice_Timer < diff)        {            DoCast(m_creature->getVictim(),SPELL_HAMMEROFJUSTICE);            HammerOfJustice_Timer = 12000;        }else HammerOfJustice_Timer -= diff;        DoMeleeAttackIfReady();    }};#define SPELL_DISPELMAGIC	        15090 //Self or other guest+Moroes#define SPELL_GREATERHEAL		    29564 //Self or other guest+Moroes#define SPELL_HOLYFIRE		        29563#define SPELL_PWSHIELD				29408struct MANGOS_DLL_DECL boss_lady_catriona_von_indiAI : public ScriptedAI{    //Holy Priest    boss_lady_catriona_von_indiAI(Creature *c) : ScriptedAI(c)    {        for (uint8 i = 0; i < 5; ++i)            AllGuestGuid[i] = 0;        pInstance = (ScriptedInstance*)c->GetInstanceData();        Reset();    }    ScriptedInstance *pInstance;    uint64 AllGuestGuid[5];    uint32 DispelMagic_Timer;    uint32 GreaterHeal_Timer;    uint32 HolyFire_Timer;    uint32 PowerWordShield_Timer;    void Reset()    {        DispelMagic_Timer = 11000;        GreaterHeal_Timer = 1500;        HolyFire_Timer = 5000;        PowerWordShield_Timer = 1000;        FillAllGuestGuid();        if (pInstance)            pInstance->SetData(DATA_MOROES_EVENT, 0);    }    void Aggro(Unit *who)    {    }    void FillAllGuestGuid()    {        if (pInstance)        {            AllGuestGuid[0] = pInstance->GetData64(DATA_MOROES);            Creature *pMoroes = (Creature *)Unit::GetUnit((*m_creature), AllGuestGuid[0]);            if (pMoroes)                for (uint8 i = 0; i < 5; ++i)                    AllGuestGuid[i] = ((boss_moroesAI*)pMoroes->AI())->AddGuid[i];        }    }    void UpdateAI(const uint32 diff)    {        if (!m_creature->SelectHostilTarget() || !m_creature->getVictim() )            return;        if (pInstance && !pInstance->GetData(DATA_MOROES_EVENT))            EnterEvadeMode();        if (PowerWordShield_Timer < diff)        {            DoCast(m_creature,SPELL_PWSHIELD);            PowerWordShield_Timer = 15000;        }else PowerWordShield_Timer -= diff;        if (GreaterHeal_Timer < diff)        {            Unit *Temp = NULL;            uint64 TempGuid = AllGuestGuid[rand()%6];            if (TempGuid && TempGuid != m_creature->GetGUID())            {                Temp = Unit::GetUnit((*m_creature),TempGuid);                if (Temp && Temp->isAlive())                    DoCast(Temp,SPELL_GREATERHEAL);                else                    DoCast(m_creature,SPELL_GREATERHEAL);            }            else                DoCast(m_creature,SPELL_GREATERHEAL);            GreaterHeal_Timer = 17000;        }else GreaterHeal_Timer -= diff;        if (HolyFire_Timer < diff)        {            DoCast(m_creature->getVictim(),SPELL_HOLYFIRE);            HolyFire_Timer = 22000;        }else HolyFire_Timer -= diff;        if (DispelMagic_Timer < diff)        {            Unit *Temp;            uint64 TempGuid = AllGuestGuid[rand()%6];            if (rand()%2)            {                if (TempGuid && TempGuid != m_creature->GetGUID())                {                    Temp = Unit::GetUnit((*m_creature),TempGuid);                    if (Temp && Temp->isAlive() && m_creature->IsWithinLOSInMap(Temp))                        DoCast(Temp,SPELL_DISPELMAGIC);                    else                        DoCast(m_creature,SPELL_DISPELMAGIC);                }                else                    DoCast(m_creature,SPELL_DISPELMAGIC);            }            else            {                Temp = SelectUnit(SELECT_TARGET_RANDOM, 0);                if (Temp)                    DoCast(Temp,SPELL_DISPELMAGIC);            }            DispelMagic_Timer = 25000;        }else DispelMagic_Timer -= diff;        DoMeleeAttackIfReady();    }};#define SPELL_CLEANSE	            29380 //Self or other guest+Moroes#define SPELL_GREATERBLESSOFMIGHT	29381 //Self or other guest+Moroes#define SPELL_HOLYLIGHT		        29562 //Self or other guest+Moroes#define SPELL_DIVINESHIELD			41367struct MANGOS_DLL_DECL boss_lady_keira_berrybuckAI : public ScriptedAI{    //Holy Pally    boss_lady_keira_berrybuckAI(Creature *c) : ScriptedAI(c)    {        for (uint32 i = 0; i < 5; ++i)            AllGuestGuid[i] = 0;        pInstance = ((ScriptedInstance*)c->GetInstanceData());        Reset();    }    ScriptedInstance *pInstance;    uint64 AllGuestGuid[5];    uint32 Cleanse_Timer;    uint32 GreaterBless_Timer;    uint32 HolyLight_Timer;    uint32 DivineShield_Timer;    void Reset()    {        Cleanse_Timer = 13000;        GreaterBless_Timer = 1000;        HolyLight_Timer = 7000;        DivineShield_Timer = 31000;        FillAllGuestGuid();        if (pInstance)            pInstance->SetData(DATA_MOROES_EVENT, 0);    }    void Aggro(Unit *who)    {    }    void FillAllGuestGuid()    {        if (pInstance)        {            AllGuestGuid[0] = pInstance->GetData64(DATA_MOROES);            Creature *pMoroes = (Creature *)Unit::GetUnit((*m_creature), AllGuestGuid[0]);            if (pMoroes)                for (uint32 i = 0; i < 5; ++i)                    AllGuestGuid[i] = ((boss_moroesAI*)pMoroes->AI())->AddGuid[i];        }    }    void UpdateAI(const uint32 diff)    {        if (!m_creature->SelectHostilTarget() || !m_creature->getVictim() )            return;        if (pInstance && !pInstance->GetData(DATA_MOROES_EVENT))            EnterEvadeMode();        if (DivineShield_Timer < diff)        {            DoCast(m_creature,SPELL_DIVINESHIELD);            DivineShield_Timer = 31000;        }else DivineShield_Timer -= diff;        if (HolyLight_Timer < diff)        {            Unit *Temp;            uint64 TempGuid = AllGuestGuid[(rand()%6)];            if (TempGuid && TempGuid != m_creature->GetGUID())            {                Temp = Unit::GetUnit((*m_creature),TempGuid);                if (Temp && Temp->isAlive())                    DoCast(Temp,SPELL_HOLYLIGHT);                else                    DoCast(m_creature,SPELL_HOLYLIGHT);            }            else                DoCast(m_creature,SPELL_HOLYLIGHT);            HolyLight_Timer = 10000;        }else HolyLight_Timer -= diff;        if (GreaterBless_Timer < diff)        {            Unit *Temp;            uint64 TempGuid = AllGuestGuid[rand()%6];            if (TempGuid && TempGuid != m_creature->GetGUID())            {                Temp = Unit::GetUnit((*m_creature),TempGuid);                if (Temp && Temp->isAlive())                    DoCast(Temp,SPELL_GREATERBLESSOFMIGHT);                else                    DoCast(m_creature,SPELL_GREATERBLESSOFMIGHT);            }            else                DoCast(m_creature,SPELL_GREATERBLESSOFMIGHT);            GreaterBless_Timer = 50000;        }else GreaterBless_Timer -= diff;        if (Cleanse_Timer < diff)        {            Unit *Temp;            uint64 TempGuid = AllGuestGuid[rand()%6];            if (TempGuid && TempGuid != m_creature->GetGUID())            {                Temp = Unit::GetUnit((*m_creature),TempGuid);                if (Temp && Temp->isAlive() && m_creature->IsWithinLOSInMap(Temp))                    DoCast(Temp,SPELL_CLEANSE);                else                    DoCast(m_creature,SPELL_CLEANSE);            }            else                DoCast(m_creature,SPELL_CLEANSE);            Cleanse_Timer = 10000;        }else Cleanse_Timer -= diff;        DoMeleeAttackIfReady();    }};#define SPELL_HAMSTRING       9080#define SPELL_MORTALSTRIKE    29572#define SPELL_WHIRLWIND        29573struct MANGOS_DLL_DECL boss_lord_robin_darisAI : public ScriptedAI{    //Arms Warr    boss_lord_robin_darisAI(Creature *c) : ScriptedAI(c)    {        pInstance = ((ScriptedInstance*)c->GetInstanceData());        Reset();    }    ScriptedInstance *pInstance;    uint32 Hamstring_Timer;    uint32 MortalStrike_Timer;    uint32 WhirlWind_Timer;    void Reset()    {        Hamstring_Timer = 7000;        MortalStrike_Timer = 10000;        WhirlWind_Timer = 21000;        if (pInstance)            pInstance->SetData(DATA_MOROES_EVENT, 0);    }    void Aggro(Unit *who)    {        return;    }    void UpdateAI(const uint32 diff)    {        if (!m_creature->SelectHostilTarget() || !m_creature->getVictim() )            return;        if (pInstance && !pInstance->GetData(DATA_MOROES_EVENT))            EnterEvadeMode();        if (Hamstring_Timer < diff)        {            DoCast(m_creature->getVictim(),SPELL_HAMSTRING);            Hamstring_Timer = 12000;        }else Hamstring_Timer -= diff;        if (MortalStrike_Timer < diff)        {            DoCast(m_creature->getVictim(), SPELL_MORTALSTRIKE);            MortalStrike_Timer = 18000;        }else MortalStrike_Timer -= diff;        if (WhirlWind_Timer < diff)        {            DoCast(m_creature,SPELL_WHIRLWIND);            WhirlWind_Timer = 21000;        }else WhirlWind_Timer -= diff;        DoMeleeAttackIfReady();    }};#define SPELL_DISARM           8379#define SPELL_HEROICSTRIKE     29567#define SPELL_SHIELDBASH       11972#define SPELL_SHIELDWALL        29390struct MANGOS_DLL_DECL boss_lord_crispin_ferenceAI : public ScriptedAI{    //Arms Warr    boss_lord_crispin_ferenceAI(Creature *c) : ScriptedAI(c)    {        pInstance = ((ScriptedInstance*)c->GetInstanceData());        Reset();    }    ScriptedInstance *pInstance;    uint32 Disarm_Timer;    uint32 HeroicStrike_Timer;    uint32 ShieldBash_Timer;    uint32 ShieldWall_Timer;    void Reset()    {        Disarm_Timer = 6000;        HeroicStrike_Timer = 10000;        ShieldBash_Timer = 8000;        ShieldWall_Timer = 4000;        if (pInstance)            pInstance->SetData(DATA_MOROES_EVENT, 0);    }    void Aggro(Unit *who)    {    }    void UpdateAI(const uint32 diff)    {        if (!m_creature->SelectHostilTarget() || !m_creature->getVictim() )            return;        if (pInstance && !pInstance->GetData(DATA_MOROES_EVENT))            EnterEvadeMode();        if (Disarm_Timer < diff)        {            DoCast(m_creature->getVictim(),SPELL_DISARM);            Disarm_Timer = 12000;        }else Disarm_Timer -= diff;        if (HeroicStrike_Timer < diff)        {            DoCast(m_creature->getVictim(),SPELL_HEROICSTRIKE);            HeroicStrike_Timer = 10000;        }else HeroicStrike_Timer -= diff;        if (ShieldBash_Timer < diff)        {            DoCast(m_creature->getVictim(),SPELL_SHIELDBASH);            ShieldBash_Timer = 13000;        }else ShieldBash_Timer -= diff;        if (ShieldWall_Timer < diff)        {            DoCast(m_creature,SPELL_SHIELDWALL);            ShieldWall_Timer = 21000;        }else ShieldWall_Timer -= diff;        DoMeleeAttackIfReady();    }};CreatureAI* GetAI_boss_moroes(Creature *_Creature){    return new boss_moroesAI (_Creature);}CreatureAI* GetAI_baroness_dorothea_millstipe(Creature *_Creature){    return new boss_baroness_dorothea_millstipeAI (_Creature);}CreatureAI* GetAI_baron_rafe_dreuger(Creature *_Creature){    return new boss_baron_rafe_dreugerAI (_Creature);}CreatureAI* GetAI_lady_catriona_von_indi(Creature *_Creature){    return new boss_lady_catriona_von_indiAI (_Creature);}CreatureAI* GetAI_lady_keira_berrybuck(Creature *_Creature){    return new boss_lady_keira_berrybuckAI (_Creature);}CreatureAI* GetAI_lord_robin_daris(Creature *_Creature){    return new boss_lord_robin_darisAI (_Creature);}CreatureAI* GetAI_lord_crispin_ference(Creature *_Creature){    return new boss_lord_crispin_ferenceAI (_Creature);}void AddSC_boss_moroes(){    Script *newscript;    newscript = new Script;    newscript->Name="boss_moroes";    newscript->GetAI = GetAI_boss_moroes;    m_scripts[nrscripts++] = newscript;    newscript = new Script;    newscript->Name="baroness_dorothea_millstipe";    newscript->GetAI = GetAI_baroness_dorothea_millstipe;    m_scripts[nrscripts++] = newscript;    newscript = new Script;    newscript->Name="baron_rafe_dreuger";    newscript->GetAI = GetAI_baron_rafe_dreuger;    m_scripts[nrscripts++] = newscript;    newscript = new Script;    newscript->Name="lady_catriona_von_indi";    newscript->GetAI = GetAI_lady_catriona_von_indi;    m_scripts[nrscripts++] = newscript;    newscript = new Script;    newscript->Name="lady_keira_berrybuck";    newscript->GetAI = GetAI_lady_keira_berrybuck;    m_scripts[nrscripts++] = newscript;    newscript = new Script;    newscript->Name="lord_robin_daris";    newscript->GetAI = 	GetAI_lord_robin_daris;    m_scripts[nrscripts++] = newscript;    newscript = new Script;    newscript->Name="lord_crispin_ference";    newscript->GetAI = 	GetAI_lord_crispin_ference;    m_scripts[nrscripts++] = newscript;}