Quote Originally Posted by ellenya View Post
PHP Code:
#include "precompiled.h"
#include "def_spire.h"

enum BossSpells
{
    
SPELL_INFEST                     70541,
    
SPELL_NECROTIC_PLAGUE            70337,
    
SPELL_PLAGUE_SIPHON              74074,
    
SPELL_SOUL_REAPER                69409,
    
SPELL_SPAWN_DEFILE               72762,
    
SPELL_HARVEST_SOUL               68980,
    
SPELL_HARVEST_SOUL_TELEPORT      71372,
//
    
SPELL_CHANNEL_KING               71769,
    
SPELL_BROKEN_FROSTMOURNE         72398,
    
SPELL_BOOM_VISUAL                72726,
    
SPELL_ICEBLOCK_TRIGGER           71614,
    
SPELL_TIRION_LIGHT               71797,
    
SPELL_FROSTMOURNE_TRIGGER        72405,
    
SPELL_SUMMON_BROKEN_FROSTMOURNE  72406,
    
SPELL_SUMMON_BROKEN_FROSTMOURNE_2 73017,
    
SPELL_DISENGAGE                  61508,
    
SPELL_FURY_OF_FROSTMOURNE        70063,
    
SPELL_REVIVE_VISUAL              37755
    
SPELL_REVIVE                     51918,
    
SPELL_CLONE_PLAYER               57507,
    
SPELL_BERSERK                    47008,

    
SPELL_REMORSELESS_WINTER         68981,
    
SPELL_PAIN_AND_SUFFERING         72133,
    
SPELL_QUAKE                      72262,

//  SPELL_SUMMON_RAGING_SPIRIT       = 69201, // triggered
    
SPELL_SUMMON_RAGING_SPIRIT       69200,
    
SPELL_SOUL_SHRIEK                69242,

    
SPELL_SUMMON_ICE_SPHERE          69103,
    
SPELL_ICE_PULSE                  69099,
    
SPELL_ICE_BURST                  69108,
    
SPELL_ICE_SPHERE_VISUAL          69090,

    
SPELL_SUMMON_DRUDGE_GHOULS       70358,

    
SPELL_SUMMON_SHAMBLING_HORROR    70372,
    
SPELL_SHOCKWAVE                  72149,
    
SPELL_HORROR_ENRAGE              72143,

    
SPELL_SUMMON_VILE_SPIRITS        70498,
    
SPELL_SPIRITS_BURST              70503,

    
SPELL_SUMMON_VALKYR              69037,
    
NPC_VALKYR                       36609,
    
SPELL_WINGS_OF_THE_DAMNED        74352,

    
SPELL_DEFILE                     72743,

    
SPELL_REVALL                     26687,

    
NPC_ICE_SPHERE                   36633,
    
NPC_DEFILER                      38757,
    
NPC_RAGING_SPIRIT                36701,
    
NPC_VILE_SPIRIT                  37799,
    
NPC_STRANGULATE_VEHICLE          36598,

};

enum Common
{
     
FINAL_ARTHAS_MOVIE             16,
};

static 
Locations SpawnLoc[]=
{
    {
459.93689f, -2124.638184f1040.860107f},    // 0 Lich King Intro
    
{503.15652f, -2124.516602f1040.860107f},    // 1 Lich king move end
    
{491.27118f, -2124.638184f1040.860107f},    // 2 Tirion 1
    
{481.69797f, -2124.638184f1040.860107f},    // 3 Tirion 2
    
{498.00448f, -2201.573486f1046.093872f},    // 4 Valkyrs?
    
{517.48291f, -2124.905762f1040.861328f},    // 5 Tirion?
    
{529.85302f, -2124.709961f1040.859985f},    // 6 Lich king final, o=3.1146
    
{520.311f, -2124.709961f1040.859985f},      // 7 Frostmourne
};

