Example #1
0
    void JustDied(Unit*)
    {
        DoScriptText(SAY_DEATH, me);
        for (int i=0; i<5; i++)
            if (GuardiansOfIcecrown[i])
        {
            Unit* pUnit = Unit::GetUnit((*me), GuardiansOfIcecrown[i]);
            if (!pUnit || !pUnit->isAlive())
                continue;

            pUnit->CombatStop();
            float Walk_Pos_X = 0;
            float Walk_Pos_Y = 0;
            float Walk_Pos_Z = 0;
            switch (rand()%6)
            {
                case 0:
                    Walk_Pos_X = ADDX_LEFT_FAR;
                    Walk_Pos_Y = ADDY_LEFT_FAR;
                    Walk_Pos_Z = ADDZ_LEFT_FAR;
                    break;
                case 1:
                    Walk_Pos_X = ADDX_LEFT_MIDDLE;
                    Walk_Pos_Y = ADDY_LEFT_MIDDLE;
                    Walk_Pos_Z = ADDZ_LEFT_MIDDLE;
                    break;
                case 2:
                    Walk_Pos_X = ADDX_LEFT_NEAR;
                    Walk_Pos_Y = ADDY_LEFT_NEAR;
                    Walk_Pos_Z = ADDZ_LEFT_NEAR;
                    break;
                case 3:
                    Walk_Pos_X = ADDX_RIGHT_FAR;
                    Walk_Pos_Y = ADDY_RIGHT_FAR;
                    Walk_Pos_Z = ADDZ_RIGHT_FAR;
                    break;
                case 4:
                    Walk_Pos_X = ADDX_RIGHT_MIDDLE;
                    Walk_Pos_Y = ADDY_RIGHT_MIDDLE;
                    Walk_Pos_Z = ADDZ_RIGHT_MIDDLE;
                    break;
                case 5:
                    Walk_Pos_X = ADDX_RIGHT_NEAR;
                    Walk_Pos_Y = ADDY_RIGHT_NEAR;
                    Walk_Pos_Z = ADDZ_RIGHT_NEAR;
                    break;
            }
            pUnit->SendMonsterMoveWithSpeed(Walk_Pos_X, Walk_Pos_Y, Walk_Pos_Z,MOVEFLAG_WALK_MODE);
        }
    }
