Ejemplo n.º 1
0
 void SetEnding()
 {
     m_uiEndingTimer    = 4000;
     m_uiEndingPhase    = 1;
     EndingPhase();
 }
Ejemplo n.º 2
0
    void UpdateAI(const uint32 uiDiff)
    {
        if(!UpdateVictim())
            return;

        if (m_uiResetTimer <= uiDiff)
        {
            if (me->GetDistance2d(me->GetHomePosition().GetPositionX(), me->GetHomePosition().GetPositionY()) > 80)
                EnterEvadeMode();
            m_uiResetTimer = 5000;
        } else m_uiResetTimer -= uiDiff;

        if(TransitionPhase3 == false)
        {
            if (m_uiRandomSpeechTimer < uiDiff)
            {
                DoScriptText(SAY_RANDOM, me);
                m_uiRandomSpeechTimer = 33000;
            } else m_uiRandomSpeechTimer -= uiDiff;
        }

        if (m_uiBerserkTimer < uiDiff)
        {
            DoScriptText(SAY_BERSERK, me);
            DoCast(me, SPELL_BERSERK);
            m_uiBerserkTimer = 900000;
        }
        else m_uiBerserkTimer -= uiDiff;

        if(m_uiPhase == 1)
        {
            if (getDifficulty() == RAID_DIFFICULTY_10MAN_HEROIC || getDifficulty() == RAID_DIFFICULTY_25MAN_HEROIC)
            {
                if (m_uiSummonShadowTrap < uiDiff)
                {
                    Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,1);
                    DoCast(pTarget, SPELL_SUMMON_SHADOW_TRAP);
                    m_uiSummonShadowTrap = 30000;
                } else m_uiSummonShadowTrap -= uiDiff;
            }

            if (m_uiInfestTimer < uiDiff)
            {
                Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,1);
                DoCast(pTarget, SPELL_INFEST);
                m_uiInfestTimer = 30000;
            } else m_uiInfestTimer -= uiDiff;

            if (m_uiPlagueSiphonTimer < uiDiff)
            {
                DoCast(me, SPELL_PLAGUE_SIPHON);
                m_uiPlagueSiphonTimer = 30000;
            } else m_uiPlagueSiphonTimer -= uiDiff;

            if (m_uiSummonDrudgeGhoulsTimer < uiDiff)
            {
                DoCast(SPELL_SUMMON_DRUDGE_GHOULS);
                m_uiSummonDrudgeGhoulsTimer = 20000;
            } else m_uiSummonDrudgeGhoulsTimer -= uiDiff;

            if (m_uiSummonShamblingHorrorTimer < uiDiff)
            {
                DoCast(me, SPELL_SUMMON_SHAMBLING_HORROR);
                m_uiSummonShamblingHorrorTimer = 40000;
            } else m_uiSummonShamblingHorrorTimer -= uiDiff;

            if (m_uiNecroticPlagueTimer < uiDiff)
            {
                Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,1);
                DoCast(pTarget, SPELL_NECROTIC_PLAGUE);
                m_uiNecroticPlagueTimer = 5000;
            } else m_uiNecroticPlagueTimer -= uiDiff;
        }

        if(TransitionPhase1 == true)
        {
            if (m_uiRemorselesWinterTimer < uiDiff)
            {
                DoScriptText(SAY_REMORSELESS_WINTER, me);
                DoCast(me, SPELL_REMORSELES_WINTER);
                m_uiRemorselesWinterTimer = 90000;
            } else m_uiRemorselesWinterTimer -= uiDiff;

            if (m_uiSummonSpiritTimer < uiDiff)
            {
                Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,1);
                DoCast(pTarget, SPELL_SUMMON_RAGING_SPIRIT);
                m_uiSummonSpiritTimer    = 16000;
            } else m_uiSummonSpiritTimer -= uiDiff;

            if (m_uiIcePulsSummonTimer < uiDiff)
            {
                DoCast(SPELL_SUMMON_ICE_SPEHERE);
                m_uiIcePulsSummonTimer    = 15000;
            } else m_uiIcePulsSummonTimer -= uiDiff;

            if (m_uiPainandSufferingTimer < uiDiff)
            {
                Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 1);
                DoCast(pTarget, SPELL_PAIN_AND_SUFFERING);
                m_uiPainandSufferingTimer = 2000;
            } else m_uiPainandSufferingTimer -= uiDiff;

            if (m_uiQuakeTimer < uiDiff)
            {
                DoScriptText(SAY_BROKEN_ARENA, me);
                DoCast(SPELL_QUAKE);
                me->SetReactState(REACT_AGGRESSIVE);
                me->GetMotionMaster()->Clear();
                me->GetMotionMaster()->MoveChase(me->getVictim());
                m_uiPhase = 2;
                TransitionPhase1 = false;

            } else m_uiQuakeTimer -= uiDiff;
        }

        if(m_uiPhase == 2)
        {
            if (m_uiDefileTimer < uiDiff)
            {
                Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,1);
                DoCast(pTarget, SPELL_SPAWN_DEFILE);
                m_uiDefileTimer = 20000;
            } else m_uiDefileTimer -= uiDiff;

            if (m_uiSummonValkyrTimer < uiDiff)
            {
                DoScriptText(SAY_SUMMON_VALKYR, me);
                DoCast(me, SPELL_SUMMON_VALKYR);
                m_uiSummonValkyrTimer = 20000;
            } else m_uiSummonValkyrTimer -= uiDiff;

            if (m_uiSoulReaperTimer < uiDiff)
            {
                DoCast(me->getVictim(), SPELL_SOUL_REAPER);
                m_uiSoulReaperTimer = 20000;
            } else m_uiSoulReaperTimer -= uiDiff;

            if (m_uiInfestTimer < uiDiff)
            {
                DoCast(me, SPELL_INFEST);
                m_uiInfestTimer = 30000;
            } else m_uiInfestTimer -= uiDiff;
        }

        if(TransitionPhase2 = true)
        {
            if (m_uiRemorselesWinterTimer < uiDiff)
            {
                DoScriptText(SAY_REMORSELESS_WINTER, me);
                DoCast(me, SPELL_REMORSELES_WINTER);
                m_uiRemorselesWinterTimer = 90000;
            } else m_uiRemorselesWinterTimer -= uiDiff;

            if (m_uiSummonSpiritTimer < uiDiff)
            {
                Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,1);
                DoCast(pTarget, SPELL_SUMMON_RAGING_SPIRIT);
                m_uiSummonSpiritTimer = 16000;
            } else m_uiSummonSpiritTimer -= uiDiff;

            if (m_uiIcePulsSummonTimer < uiDiff)
            {
                DoCast(me, SPELL_SUMMON_ICE_SPEHERE);
                m_uiIcePulsSummonTimer    = 15000;
            } else m_uiIcePulsSummonTimer -= uiDiff;

            if (m_uiPainandSufferingTimer < uiDiff)
            {
                Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,1);
                DoCast(pTarget, SPELL_PAIN_AND_SUFFERING);
                m_uiPainandSufferingTimer = 3000;
            } else m_uiPainandSufferingTimer -= uiDiff;

            if (m_uiQuakeTimer < uiDiff)
            {
                DoScriptText(SAY_BROKEN_ARENA, me);
                DoCast(me, SPELL_QUAKE);
                me->SetReactState(REACT_AGGRESSIVE);
                me->GetMotionMaster()->Clear();
                me->GetMotionMaster()->MoveChase(me->getVictim());
                m_uiPhase = 3;
                TransitionPhase2 = false;
            } else m_uiQuakeTimer -= uiDiff;
        }

        if(m_uiPhase == 3)
        {
            if (m_uiSummonVileSpiritTimer < uiDiff)
            {
                DoCast(me, SPELL_SUMMON_VILE_SPIRIT);
                m_uiSummonVileSpiritTimer = 30000;
            } else m_uiSummonVileSpiritTimer -= uiDiff;

            if (m_uiHarvestSoulTimer < uiDiff)
            {
                DoScriptText(SAY_HARVEST_SOUL, me);
                Unit* pTarget = SelectUnit(SELECT_TARGET_TOPAGGRO, 0);
                DoCast(pTarget, SPELL_HARVEST_SOULS);
                m_uiHarvestSoulTimer = 70000;
            } else m_uiHarvestSoulTimer -= uiDiff;
        }

        DoMeleeAttackIfReady();

        if (m_uiEndingTimer <= uiDiff)
            EndingPhase();
        else m_uiEndingTimer -= uiDiff;

        if(me->GetHealth()*100 / me->GetMaxHealth() < 70)
        {
            if(TransitionPhase1 = false)
            {
                TransitionPhase1 = true;
                Phasenswitch();
            }
        }

        if(me->GetHealth()*100 / me->GetMaxHealth() < 40)
        {
            if(TransitionPhase2 = false)
            {
                m_uiPhase = 3;
                m_uiRemorselesWinterTimer = 5000;
                m_uiQuakeTimer = 70000;
                m_uiIcePulsSummonTimer    = 10000;
                m_uiPainandSufferingTimer = 10000;
                m_uiSummonSpiritTimer = 18000;
                Phasenswitch();
                TransitionPhase2 = true;
            }
        }

        if(me->GetHealth()*100 / me->GetMaxHealth() < 11)
        {
            if(!TriggerSpawned)
            {
                pSafeZone = me->SummonCreature(CREATURE_TRIGGER, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_CORPSE_DESPAWN, 360000);
                pSafeZone->AI()->AttackStart(me);
                pSafeZone->SetDisplayId(MODEL_INVISIBLE);
                TriggerSpawned = true;
        }   }

        if(me->GetHealth()*100 / me->GetMaxHealth() < 10)
        {
            if(TransitionPhase3 = false)
            {
                TransitionPhase3 = true;
                SetEnding();
            }
        }
    }