struct MANGOS_DLL_DECL boss_the_lich_king_iccAI : public BSWScriptedAI
{
    
boss_the_lich_king_iccAI(CreaturepCreature) : BSWScriptedAI(pCreature)
    {
        
pInstance = (instance_icecrown_spire*)pCreature->GetInstanceData();
        
oldflag 0;
        
Reset();
    }

    
instance_icecrown_spirepInstance;
    
uint8 stage;
    
uint32 nextEvent;
    
uint32 nextPoint;
    
uint32 UpdateTimer;
    
uint32 oldflag;
    
bool movementstarted;
    
bool battlestarted;
    
bool finalphase;
    
CreaturepTirion;
    
CreaturepFrostmourne;

    
void Reset()
    {
        if(!
pInstance) return;
        
resetTimers();
        
stage 0;
        
nextEvent 0;
        
nextPoint 0;
        
movementstarted false;
        
battlestarted false;
        
finalphase false;
        
m_creature->SetOrientation(0.0f);
        
pInstance->CloseDoor(pInstance->GetData64(GO_ICESHARD_1));
        
pInstance->CloseDoor(pInstance->GetData64(GO_ICESHARD_2));
        
pInstance->CloseDoor(pInstance->GetData64(GO_ICESHARD_3));
        
pInstance->CloseDoor(pInstance->GetData64(GO_ICESHARD_4));
        if (
oldflag)
            if (
GameObjectpGoFloor pInstance->instance->GetGameObject(pInstance->GetData64(GO_ARTHAS_PLATFORM)))
            {
               
pGoFloor->RemoveFlag(GAMEOBJECT_FLAGSGO_FLAG_DAMAGED GO_FLAG_NODESPAWN);
               
pGoFloor->SetUInt32Value(GAMEOBJECT_BYTES_1,oldflag);
            }
        
pInstance->CloseDoor(pInstance->GetData64(GO_FROSTY_WIND));
    }

    
void MoveInLineOfSight(UnitpWho
    {
    }

    
void EnterEvadeMode()
    {
        if (!
pInstance) return;
        if (
finalphase && pInstance->GetData(TYPE_LICH_KING) == IN_PROGRESS) return;

        
m_creature->RemoveAllAuras();
        
m_creature->DeleteThreatList();
        
m_creature->CombatStop(true);
        
m_creature->LoadCreaturesAddon();
        if (
m_creature->isAlive())
            
m_creature->GetMotionMaster()->MoveTargetedHome();

        
m_creature->SetLootRecipient(NULL);

        
Reset();
    }

    
void MovementInform(uint32 typeuint32 id)
    {
        if (
type != POINT_MOTION_TYPE || !movementstarted) return;
        if (
id == nextPoint
        {
            
movementstarted false;
            
pInstance->SetData(TYPE_EVENT,nextEvent);
            
m_creature->GetMotionMaster()->MovementExpired();
        }
    }

    
void KilledUnit(UnitpVictim)
    {

     if (!
battlestarted) return;

     switch (
urand(0,1)) {
        case 
0:
               
DoScriptText(-1631519,m_creature,pVictim);
               break;
        case 
1:
               
DoScriptText(-1631517,m_creature,pVictim);
               break;
        };
    }

    
void JustReachedHome()
    {
        if (!
pInstance) return;
        
pInstance->SetData(TYPE_LICH_KINGFAIL);
        
stage 0;
        
battlestarted false;
        
finalphase false;
    }


    
void StartMovement(uint32 iduint32 _nextEvent)
    {
        
nextPoint id;
        
nextEvent _nextEvent;
        
m_creature->GetMotionMaster()->Clear();
        
m_creature->GetMotionMaster()->MovePoint(idSpawnLoc[id].xSpawnLoc[id].ySpawnLoc[id].z);
        
pInstance->SetData(TYPE_EVENT,0);
        
movementstarted true;
    }

    
void JustSummoned(Creaturesummoned)
    {
        if(!
pInstance || !summoned) return;

        if (
UnitpTarget doSelectRandomPlayerAtRange(60.0f))
           {
              
summoned->SetInCombatWith(pTarget);
              
summoned->AddThreat(pTarget,100.0f);
           }
    }

    
void Aggro(Unit *who
    {
        if(!
pInstance) return;
        
pInstance->SetData(TYPE_LICH_KINGIN_PROGRESS);
    }

    
void JustDied(Unit *killer)
    {
        if(!
pInstance) return;
        
pInstance->SetData(TYPE_LICH_KINGDONE);
        
DoScriptText(-1631528,m_creature,killer);

        
pInstance->SetData(TYPE_EVENT,14010);

    }

    
void UpdateAI(const uint32 diff)
    {

        if(!
pInstance) return;

        if (
pInstance->GetData(TYPE_EVENT_NPC) == NPC_LICH_KING)
        {
            
UpdateTimer pInstance->GetData(TYPE_EVENT_TIMER);
            if (
UpdateTimer <= diff)
            {
            
debug_log("EventMGR: creature %u received signal %u ",m_creature->GetEntry(),pInstance->GetData(TYPE_EVENT));
            switch (
pInstance->GetData(TYPE_EVENT))
                {
                case 
12000:
                          
m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATEEMOTE_STATE_STAND);
                          
m_creature->SetStandState(UNIT_STAND_STATE_STAND);
                          
StartMovement(0,12020);
                          break;
                case 
12020:
                          
m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATEEMOTE_STATE_TALK);
                          
DoScriptText(-1631501m_creature);
                          
UpdateTimer 12000;
                          
pInstance->SetData(TYPE_EVENT,12030);
                          break;
                case 
12040:
                          
m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATEEMOTE_STATE_READY2H);
                          
DoScriptText(-1631503m_creature);
                          
UpdateTimer 8000;
                          
pInstance->SetData(TYPE_EVENT,12041);
                          break;
                case 
12041:
                          
m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATEEMOTE_STATE_LAUGH);
                          
UpdateTimer 3000;
                          
pInstance->SetData(TYPE_EVENT,12042);
                          break;
                case 
12042:
                          
m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,EMOTE_ONESHOT_POINT_NOSHEATHE);
                          
UpdateTimer 2000;
                          
pInstance->SetData(TYPE_EVENT,12043);
                          break;
                case 
12043:
                          
m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,EMOTE_ONESHOT_NONE);
                          
UpdateTimer 10000;
                          
pInstance->SetData(TYPE_EVENT,12050);
                          break;
                case 
12060:
                          
m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATEEMOTE_STATE_TALK);
                          
DoScriptText(-1631505m_creature);
                          
UpdateTimer 10000;
                          
pInstance->SetData(TYPE_EVENT,12080);
                          break;
                case 
12080:
                          
m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,EMOTE_STATE_READY2H);
                          
UpdateTimer 2000;
                          
pInstance->SetData(TYPE_EVENT,12100);
                          break;
                case 
12100:
                          
m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,EMOTE_ONESHOT_NONE);
                          
UpdateTimer 6000;
                          
pInstance->SetData(TYPE_EVENT,12120);
                          break;
                case 
12120:
                          
m_creature->SetInCombatWithZone();
                          
battlestarted true;
                          
pInstance->SetData(TYPE_EVENT,12200);
                          
UpdateTimer 10000;
                          break;
                case 
12200:
                          
DoScriptText(-1631506m_creature);
                          
UpdateTimer 5000;
                          
pInstance->SetData(TYPE_EVENT,12220);
                          break;
                case 
13000:
                          
m_creature->SetOrientation(3.1146f);
                          
DoScriptText(-1631507m_creature);
                          
UpdateTimer 12000;
                          
finalphase true;
                          
doCast(SPELL_FURY_OF_FROSTMOURNE);
                          
pInstance->SetData(TYPE_EVENT,13020);
                          if (
pTirion = (Creature*)Unit::GetUnit((*m_creature),pInstance->GetData64(NPC_TIRION))) {
                                
m_creature->SetInCombatWith(pTirion);
                                
pTirion->AddThreat(m_creature1000.0f);
                                }
                          
m_creature->SetInCombatWithZone();
                          break;
                case 
13020:
                          
DoScriptText(-1631508m_creature);
                          
UpdateTimer 12000;
                          
pInstance->SetData(TYPE_EVENT,13060);
                          break;
                case 
13060:
                          
DoScriptText(-1631509m_creature);
                          
UpdateTimer 15000;
                          
pInstance->SetData(TYPE_EVENT,13100);
                          break;
                case 
13100:
                          
DoScriptText(-1631510m_creature);
                          
UpdateTimer 15000;
                          
pInstance->SetData(TYPE_EVENT,13110);
                          
doCast(SPELL_CHANNEL_KING);
                          break;
                case 
13120:
                          
DoScriptText(-1631511m_creature);
                          
UpdateTimer 12000;
                          
pInstance->SetData(TYPE_EVENT,13130);
                          break;
                case 
13140:
                          
UpdateTimer 6000;
                          
doRemove(SPELL_CHANNEL_KING);
                          
pInstance->SetData(TYPE_EVENT,13150);
                          
m_creature->CastSpell(m_creatureSPELL_SUMMON_BROKEN_FROSTMOURNEfalse);
                          break;
                case 
13160:
                          
UpdateTimer 6000;
                          
pInstance->SetData(TYPE_EVENT,13170);
                          