Example #2
0
    void UpdateAI(const uint32 diff)
    {
         if (!UpdateVictim())
            return;

        if (me->getVictim() && me->isAlive())
        {
            //Check for Frost Bolt
            if (FrostBolt_Timer <= diff)
            {
                DoCast(me->getVictim(),SPELL_FROST_BOLT);
                //Cast again on time
                FrostBolt_Timer = (rand()%60)*1000;
            } else FrostBolt_Timer -= diff;

            //Check for Frost Bolt Nova
            if (FrostBoltNova_Timer <= diff)
            {
                DoCast(me->getVictim(),SPELL_FROST_BOLT_NOVA);
                FrostBoltNova_Timer = 15000;
            } else FrostBoltNova_Timer -= diff;

            //Check for Chains Of Kelthuzad
            if (ChainsOfKelthuzad_Timer <= diff)
            {
                //DoCast(me->getVictim(),SPELL_CHAINS_OF_KELTHUZAD);

                //if (rand()%2 == 0)
                   //DoScriptText(SAY_CHAIN1, me);
                //else
                    //DoScriptText(SAY_CHAIN2, me);
                ChainsOfKelthuzad_Timer = (rand()%30+30)*1000;
            } else ChainsOfKelthuzad_Timer -= diff;

            //Check for Mana Detonation
            if (ManaDetonation_Timer <= diff)
            {
                //time to cast
                DoCast(me->getVictim(),SPELL_MANA_DETONATION);

                 if (rand()%2)
                     DoScriptText(SAY_SPECIAL1_MANA_DET, me);
                ManaDetonation_Timer = 20000;
            } else ManaDetonation_Timer -= diff;

            //Check for Shadow Fissure
            if (ShadowFisure_Timer <= diff)
            {
                DoCast(me->getVictim(),SPELL_SHADOW_FISURE);

               if (rand()%2)
                   DoScriptText(SAY_SPECIAL3_MANA_DET, me);
                ShadowFisure_Timer = 25000;
            } else ShadowFisure_Timer -= diff;

            //Check for Frost Blast
            if (FrostBlast_Timer <= diff)
            {
                //time to cast
                DoCast(me->getVictim(),SPELL_FROST_BLAST);

                if (rand()%2 == 0)
                    DoScriptText(SAY_FROST_BLAST, me);
                FrostBlast_Timer = (rand()%30+30)*1000;
            } else FrostBlast_Timer -= diff;

            //start phase 3 when we are 40% health
            if (!Phase3 && (me->GetHealth()*100 / me->GetMaxHealth()) < 40)
            {
                Phase3 = true;
                    DoScriptText(SAY_REQUEST_AID, me);
                //here Lich King should respond to KelThuzad but I don't know which creature to make talk
                //so for now just make Kelthuzad says it.
                DoScriptText(SAY_ANSWER_REQUEST, me);
            }

            if (Phase3 && (GuardiansOfIcecrown_Count < 5))
            {
                if (GuardiansOfIcecrown_Timer <= diff)
                {
                    //Summon a Guardian of Icecrown in a random alcove (Creature # 16441)
                    //uint32 TimeToWalk;
                    Unit* pUnit = NULL;
                    float Walk_Pos_X;
                    float Walk_Pos_Y;
                    float Walk_Pos_Z;
                    switch (rand()%6)
                    {
                        case 0:
                            pUnit = me->SummonCreature(16441,ADDX_LEFT_FAR,ADDY_LEFT_FAR,ADDZ_LEFT_FAR,ADDO_LEFT_FAR,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,1000);
                            //Setting walk position
                            Walk_Pos_X = WALKX_LEFT_FAR;
                            Walk_Pos_Y = WALKY_LEFT_FAR;
                            Walk_Pos_Z = WALKZ_LEFT_FAR;
                            break;
                        case 1:
                            pUnit = me->SummonCreature(16441,ADDX_LEFT_MIDDLE,ADDY_LEFT_MIDDLE,ADDZ_LEFT_MIDDLE,ADDO_LEFT_MIDDLE,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,1000);
                            //Start moving guardian towards the center of the room
                            Walk_Pos_X = WALKX_LEFT_MIDDLE;
                            Walk_Pos_Y = WALKY_LEFT_MIDDLE;
                            Walk_Pos_Z = WALKZ_LEFT_MIDDLE;
                            break;
                        case 2:
                            pUnit = me->SummonCreature(16441,ADDX_LEFT_NEAR,ADDY_LEFT_NEAR,ADDZ_LEFT_NEAR,ADDO_LEFT_NEAR,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,1000);
                            //Start moving guardian towards the center of the room
                            Walk_Pos_X = WALKX_LEFT_NEAR;
                            Walk_Pos_Y = WALKY_LEFT_NEAR;
                            Walk_Pos_Z = WALKZ_LEFT_NEAR;
                            break;
                        case 3:

                            pUnit = me->SummonCreature(16441,ADDX_RIGHT_FAR,ADDY_RIGHT_FAR,ADDZ_RIGHT_FAR,ADDO_RIGHT_FAR,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,1000);
                            //Start moving guardian towards the center of the room
                            Walk_Pos_X = WALKX_RIGHT_FAR;
                            Walk_Pos_Y = WALKY_RIGHT_FAR;
                            Walk_Pos_Z = WALKZ_RIGHT_FAR;
                            break;
                        case 4:
                            pUnit = me->SummonCreature(16441,ADDX_RIGHT_MIDDLE,ADDY_RIGHT_MIDDLE,ADDZ_RIGHT_MIDDLE,ADDO_RIGHT_MIDDLE,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,1000);
                            //Start moving guardian towards the center of the room
                            Walk_Pos_X = WALKX_RIGHT_MIDDLE;
                            Walk_Pos_Y = WALKY_RIGHT_MIDDLE;
                            Walk_Pos_Z = WALKZ_RIGHT_MIDDLE;
                            break;
                        case 5:
                            pUnit = me->SummonCreature(16441,ADDX_RIGHT_NEAR,ADDY_RIGHT_NEAR,ADDZ_RIGHT_NEAR,ADDO_RIGHT_NEAR,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,1000);
                            //Start moving guardian towards the center of the room
                            Walk_Pos_X = WALKX_RIGHT_NEAR;
                            Walk_Pos_Y = WALKY_RIGHT_NEAR;
                            Walk_Pos_Z = WALKZ_RIGHT_NEAR;
                            break;
                    }

                    if (pUnit)
                    {
                        //if we find no one to figth walk to the center
                        if (!pUnit->isInCombat())
                            pUnit->SendMonsterMoveWithSpeed(Walk_Pos_X,Walk_Pos_Y,Walk_Pos_Z,MOVEFLAG_WALK_MODE);

                        //Safe storing of creatures
                        GuardiansOfIcecrown[GuardiansOfIcecrown_Count] = pUnit->GetGUID();

                        //Update guardian count
                        GuardiansOfIcecrown_Count++;

                    }
                    //5 seconds until summoning next guardian
                    GuardiansOfIcecrown_Timer = 5000;
                }
                else GuardiansOfIcecrown_Timer -= diff;
            }

            DoMeleeAttackIfReady();
        }
    }