Ejemplo n.º 3
0
    void UpdateAI(const uint32 uiDiff)
    {
		if (m_uiTirionSpawneTimer < uiDiff && !m_bIsTirionSpawned)
		{
			me->SummonCreature(CREATURE_TIRION_ICC, 528.552002, -2124.620117, 1040.859985, 3.183670, TEMPSUMMON_CORPSE_DESPAWN, 5000);
			m_bIsTirionSpawned = true;
		}
		else m_uiTirionSpawneTimer -= uiDiff;

       if(!UpdateVictim())
            return;
		
		if(!m_bIsDeathPhase)
		{
			if (m_uiRandomSpeechTimer < uiDiff)
			{
			   DoScriptText(RAND(SAY_RANDOM_1,SAY_RANDOM_2), me);
			   m_uiRandomSpeechTimer = urand(30*IN_MILISECONDS,35*IN_MILISECONDS);
			}
			else m_uiRandomSpeechTimer -= uiDiff;
		}

		
		if (m_uiBerserkTimer < uiDiff && !m_bIsBerserk)
        {
			DoScriptText(SAY_BERSERK, me);
			DoCast(me, SPELL_BERSERK);
            m_bIsBerserk = true;
        }
        else m_uiBerserkTimer -= uiDiff;

		/******************** Start Phase 1 Spells ********************/
		if(m_uiPhase == 1)
		{
			if (m_uiInfestTimer < uiDiff)
            {
				DoCast(me, SPELL_INFEST);
                m_uiInfestTimer = urand(30*IN_MILISECONDS,35*IN_MILISECONDS);
            }
            else m_uiInfestTimer -= uiDiff;

			if (m_uiPlagueSiphonTimer < uiDiff)
            {
				DoCast(me, SPELL_PLAGUE_SIPHON);
                m_uiPlagueSiphonTimer = urand(29*IN_MILISECONDS,30*IN_MILISECONDS);
            }
            else m_uiPlagueSiphonTimer -= uiDiff;

			if (m_uiSummonDrudgeGhoulsTimer < uiDiff)
            {
				DoCast(me, SPELL_SUMMON_DRUDGE_GHOULS);
                m_uiSummonDrudgeGhoulsTimer = urand(20*IN_MILISECONDS,21*IN_MILISECONDS);
            }
            else m_uiSummonDrudgeGhoulsTimer -= uiDiff;

			if (m_uiSummonShamblingHorrorTimer < uiDiff)
            {
				DoCast(me, SPELL_SUMMON_SHAMBLING_HORROR);
                m_uiSummonShamblingHorrorTimer = urand(60*IN_MILISECONDS,61*IN_MILISECONDS);
            }
            else m_uiSummonShamblingHorrorTimer -= uiDiff;

			if (m_uiNecroticPlagueTimer < uiDiff)
            {
                if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
                DoCast(target, SPELL_NECROTIC_PLAGUE);
                m_uiNecroticPlagueTimer = urand(5*IN_MILISECONDS,10*IN_MILISECONDS);
            }
            else m_uiNecroticPlagueTimer -= uiDiff;
		}

		/******************** Start Phase 1.5 Spells ********************/
		if(m_uiPhase == 2)
		{
			if (m_uiRemorselesWinterTimer < uiDiff)
            {
				DoScriptText(SAY_REMORSELESS_WINTER, me);
                DoCast(me, SPELL_REMORSELES_WINTER);
                m_uiRemorselesWinterTimer = 90*IN_MILISECONDS;
            }
            else m_uiRemorselesWinterTimer -= uiDiff;

			if (m_uiSummonSpiritTimer < uiDiff)
            {
				if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
                DoCast(target, SPELL_SUMMON_RAGING_SPIRIT);
				m_uiSummonSpiritTimer	= 16*IN_MILISECONDS;
            }
            else m_uiSummonSpiritTimer -= uiDiff;

			if (m_uiIcePulsSummonTimer < uiDiff)
            {
                DoCast(me, SPELL_SUMMON_ICE_SPEHERE);
				m_uiIcePulsSummonTimer	= 15*IN_MILISECONDS;
            }
            else m_uiIcePulsSummonTimer -= uiDiff;

			if (m_uiPainandSufferingTimer < uiDiff)
            {
                if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
                DoCast(target, SPELL_PAIN_AND_SUFFERING);
				m_uiPainandSufferingTimer = urand(1.5*IN_MILISECONDS,2.0*IN_MILISECONDS);
            }
            else m_uiPainandSufferingTimer -= uiDiff;

			if (m_uiQuakeTimer < uiDiff)
            {
				DoScriptText(SAY_BROKEN_ARENA, me);
                DoCast(me, SPELL_QUAKE);
				me->SetReactState(REACT_AGGRESSIVE);
				me->GetMotionMaster()->Clear();
                me->GetMotionMaster()->MoveChase(me->getVictim());
				m_uiPhase = 3;
				
            }
            else m_uiQuakeTimer -= uiDiff;
		}

		/******************** Start Phase 2 Spells ********************/
		if(m_uiPhase == 3)
		{
			if (m_uiDefileTimer < uiDiff)
            {
                if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
                DoCast(target, SPELL_SPAWN_DEFILE);
                m_uiDefileTimer = 20*IN_MILISECONDS;
            }
            else m_uiDefileTimer -= uiDiff;

			if (m_uiSummonValkyrTimer < uiDiff)
            {
				DoScriptText(SAY_SUMMON_VALKYR, me);
				me->SummonCreature(CREATURE_VALKYR, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+10, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 99999999);
                //DoCast(me, SPELL_SUMMON_VALKYR);
                m_uiSummonValkyrTimer = 20*IN_MILISECONDS;
            }
            else m_uiSummonValkyrTimer -= uiDiff;

			if (m_uiSoulReaperTimer < uiDiff)
            {
                DoCast(me->getVictim(), SPELL_SOUL_REAPER);
                m_uiSoulReaperTimer = 20*IN_MILISECONDS;
            }
            else m_uiSoulReaperTimer -= uiDiff;

			if (m_uiInfestTimer < uiDiff)
            {
				DoCast(me, SPELL_INFEST);
                m_uiInfestTimer = urand(30*IN_MILISECONDS,35*IN_MILISECONDS);
            }
            else m_uiInfestTimer -= uiDiff;
		}
		
		/******************** Start Phase 2.5 Spells ********************/
		if(m_uiPhase == 4)
		{
			if (m_uiRemorselesWinterTimer < uiDiff)
            {
				DoScriptText(SAY_REMORSELESS_WINTER, me);
                DoCast(me, SPELL_REMORSELES_WINTER);
                m_uiRemorselesWinterTimer = 90*IN_MILISECONDS;
            }
            else m_uiRemorselesWinterTimer -= uiDiff;

			if (m_uiSummonSpiritTimer < uiDiff)
            {
				if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
                DoCast(target, SPELL_SUMMON_RAGING_SPIRIT);
				m_uiSummonSpiritTimer = 16*IN_MILISECONDS;
            }
            else m_uiSummonSpiritTimer -= uiDiff;

			if (m_uiIcePulsSummonTimer < uiDiff)
            {
                DoCast(me, SPELL_SUMMON_ICE_SPEHERE);
				m_uiIcePulsSummonTimer	= 15*IN_MILISECONDS;
            }
            else m_uiIcePulsSummonTimer -= uiDiff;

			if (m_uiPainandSufferingTimer < uiDiff)
            {
                if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
                DoCast(target, SPELL_PAIN_AND_SUFFERING);
				m_uiPainandSufferingTimer = urand(2*IN_MILISECONDS,4*IN_MILISECONDS);
            }
            else m_uiPainandSufferingTimer -= uiDiff;
	
			if (m_uiQuakeTimer < uiDiff)
            {
				DoScriptText(SAY_BROKEN_ARENA, me);
                DoCast(me, SPELL_QUAKE);
				me->SetReactState(REACT_AGGRESSIVE);
				me->GetMotionMaster()->Clear();
                me->GetMotionMaster()->MoveChase(me->getVictim());
				m_uiPhase = 5;
            }
            else m_uiQuakeTimer -= uiDiff;
		}

		/******************** Start Phase 3 Spells ********************/
			if(m_uiPhase == 5)
			{
				if (m_uiSummonVileSpiritTimer < uiDiff)
				{
					DoCast(me, SPELL_SUMMON_VILE_SPIRIT);
					m_uiSummonVileSpiritTimer = 30*IN_MILISECONDS;
				}
				else m_uiSummonVileSpiritTimer -= uiDiff;

				if (m_uiHarvestSoulTimer < uiDiff)
				{
					DoScriptText(SAY_HARVEST_SOUL, me);
					Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 1);
					DoCast(pTarget, SPELL_HARVEST_SOULS);
					m_uiHarvestSoulTimer = 70*IN_MILISECONDS;
				}
				else m_uiHarvestSoulTimer -= uiDiff;
			}

		   DoMeleeAttackIfReady();

	    /*************** Start Ending Phase ******************/
				if (m_uiEndingTimer <= uiDiff)
					EndingPhase();
				else m_uiEndingTimer -= uiDiff;

		/************* Switch Phase 1 to 2 *************/
		if (HealthBelowPct(70) && !m_bIsSwitchPhase1)
		{
			m_uiPhase = 2;
			Phasenswitch();
			m_bIsSwitchPhase1 = true;
		}
		else /************* Switch Phase 2 to 3 **************/
		if (HealthBelowPct(40) && !m_bIsSwitchPhase2)
		{
			m_uiPhase = 4;
			m_uiRemorselesWinterTimer = 5*IN_MILISECONDS;
			m_uiQuakeTimer = 70*IN_MILISECONDS;
			m_uiIcePulsSummonTimer	= 10*IN_MILISECONDS;
			m_uiPainandSufferingTimer = urand(10*IN_MILISECONDS,11*IN_MILISECONDS);
			m_uiSummonSpiritTimer = 18*IN_MILISECONDS;
			Phasenswitch();
			m_bIsSwitchPhase2 = true;
		}
		else /************* Save Trigger Spawned ************/
		if (HealthBelowPct(11) && !m_bIsTriggerSpawned)
		{
			pSafeZone = me->SummonCreature(30494, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_CORPSE_DESPAWN, 360000); //safe zone.. raid do not leave combat while mounting
            pSafeZone->AI()->AttackStart(me);
			pSafeZone->SetDisplayId(MODEL_INVISIBLE);
			m_bIsTriggerSpawned = true;
		}
		else /************* Switch Phase 5 to 6 Ending Phase *************/
		if (HealthBelowPct(10) && !m_bIsDeathPhase)
		{
			m_uiPhase = 6;
			m_bIsDeathPhase = true;
			SetEnding();
		}
	}