m_creature->CastSpell(m_creatureSPELL_SUMMON_BROKEN_FROSTMOURNE_2false);
                          break;
                case 
13180:
                          
UpdateTimer 12000;
                          
pInstance->SetData(TYPE_EVENT,13190);
                          if (
pFrostmourne m_creature->SummonCreature(NPC_FROSTMOURNE_HOLDERSpawnLoc[7].xSpawnLoc[7].ySpawnLoc[7].z0TEMPSUMMON_MANUAL_DESPAWN5000))
                             {
                                 
pFrostmourne->CastSpell(pFrostmourneSPELL_BROKEN_FROSTMOURNEfalse);
                                 
pFrostmourne->CastSpell(pFrostmourneSPELL_FROSTMOURNE_TRIGGERfalse);
                                 
pFrostmourne->GetMotionMaster()->MoveChase(m_creature);
                                 
m_creature->SetFlag(UNIT_FIELD_FLAGSUNIT_FLAG_DISARMED);
                             }
                          break;
                case 
13200:
                          
DoScriptText(-1631512m_creature);
                          
m_creature->RemoveAurasDueToSpell(SPELL_SUMMON_BROKEN_FROSTMOURNE);
                          
m_creature->RemoveAllAuras();
                          
pFrostmourne->RemoveAurasDueToSpell(SPELL_FROSTMOURNE_TRIGGER);
                          
UpdateTimer 5000;
                          
pInstance->SetData(TYPE_EVENT,13210);
                          break;
                case 
13280:
                          
UpdateTimer 2000;
                          
pInstance->SetData(TYPE_EVENT,13290);
                          
stage 13;
                          if (
pFrostmournepFrostmourne->ForcedDespawn();
                          if (
CreaturepTemp = (Creature*)Unit::GetUnit((*m_creature),pInstance->GetData64(NPC_FROSTMOURNE_TRIGGER)))
                             
pTemp->ForcedDespawn();
                          if (
CreaturepTemp = (Creature*)Unit::GetUnit((*m_creature),pInstance->GetData64(NPC_FROSTMOURNE_HOLDER)))
                             
pTemp->ForcedDespawn();
                          
SetCombatMovement(true);
                          
battlestarted true;
                          break;
                default:
                          break;
                }
             } else 
UpdateTimer -= diff;
             
pInstance->SetData(TYPE_EVENT_TIMERUpdateTimer);
        }

        if (
battlestarted && !m_creature->SelectHostileTarget() && !finalphase)
        {
            
battlestarted false;
            
pInstance->SetData(TYPE_LICH_KINGFAIL);
            
pInstance->SetData(TYPE_EVENT,0);
            
EnterEvadeMode();
            return;
        }

        if (!
m_creature->SelectHostileTarget() || !m_creature->getVictim())
            return;

        switch(
stage)
        {
            case 
0:           // Phase 1
//                    timedCast(SPELL_SHOCKWAVE, diff);
                    
timedCast(SPELL_INFESTdiff);
                    
timedCast(SPELL_SUMMON_DRUDGE_GHOULSdiff);
                    
timedCast(SPELL_PLAGUE_SIPHONdiff);
                    
timedCast(SPELL_SUMMON_SHAMBLING_HORRORdiff);
                    
timedCast(SPELL_NECROTIC_PLAGUEdiff);

                    
DoMeleeAttackIfReady();
                    if (
timedQuery(SPELL_BERSERKdiff))
                    {
                        
doCast(SPELL_BERSERK);
                        
DoScriptText(-1631518,m_creature);
                    };

                    if (
m_creature->GetHealthPercent() < 70.0f
                       {
                            
stage 1;
                            
DoScriptText(-1631515,m_creature);
                       }
                    break;
            case 
1:             // Go in transition phase
                    
m_creature->AttackStop();
                    
m_creature->SetFlag(UNIT_FIELD_FLAGSUNIT_FLAG_NON_ATTACKABLE);
                    
SetCombatMovement(false);
                    
StartMovement(1,0);
                    
stage 2;
                    break;
            case 
2:
                    if (
movementstarted) return;
                    
doCast(SPELL_REMORSELESS_WINTER);
                    
stage 3;
                    break;
            case 
3:
                    
timedCast(SPELL_SUMMON_RAGING_SPIRITdiff);
                    
timedCast(SPELL_SUMMON_ICE_SPHEREdiff);
                    
timedCast(SPELL_PAIN_AND_SUFFERINGdiff);

                    if (
timedQuery(SPELL_BERSERKdiff))
                    {
                        
doCast(SPELL_BERSERK);
                        
DoScriptText(-1631518,m_creature);
                    };

                    if (
timedQuery(SPELL_REMORSELESS_WINTERdiff))
                       {
                            
doCast(SPELL_QUAKE);
                            
stage 4;
                            
DoScriptText(-1631524m_creature);
                            
pInstance->OpenDoor(pInstance->GetData64(GO_SNOW_EDGE));
                       };
                    break;
            case 
4:           // Platform destruct
                    
if (timedQuery(SPELL_QUAKEdiff))
                       {
                            
pInstance->OpenDoor(pInstance->GetData64(GO_ICESHARD_1));
                            
pInstance->OpenDoor(pInstance->GetData64(GO_ICESHARD_2));
                            
pInstance->OpenDoor(pInstance->GetData64(GO_ICESHARD_3));
                            
pInstance->OpenDoor(pInstance->GetData64(GO_ICESHARD_4));
                            if (
GameObjectpGoFloor pInstance->instance->GetGameObject(pInstance->GetData64(GO_ARTHAS_PLATFORM)))
                            {
                                 
pGoFloor->SetFlag(GAMEOBJECT_FLAGSGO_FLAG_DAMAGED GO_FLAG_NODESPAWN);
                                 
oldflag pGoFloor->GetUInt32Value(GAMEOBJECT_BYTES_1);
                                 
pGoFloor->SetUInt32Value(GAMEOBJECT_BYTES_1,8449);
                            }
                            
pInstance->CloseDoor(pInstance->GetData64(GO_FROSTY_WIND));
                            
pInstance->CloseDoor(pInstance->GetData64(GO_SNOW_EDGE));
                            
m_creature->GetMotionMaster()->Clear();
                            
m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
                            
m_creature->RemoveFlag(UNIT_FIELD_FLAGSUNIT_FLAG_NON_ATTACKABLE);
                            
SetCombatMovement(true);
                            
stage 5;
                       }
                    break;
            case 
5:           // Phase 2

                    
if (timedQuery(SPELL_SPAWN_DEFILEdiff)) 
                       {
                            
doCast(SPELL_SPAWN_DEFILE);
                            
DoScriptText(-1631531,m_creature);
                       }
                    if (
timedQuery(SPELL_SUMMON_VALKYRdiff)) 
                       {
                            
doCast(SPELL_SUMMON_VALKYR);
                            
DoScriptText(-1631527,m_creature);
                       }

                    
timedCast(SPELL_SOUL_REAPERdiff);
                    
timedCast(SPELL_INFESTdiff);

                    
DoMeleeAttackIfReady();

                    if (
timedQuery(SPELL_BERSERKdiff))
                    {
                        
doCast(SPELL_BERSERK);
                        
DoScriptText(-1631518,m_creature);
                    };

                    if (
m_creature->GetHealthPercent() < 40.0f
                       {
                            
stage 6;
                            
DoScriptText(-1631523,m_creature);
                       }
                    break;
            case 
6:           // Go in transition phase
                    
m_creature->AttackStop();
                    
m_creature->SetFlag(UNIT_FIELD_FLAGSUNIT_FLAG_NON_ATTACKABLE);
                    
SetCombatMovement(false);
                    
StartMovement(1,0);
                    
stage 7;
                    break;
            case 
7:          // Platform restore
                    
if (movementstarted) return;
                    if (
GameObjectpGoFloor pInstance->instance->GetGameObject(pInstance->GetData64(GO_ARTHAS_PLATFORM)))
                    {
                        
pGoFloor->RemoveFlag(GAMEOBJECT_FLAGSGO_FLAG_DAMAGED GO_FLAG_NODESPAWN);
                        
pGoFloor->SetUInt32Value(GAMEOBJECT_BYTES_1,oldflag);
                    }
                    
pInstance->OpenDoor(pInstance->GetData64(GO_FROSTY_WIND));
                    
doCast(SPELL_REMORSELESS_WINTER);
                    
stage 8;
                    break;
            case 
8:
                    
timedCast(SPELL_SUMMON_RAGING_SPIRITdiff);
                    
timedCast(SPELL_SUMMON_ICE_SPHEREdiff);
                    
timedCast(SPELL_PAIN_AND_SUFFERINGdiff);

                    if (
timedQuery(SPELL_BERSERKdiff))
                    {
                        
doCast(SPELL_BERSERK);
                        
DoScriptText(-1631518,m_creature);
                    };

                    if (
timedQuery(SPELL_REMORSELESS_WINTERdiff))
                       {
                            
DoScriptText(-1631524m_creature);
                            
doCast(SPELL_SUMMON_VILE_SPIRITS);
                            for (
uint8 i 0getSpellData(SPELL_SUMMON_VILE_SPIRITS); ++i)
                                 
doCast(NPC_VILE_SPIRIT);
                            
doCast(SPELL_QUAKE);
                            
stage 9;
                            
pInstance->OpenDoor(pInstance->GetData64(GO_SNOW_EDGE));
                       };

                    break;
            case 
9:           // Platform destruct
                    
if (timedQuery(SPELL_QUAKEdiff))
                       {
                            if (
GameObjectpGoFloor pInstance->instance->GetGameObject(pInstance->GetData64(GO_ARTHAS_PLATFORM)))
                            {
                                 
pGoFloor->SetFlag(GAMEOBJECT_FLAGSGO_FLAG_DAMAGED GO_FLAG_NODESPAWN);
                                 
oldflag pGoFloor->GetUInt32Value(GAMEOBJECT_BYTES_1);
                                 
pGoFloor->SetUInt32Value(GAMEOBJECT_BYTES_1,8449);
                            }
                            
pInstance->CloseDoor(pInstance->GetData64(GO_SNOW_EDGE));
                            
pInstance->CloseDoor(pInstance->GetData64(GO_FROSTY_WIND));
                            
m_creature->GetMotionMaster()->Clear();
                            
m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
                            
m_creature->RemoveFlag(UNIT_FIELD_FLAGSUNIT_FLAG_NON_ATTACKABLE);
                            
SetCombatMovement(true);
                            
stage 10;
                       }
                   break;
            case 
10:           // Phase 3
                    
if (timedQuery(SPELL_SPAWN_DEFILEdiff)) 
                       {
                            
doCast(SPELL_SPAWN_DEFILE);
//                            DoScriptText(-1631527,m_creature);
                       
}
                    
timedCast(SPELL_SOUL_REAPERdiff);

                    if (
timedQuery(SPELL_HARVEST_SOULdiff)) 
                       {
                            
doCast(SPELL_HARVEST_SOUL);
                            
DoScriptText(-1631520,m_creature);
                       }

                    
timedCast(SPELL_SOUL_REAPERdiff);
                    
timedCast(SPELL_INFESTdiff);

                    
DoMeleeAttackIfReady();

                    if (
m_creature->GetHealthPercent() < 10.0f
                       {
                            
stage 11;
                            
DoScriptText(-1631513,m_creature);
                       }
                    break;
            case 
11:           // Ending Phase start
                    
m_creature->AttackStop();
                    
SetCombatMovement(false);
                    
StartMovement(6,13000);
                    
stage 12;
                    
battlestarted false;
                    break;
            case 
12:
                    break;
            case 
13:
                    
DoMeleeAttackIfReady();
                    break;
        }
    }
};


CreatureAIGetAI_boss_the_lich_king_icc(CreaturepCreature)
{
    return new 
boss_the_lich_king_iccAI(pCreature);
};

struct MANGOS_DLL_DECL boss_tirion_iccAI : public ScriptedAI
{
    
boss_tirion_iccAI(CreaturepCreature) : ScriptedAI(pCreature)
    {
        
pInstance = (ScriptedInstance*)pCreature->GetInstanceData();
        
Reset();
    }

    
ScriptedInstance *pInstance;
    
uint32 UpdateTimer;
    
uint32 nextEvent;
    
uint32 nextPoint;
    
bool movementstarted;
    
CreaturepMenethil;

    
void Reset()
    {
        if(!
pInstance) return;
        
movementstarted false;
        
m_creature->RemoveAurasDueToSpell(SPELL_ICEBLOCK_TRIGGER);
        
m_creature->SetOrientation(M_PI_F);
    }

    
void StartMovement(uint32 iduint32 _nextEvent)
    {
        
nextPoint id;
        
nextEvent _nextEvent;
        
m_creature->GetMotionMaster()->MovePoint(idSpawnLoc[id].xSpawnLoc[id].ySpawnLoc[id].z);
        
pInstance->SetData(TYPE_EVENT,0);
        
movementstarted true;
    }

    
void MovementInform(uint32 typeuint32 id)
    {
        if (
type != POINT_MOTION_TYPE || !movementstarted) return;
        if (
id == nextPoint
        {
            
movementstarted false;
            
pInstance->SetData(TYPE_EVENT,nextEvent);
            
m_creature->GetMotionMaster()->MovementExpired();
        }
    }

    
void doSendCinematic()
    {
        
Map::PlayerList const &pList m_creature->GetMap()->GetPlayers();
        if (
pList.isEmpty()) return;
        for (
Map::PlayerList::const_iterator i pList.begin(); != pList.end(); ++i)
             if (
PlayerpPlayer i->getSource())
                 if (
pPlayer && pPlayer->isAlive() && pPlayer->IsInMap(m_creature))
                     
pPlayer->SendMovieStart(FINAL_ARTHAS_MOVIE);
    }

    
void doRevivePlayers()
    {
        
Map::PlayerList const &pList pMenethil->GetMap()->GetPlayers();
        if (
pList.isEmpty()) return;
        for (
Map::PlayerList::const_iterator i pList.begin(); != pList.end(); ++i)
            {
               if (
PlayerpPlayer i->getSource())
               {
                   if (
pPlayer && !pPlayer->isAlive() && pPlayer->IsInMap(pMenethil))
                      {
                          
pMenethil->CastSpell(pPlayerSPELL_REVALLtrue);
                          
pPlayer->ResurrectPlayer(100false);
                       }
                }
             };
    }

    
void UpdateAI(const uint32 diff)
    {

        if (
pInstance->GetData(TYPE_LICH_KING) == FAIL && m_creature->HasAura(SPELL_ICEBLOCK_TRIGGER)) 
        {
            
m_creature->RemoveAurasDueToSpell(SPELL_ICEBLOCK_TRIGGER);
            
m_creature->GetMotionMaster()->MoveTargetedHome();
            
Reset();
        }

        if (
pInstance->GetData(TYPE_EVENT_NPC) == NPC_TIRION)
        {
            
UpdateTimer pInstance->GetData(TYPE_EVENT_TIMER);
            if (
UpdateTimer <= diff)
            {
            
debug_log("EventMGR: creature %u received signal %u ",m_creature->GetEntry(),pInstance->GetData(TYPE_EVENT));
            switch (
pInstance->GetData(TYPE_EVENT))
                {
                case 
12030:
                          
m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATEEMOTE_ONESHOT_TALK);
                          
DoScriptText(-1631552m_creature);
                          
UpdateTimer 9000;
                          
pInstance->SetData(TYPE_EVENT,12040);
                          break;
                case 
12050:
                          
m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATEEMOTE_ONESHOT_POINT_NOSHEATHE);
                          
DoScriptText(-1631554m_creature);
                          
UpdateTimer 3000;
                          
pInstance->SetData(TYPE_EVENT,12051);
                          break;
                case 
12051:
                          
m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATEEMOTE_ONESHOT_NONE);
                          
UpdateTimer 1000;
                          
pInstance->SetData(TYPE_EVENT,12052);
                          break;
                case 
12052:
                          
m_creature->RemoveSplineFlag(SPLINEFLAG_WALKMODE);
                          
StartMovement(3,12053);
                          break;
                case 
12053:
                          
UpdateTimer 3000;
                          
pInstance->SetData(TYPE_EVENT,12060);
                          
m_creature->CastSpell(m_creatureSPELL_ICEBLOCK_TRIGGERtrue);
                          break;
                case 
13110:
                          
DoScriptText(-1631555m_creature);
                          
UpdateTimer 6000;
                          
m_creature->CastSpell(m_creatureSPELL_TIRION_LIGHTfalse);
                          
pInstance->SetData(TYPE_EVENT,13120);
                          break;
                case 
13130:
                          
SetCombatMovement(false);
                          
m_creature->RemoveAurasDueToSpell(SPELL_ICEBLOCK_TRIGGER);
                          
UpdateTimer 500;
                          
m_creature->SetOrientation(0.0f);
                          
pInstance->SetData(TYPE_EVENT,13131);
                          break;
                case 
13131:
                          
m_creature->RemoveSplineFlag(SPLINEFLAG_WALKMODE);
                          
StartMovement(2,13132);
                          break;
                case 
13132:
                          
StartMovement(5,13140);
                          
DoScriptText(-1631556m_creature);
                          
m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATEEMOTE_STATE_READY2H);
                          break;
                case 
13150:
                          
UpdateTimer 1000;
                          
pInstance->SetData(TYPE_EVENT,13160);
                          break;
                case 
13170:
                          
UpdateTimer 2000;
                          
pInstance->SetData(TYPE_EVENT,13180);
                          break;
                case 
13190:
                          
UpdateTimer 500;
                          
pInstance->SetData(TYPE_EVENT,13200);
                          break;
                case 
13210:
                          
UpdateTimer 3000;
                          
pInstance->SetData(TYPE_EVENT,13230);
                          break;
                case 
13230:
                          
UpdateTimer 12000;
                          
pMenethil m_creature->SummonCreature(NPC_MENETHILm_creature->GetPositionX()+5m_creature->GetPositionY()+5m_creature->GetPositionZ(), 0TEMPSUMMON_MANUAL_DESPAWN5000);
                          
pInstance->SetData(TYPE_EVENT,13250);
                          
DoScriptText(-1631560pMenethil);
                          break;
                case 
13250:
                          
UpdateTimer 6000;
                          
pInstance->SetData(TYPE_EVENT,13270);
                          
DoScriptText(-1631561pMenethil);
                          
pMenethil->CastSpell(pMenethilSPELL_REVIVE_VISUALfalse);
                          
doRevivePlayers();
                          break;
                case 
13270:
                          
UpdateTimer 6000;
                          
pInstance->SetData(TYPE_EVENT,13280);
                          if (
CreaturepLichKing = (Creature*)Unit::GetUnit((*m_creature),pInstance->GetData64(NPC_LICH_KING)))
                          {
                              
m_creature->SetInCombatWith(pLichKing);
                              
pLichKing->SetInCombatWith(m_creature);
                              
pLichKing->AddThreat(m_creature1000.0f);
                              
m_creature->AI()->AttackStart(pLichKing);
                              
pMenethil->AI()->AttackStart(pLichKing);
                              
SetCombatMovement(true);
                              
m_creature->GetMotionMaster()->MoveChase(pLichKing);
                          };
                          break;
                case 
13290:
                          
UpdateTimer 5000;
                          
pInstance->SetData(TYPE_EVENT,13310);
                          
DoScriptText(-1631590pMenethil);
                          break;
                case 
13310:
                          
UpdateTimer 5000;
                          
pInstance->SetData(TYPE_EVENT,13330);
                          
DoScriptText(-1631591m_creature);
                          break;
                case 
13330:
                          
UpdateTimer 5000;
                          
pInstance->SetData(TYPE_EVENT,13350);
                          
DoScriptText(-1631592pMenethil);
                          break;
                case 
13350:
                          
UpdateTimer 2000;
                          
pInstance->SetData(TYPE_EVENT,13370);
                          
DoScriptText(-1631593m_creature);
                          break;
                case 
14010:
                          
m_creature->AttackStop();
                          
SetCombatMovement(false);
                          
UpdateTimer =90000;
                          
pInstance->SetData(TYPE_EVENT,14030);
                          
m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATEEMOTE_ONESHOT_NONE);
                          if (
CreaturepLichKing = (Creature*)Unit::GetUnit((*m_creature),pInstance->GetData64(NPC_LICH_KING)))
                              
pLichKing->RemoveFlag(UNIT_DYNAMIC_FLAGSUNIT_DYNFLAG_LOOTABLE);
                          
doSendCinematic();
                          break;
                case 
14030:
                          
UpdateTimer 20000;
                          
pInstance->SetData(TYPE_EVENT,14030);
                          
DoScriptText(-1631594m_creature);
//                          if (pMenethil && pMenethil->isAlive()) pMenethil->ForcedDespawn();
                          
if (pMenethil && pMenethil->isAlive()) pMenethil->SetVisibility(VISIBILITY_OFF);
                          if (
CreaturepLichKing = (Creature*)Unit::GetUnit((*m_creature),pInstance->GetData64(NPC_LICH_KING)))
                              
pLichKing->SetFlag(UNIT_DYNAMIC_FLAGSUNIT_DYNFLAG_LOOTABLE);
                          
pInstance->SetData(TYPE_EVENT,0);
                          
EnterEvadeMode();
                          break;
                default:
                          break;
                }
             } else 
UpdateTimer -= diff;
             
pInstance->SetData(TYPE_EVENT_TIMERUpdateTimer);
        }

        if (!
m_creature->SelectHostileTarget() || !m_creature->getVictim())
            return;
        
DoMeleeAttackIfReady();
    }


};

bool GossipHello_boss_tirion_icc(PlayerpPlayerCreaturepCreature)
{
    
ScriptedInstancepInstance;
    
pInstance = (ScriptedInstance*)pCreature->GetInstanceData();

    if (
pInstance->GetData(TYPE_LICH_KING) != NOT_STARTED &&
        
pInstance->GetData(TYPE_LICH_KING) != FAIL )
        {
            
pPlayer->PlayerTalkClass->SendGossipMenu(721002pCreature->GetGUID());
            return 
true;
        };

    
pPlayer->ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, -1631608GOSSIP_SENDER_MAINGOSSIP_ACTION_INFO_DEF);
    
pPlayer->PlayerTalkClass->SendGossipMenu(721001pCreature->GetGUID());
    return 
true;
};

bool GossipSelect_boss_tirion_icc(PlayerpPlayerCreaturepCreatureuint32 uiSenderuint32 uiAction)
{
    
ScriptedInstancepInstance;
    
pInstance = (ScriptedInstance*)pCreature->GetInstanceData();
    if (!
pInstance) return false;

    if (
uiAction == GOSSIP_ACTION_INFO_DEF)
    {
        
pPlayer->CLOSE_GOSSIP_MENU();
        
pInstance->SetData(TYPE_LICH_KINGIN_PROGRESS);
        
pInstance->SetData(TYPE_EVENT,12000);
        return 
true;
    } else return 
false;
};

CreatureAIGetAI_boss_tirion_icc(CreaturepCreature)
{
    return new 
boss_tirion_iccAI(pCreature);
};

struct MANGOS_DLL_DECL  mob_ice_sphere_iccAI : public BSWScriptedAI
{
    
mob_ice_sphere_iccAI(Creature *pCreature) : BSWScriptedAI(pCreature
    {
        
pInstance = (ScriptedInstance*)pCreature->GetInstanceData();
        
Reset();
    }

    
ScriptedInstance *pInstance;

    
void Reset()
    {
       
resetTimers();
       
doCast(SPELL_ICE_SPHERE_VISUAL);
       
m_creature->AddSplineFlag(SPLINEFLAG_WALKMODE);
    }


    
void UpdateAI(const uint32 uiDiff)
    {
        if (!
pInstance || pInstance->GetData(TYPE_LICH_KING) != IN_PROGRESS
              
m_creature->ForcedDespawn();

        if (!
m_creature->SelectHostileTarget() || !m_creature->getVictim())
            {
                if (
UnitpTarget doSelectRandomPlayerAtRange(120.0f))
                {
                   
m_creature->SetInCombatWith(pTarget);
                   
m_creature->AddThreat(pTarget,100.0f);
                }
            return;
            }

        if (
m_creature->getVictim()->GetTypeId() != TYPEID_PLAYER
            return;

        
timedCast(SPELL_ICE_PULSEuiDiff);

        if (
m_creature->IsWithinDistInMap(m_creature->getVictim(), 1.0f))
            
timedCast(SPELL_ICE_BURST,uiDiff);
    }
};

CreatureAIGetAI_mob_ice_sphere_icc(CreaturepCreature)
{
    return new 
mob_ice_sphere_iccAI(pCreature);
};

struct MANGOS_DLL_DECL mob_defiler_iccAI : public BSWScriptedAI
{
    
mob_defiler_iccAI(Creature *pCreature) : BSWScriptedAI(pCreature)
    {
        
m_pInstance = ((ScriptedInstance*)pCreature->GetInstanceData());
        
Reset();
    }

    
ScriptedInstance *m_pInstance;
    
uint32 life_timer;
    
float m_Size0;
    
float m_Size;

    
void Reset()
    {
        
SetCombatMovement(false);
        
life_timer 30000;
        
m_creature->SetFlag(UNIT_FIELD_FLAGSUNIT_FLAG_NON_ATTACKABLE);
        
m_creature->SetFlag(UNIT_FIELD_FLAGSUNIT_FLAG_NOT_SELECTABLE);
        
m_creature->CastSpell(m_creatureSPELL_DEFILEtrue);
        
m_Size0 m_creature->GetFloatValue(OBJECT_FIELD_SCALE_X);
        
m_Size m_Size0;
    }

    
void AttackStart(Unit *pWho)
    {
        return;
    }

    
bool doSearchPlayers()
    {
        if(
doSelectRandomPlayerAtRange(m_Size 3.0f)) return true;
        else return 
false;
    }

    
void UpdateAI(const uint32 uiDiff)
    {
        if(
m_pInstance && m_pInstance->GetData(TYPE_LICH_KING) != IN_PROGRESS)
            
m_creature->ForcedDespawn();

        if (
life_timer <= uiDiff)
            
m_creature->ForcedDespawn();
        else 
life_timer -= uiDiff;

        if (
doSearchPlayers() && m_Size <= m_Size0 6.0f) {
                
m_Size m_Size*1.01;
                
m_creature->SetFloatValue(OBJECT_FIELD_SCALE_Xm_Size);
                }

    }

};

CreatureAIGetAI_mob_defiler_icc(CreaturepCreature)
{
    return new 
mob_defiler_iccAI(pCreature);
}

struct MANGOS_DLL_DECL mob_strangulate_vehicleAI : public ScriptedAI
{
    
mob_strangulate_vehicleAI(Creature *pCreature) : ScriptedAI(pCreature)
    {
        
m_pInstance = ((ScriptedInstance*)pCreature->GetInstanceData());
        
Reset();
    }

    
ScriptedInstance *m_pInstance;

    
void Reset()
    {
        
SetCombatMovement(false);
        
m_creature->SetFlag(UNIT_FIELD_FLAGSUNIT_FLAG_NON_ATTACKABLE);
        
m_creature->SetFlag(UNIT_FIELD_FLAGSUNIT_FLAG_NOT_SELECTABLE);
    }

    
void AttackStart(Unit *pWho)
    {
        return;
    }

    
void UpdateAI(const uint32 uiDiff)
    {
       
m_creature->ForcedDespawn();
    }

};

CreatureAIGetAI_mob_strangulate_vehicle(CreaturepCreature)
{
    return new 
mob_strangulate_vehicleAI(pCreature);
}

struct MANGOS_DLL_DECL  mob_vile_spiritAI : public BSWScriptedAI
{
    
mob_vile_spiritAI(Creature *pCreature) : BSWScriptedAI(pCreature
    {
        
pInstance = (ScriptedInstance*)pCreature->GetInstanceData();
        
Reset();
    }

    
ScriptedInstance *pInstance;
    
bool movementstarted;

    
void Reset()
    {
       
resetTimers();
       if (
UnitpTarget doSelectRandomPlayerAtRange(120.0f))
           {
               
m_creature->SetInCombatWith(pTarget);
               
m_creature->AddThreat(pTarget,1000.0f);
           }
       
SetCombatMovement(false);
       
movementstarted false;
       
m_creature->AddSplineFlag(SPLINEFLAG_WALKMODE);
    }


    
void UpdateAI(const uint32 uiDiff)
    {
        if (!
pInstance || pInstance->GetData(TYPE_LICH_KING) != IN_PROGRESS
              
m_creature->ForcedDespawn();

        if (!
m_creature->SelectHostileTarget() || !m_creature->getVictim())
            return;

        if (
timedQuery(SPELL_SPIRITS_BURSTuiDiff) && !movementstarted)
        {
           
SetCombatMovement(true);
           
m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
           
movementstarted true;
        }

        if (
m_creature->getVictim()->GetTypeId() != TYPEID_PLAYER
            return;

        if (
m_creature->IsWithinDistInMap(m_creature->getVictim(), 1.0f))
        {
            
doCast(SPELL_SPIRITS_BURST);
            
m_creature->ForcedDespawn();
        };
    }
};

CreatureAIGetAI_mob_vile_spirit(CreaturepCreature)
{
    return new 
mob_vile_spiritAI(pCreature);
}

struct MANGOS_DLL_DECL  mob_raging_spiritAI : public BSWScriptedAI
{
    
mob_raging_spiritAI(Creature *pCreature) : BSWScriptedAI(pCreature
    {
        
pInstance = (ScriptedInstance*)pCreature->GetInstanceData();
        
Reset();
    }

    
ScriptedInstance *pInstance;

    
void Reset()
    {
        
resetTimers();
        
m_creature->SetDisplayId(10771);
    }

    
void UpdateAI(const uint32 uiDiff)
    {
        if (!
pInstance || pInstance->GetData(TYPE_LICH_KING) != IN_PROGRESS
              
m_creature->ForcedDespawn();

        if (!
m_creature->SelectHostileTarget() || !m_creature->getVictim())
            return;

            
timedCast(SPELL_SOUL_SHRIEKuiDiff);
    }
};

CreatureAIGetAI_mob_raging_spirit(CreaturepCreature)
{
    return new 
mob_raging_spiritAI(pCreature);
}

void AddSC_boss_the_lich_king_icc()
{
    
Script *newscript;

    
newscript = new Script;
    
newscript->Name "boss_the_lich_king_icc";
    
newscript->GetAI = &GetAI_boss_the_lich_king_icc;
    
newscript->RegisterSelf();

    
newscript = new Script;
    
newscript->Name "boss_tirion_icc";
    
newscript->GetAI = &GetAI_boss_tirion_icc;
    
newscript->pGossipHello = &GossipHello_boss_tirion_icc;
    
newscript->pGossipSelect = &GossipSelect_boss_tirion_icc;
    
newscript->RegisterSelf();

    
newscript = new Script;
    
newscript->Name "mob_ice_sphere_icc";
    
newscript->GetAI = &GetAI_mob_ice_sphere_icc;
    
newscript->RegisterSelf();

    
newscript = new Script;
    
newscript->Name "mob_defiler_icc";
    
newscript->GetAI = &GetAI_mob_defiler_icc;
    
newscript->RegisterSelf();

    
newscript = new Script;
    
newscript->Name "mob_strangulate_vehicle";
    
newscript->GetAI = &GetAI_mob_strangulate_vehicle;
    
newscript->RegisterSelf();

    
newscript = new Script;
    
newscript->Name "mob_vile_spirit";
    
newscript->GetAI = &GetAI_mob_vile_spirit;
    
newscript->RegisterSelf();

    
newscript = new Script;
    
newscript->Name "mob_raging_spirit";
    
newscript->GetAI = &GetAI_mob_raging_spirit;
    
newscript->RegisterSelf();

}; 
Can you make this script in your next update is the lichking fight



PHP Code:
// Script Generated: 2010-03-29 23:23:48
// Run this query on your world database
// UPDATE `creature_template` SET ScriptName='npc_Professor Putricide' WHERE `entry`=36678;
#include "precompiled.h"


struct MANGOS_DLL_DECL Professor PutricideAI : public ScriptedAI
{
    
Professor PutricideAI(CreaturepCreature) : ScriptedAI(pCreature)
    {
        
Reset();
    }

    
uint32 spell1_phase1_Timer;
    
uint32 spell2_phase1_Timer;
    
uint32 spell3_phase1_Timer;
    
uint32 spell4_phase1_Timer;
    
uint32 spell5_phase1_Timer;
    
uint32 spell6_phase1_Timer;
    
uint32 spell1_phase2_Timer;
    
uint32 spell2_phase2_Timer;
    
uint32 spell3_phase2_Timer;
    
uint32 spell4_phase2_Timer;
    
uint32 spell5_phase2_Timer;
    
uint32 spell6_phase2_Timer;
    
uint32 spell1_phase3_Timer;
    
uint32 spell2_phase3_Timer;
    
uint32 phase;

    
void Aggro(UnitpWho)
    {
    }

    
void KilledUnit(UnitpVictim)
    {
    }

    
void JustDied(UnitpKiller)
    {
    }

    
void Reset()
    {
        
spell1_phase1_Timer 20000+rand()%20000;
        
spell2_phase1_Timer 80000+rand()%20000;
        
spell3_phase1_Timer 20000+rand()%20000;
        
spell4_phase1_Timer 20000+rand()%20000;
        
spell5_phase1_Timer 50000+rand()%30000;
        
spell6_phase1_Timer 80000+rand()%20000;
        
spell1_phase2_Timer 20000+rand()%20000;
        
spell2_phase2_Timer 60000+rand()%20000;
        
spell3_phase2_Timer 50000+rand()%30000;
        
spell4_phase2_Timer 50000+rand()%30000;
        
spell5_phase2_Timer 30000+rand()%30000;
        
spell6_phase2_Timer 50000+rand()%40000;
        
spell1_phase3_Timer 20000+rand()%20000;
        
spell2_phase3_Timer 10000+rand()%10000;
        
phase 0;
    }

    
void UpdateAI(const uint32 diff)
    {
        if (!
m_creature->SelectHostileTarget() || !m_creature->getVictim())
            return;

        if (
phase == 1)
        {

            if (
spell1_phase1_Timer <= diff)
            {
                
DoCastSpellIfCan(SelectUnit(SELECT_TARGET_RANDOM0), 70346);
                
spell1_phase1_Timer 20000+rand()%20000;
            } else 
spell1_phase1_Timer -= diff;

            if (
spell2_phase1_Timer <= diff)
            {
                
DoCastSpellIfCan(SelectUnit(SELECT_TARGET_RANDOM0), 71968);
                
spell2_phase1_Timer 80000+rand()%20000;
            } else 
spell2_phase1_Timer -= diff;

            if (
spell3_phase1_Timer <= diff)
            {
                
DoCastSpellIfCan(m_creature->getVictim(), 70672);
                
spell3_phase1_Timer 20000+rand()%20000;
            } else 
spell3_phase1_Timer -= diff;

            if (
spell4_phase1_Timer <= diff)
            {
                
DoCastSpellIfCan(SelectUnit(SELECT_TARGET_RANDOM0), 70701);
                
spell4_phase1_Timer 20000+rand()%20000;
            } else 
spell4_phase1_Timer -= diff;

            if (
spell5_phase1_Timer <= diff)
            {
                
DoCastSpellIfCan(m_creature->getVictim(), 70447);
                
spell5_phase1_Timer 50000+rand()%30000;
            } else 
spell5_phase1_Timer -= diff;

            if (
spell6_phase1_Timer <= diff)
            {
                
DoCastSpellIfCan(SelectUnit(SELECT_TARGET_RANDOM0), 71617);
                
spell6_phase1_Timer 80000+rand()%20000;
            } else 
spell6_phase1_Timer -= diff;
        }

        if (
phase == 2)
        {

            if (
spell1_phase2_Timer <= diff)
            {
                
DoCastSpellIfCan(SelectUnit(SELECT_TARGET_RANDOM0), 70346);
                
spell1_phase2_Timer 20000+rand()%20000;
            } else 
spell1_phase2_Timer -= diff;

            if (
spell2_phase2_Timer <= diff)
            {
                
DoCastSpellIfCan(m_creature->getVictim(), 71968);
                
spell2_phase2_Timer 60000+rand()%20000;
            } else 
spell2_phase2_Timer -= diff;

            if (
spell3_phase2_Timer <= diff)
            {
                
DoCastSpellIfCan(SelectUnit(SELECT_TARGET_RANDOM0), 70672);
                
spell3_phase2_Timer 50000+rand()%30000;
            } else 
spell3_phase2_Timer -= diff;

            if (
spell4_phase2_Timer <= diff)
            {
                
DoCastSpellIfCan(m_creature->getVictim(), 70447);
                
spell4_phase2_Timer 50000+rand()%30000;
            } else 
spell4_phase2_Timer -= diff;

            if (
spell5_phase2_Timer <= diff)
            {
                
DoCastSpellIfCan(SelectUnit(SELECT_TARGET_RANDOM0), 71278);
                
spell5_phase2_Timer 30000+rand()%30000;
            } else 
spell5_phase2_Timer -= diff;

            if (
spell6_phase2_Timer <= diff)
            {
                
DoCastSpellIfCan(SelectUnit(SELECT_TARGET_RANDOM0), 72297);
                
spell6_phase2_Timer 50000+rand()%40000;
            } else 
spell6_phase2_Timer -= diff;
        }

        if (
phase == 3)
        {

            if (
spell1_phase3_Timer <= diff)
            {
                
DoCastSpellIfCan(m_creature71603);
                
spell1_phase3_Timer 20000+rand()%20000;
            } else 
spell1_phase3_Timer -= diff;

            if (
spell2_phase3_Timer <= diff)
            {
                
DoCastSpellIfCan(SelectUnit(SELECT_TARGET_RANDOM0), 72672);
                
spell2_phase3_Timer 10000+rand()%10000;
            } else 
spell2_phase3_Timer -= diff;
        }

        
DoMeleeAttackIfReady();
    }
};

CreatureAIGetAIProfessor Putricide(CreaturepCreature)
{
    return new 
Professor PutricideAI (pCreature);
}

void AddSC_Professor Putricide()
{
    
Script *newscript;
    
newscript = new Script;
    
newscript->Name "npc_Professor Putricide";
    
newscript->GetAI = &GetAIProfessor Putricide;
    
newscript->RegisterSelf();

this is the script from Professor Putricide or is this wrong for mangos


scripts/northrend/icecrown_citadel/icecrown_citadel at master from rsa's scriptdev2 - GitHub

on the page you will find scritps
Ellenya, DO NOT ask for things like this. It is against forum rules. If Cthulhu wants to add this, he will. But on his own time. Do not push for things like this, or you will be infracted. You have been warned.