Example #1
0
    void UpdateAI(const uint32 uiDiff)
    {
        if(m_pInstance && m_pInstance->GetData(TYPE_JEDOGA) == NOT_STARTED)
            if(allStartMobsDead())
            {
                m_creature->RemoveFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NON_ATTACKABLE);
                m_creature->RemoveFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_PASSIVE);
                m_creature->RemoveAurasDueToSpell(SPELL_SPHERE_VISUAL);
                m_creature->SetInCombatWithZone();
            }

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

		if (volunteerPhase)
		{
			if (volunteerReachedTimer < uiDiff)
			{
				if (pChosenVolunteer && pChosenVolunteer->isAlive())
				{
					m_creature->CastSpell(m_creature, SPELL_GIFT_OF_THE_HERALD, true);
					m_creature->CastSpell(pChosenVolunteer, SPELL_DARK_BEAM, true);
					pChosenVolunteer->GetMotionMaster()->MoveIdle();
					pChosenVolunteer->RemoveAllAuras();
					pChosenVolunteer->setFaction(FAC_FRIENDLY);
					pChosenVolunteer->SetHealth(m_creature->GetMaxHealth());
					switch(urand(0, 1))
					{
						case 0: DoScriptText(SAY_SACRIFICE_1, pChosenVolunteer); break;
						case 1: DoScriptText(SAY_SACRIFICE_2, pChosenVolunteer); break;
					}
				}
				volunteerReachedTimer = 9999999;
			}else volunteerReachedTimer -= uiDiff;

			if (volunteerDeathTimer < uiDiff)
			{
				if (pChosenVolunteer)
					volunteerGUIDList.remove(pChosenVolunteer->GetGUID());

				if (pChosenVolunteer && pChosenVolunteer->isAlive())
					pChosenVolunteer->DealDamage(pChosenVolunteer, pChosenVolunteer->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);

				if (volunteerGUIDList.empty() || victimCounter >= 6)
				{
					DepawnVolunteers();
					SpawnVolunteers();
					victimCounter = 0;
				}

				m_creature->NearTeleportTo(CORD_CENTER_X, CORD_CENTER_Y, CORD_CENTER_Z, START_O);
				m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
				if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0))
				{
					m_creature->GetMotionMaster()->MoveChase(pTarget);
					m_creature->Attack(pTarget, true);
				}

				if (pVisualTrigger)
					pVisualTrigger->ForcedDespawn();
				
				victimCounter++;
				volunteerPhase = false;
				volunteerDeathTimer = 9999999;
			}else volunteerDeathTimer -= uiDiff;
		}
		else
		{
			if (volunteerPhaseTimer	< uiDiff)
			{
				MoveVolunteer();
				m_creature->GetMotionMaster()->Clear();
				m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
				m_creature->NearTeleportTo(CORD_CENTER_X, CORD_CENTER_Y, CORD_ABOVE_Z, START_O);
				volunteerPhase = true;
				volunteerPhaseTimer = 32000;
				volunteerDeathTimer = 16000;
				volunteerReachedTimer = 14500;
			}else volunteerPhaseTimer -= uiDiff;

			if (lightingBallTimer < uiDiff)
			{
				DoCastSpellIfCan(m_creature->getVictim(), m_bIsRegularMode ? SPELL_LIGHTING_BALL : SPELL_LIGHTING_BALL_H); 
				lightingBallTimer = urand(4000, 6000);
			}else lightingBallTimer -= uiDiff;
		
			if (thundershockTimer < uiDiff)
			{
				DoCastSpellIfCan(m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0), m_bIsRegularMode ? SPELL_THUNDERSHOCK : SPELL_THUNDERSHOCK_H); 
				thundershockTimer = urand(12000, 18000);
			}else thundershockTimer -= uiDiff;

			if (cycloneStrikeTimer < uiDiff)
			{
				DoCastSpellIfCan(m_creature, m_bIsRegularMode ? SPELL_CYCLONE_STRIKE : SPELL_CYCLONE_STRIKE_H); 
				cycloneStrikeTimer = urand(14000, 20000);
			}else cycloneStrikeTimer -= uiDiff;
		}

        DoMeleeAttackIfReady();
    }
Example #2
0
    void UpdateAI(const uint32 uiDiff)
    {
        switch(m_uiPhase)
        {
            case PHASE_TWILIGHT_INITIATE:
            {
                if(allStartMobsDead())
                {
                    m_creature->RemoveAurasDueToSpell(SPELL_SPHERE_VISUAL);
                    m_creature->RemoveFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NOT_SELECTABLE);
                    m_creature->SetInCombatWithZone();
                    DoScriptText(SAY_AGGRO, m_creature);
                    SpawnVolunteers();
                    if(m_pInstance)
                        m_pInstance->SetData(TYPE_JEDOGA,IN_PROGRESS);
                    if (!m_bIsRegularMode)
                         m_pInstance->SetSpecialAchievementCriteria(TYPE_VOLUNTEER_WORK, true);
                    m_uiPhase = PHASE_GROUND;
                    SetCombatMovement(true);
                }
                break;
            }
            case PHASE_GROUND:
            {
                if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
                    return;

                if (volunteerPhaseTimer    < uiDiff)
                {
                    m_uiPhase = PHASE_VOLUNTEER;
                    MoveVolunteer();
                    m_creature->GetMotionMaster()->Clear();
                    m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
                    m_creature->NearTeleportTo(CORD_CENTER_X, CORD_CENTER_Y, CORD_ABOVE_Z, START_O);
                    
                    volunteerPhaseTimer = 32000;
                    volunteerDeathTimer = 16000;
                    volunteerReachedTimer = 14500;
                }
                else
                    volunteerPhaseTimer -= uiDiff;

                if (lightingBallTimer < uiDiff)
                {
                    if (DoCastSpellIfCan(m_creature->getVictim(), m_bIsRegularMode ? SPELL_LIGHTING_BALL : SPELL_LIGHTING_BALL_H) == CAST_OK)
                        lightingBallTimer = urand(4000, 6000);
                }
                else
                    lightingBallTimer -= uiDiff;
        
                if (thundershockTimer < uiDiff)
                {
                    if (DoCastSpellIfCan(m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0), m_bIsRegularMode ? SPELL_THUNDERSHOCK : SPELL_THUNDERSHOCK_H) == CAST_OK)
                        thundershockTimer = urand(12000, 18000);
                }
                else
                    thundershockTimer -= uiDiff;

                if (cycloneStrikeTimer < uiDiff)
                {
                    if (DoCastSpellIfCan(m_creature, m_bIsRegularMode ? SPELL_CYCLONE_STRIKE : SPELL_CYCLONE_STRIKE_H)  == CAST_OK)
                        cycloneStrikeTimer = urand(14000, 20000);
                }
                else
                    cycloneStrikeTimer -= uiDiff;

                DoMeleeAttackIfReady();
                break;
            }
            case PHASE_VOLUNTEER:
            {
                if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
                    return;

                if (volunteerReachedTimer < uiDiff)
                {
                    if (Creature* pChosenVolunteer = m_creature->GetMap()->GetCreature(pChosenVolunteerGuid))
                    {
                        if (pChosenVolunteer->isAlive())
                        {
                            m_creature->CastSpell(pChosenVolunteer, SPELL_DARK_BEAM, true);
                            pChosenVolunteer->GetMotionMaster()->MoveIdle();
                            pChosenVolunteer->RemoveAllAuras();
                            pChosenVolunteer->setFaction(FAC_FRIENDLY);
                            pChosenVolunteer->SetHealth(m_creature->GetMaxHealth());
                            switch(urand(0, 1))
                            {
                                case 0: DoScriptText(SAY_SACRIFICE_1, pChosenVolunteer); break;
                                case 1: DoScriptText(SAY_SACRIFICE_2, pChosenVolunteer); break;
                            }
                        }
                        volunteerReachedTimer = 60000;
                    }
                }else volunteerReachedTimer -= uiDiff;

                if (volunteerDeathTimer < uiDiff)
                {
                    if (Creature* pChosenVolunteer = m_creature->GetMap()->GetCreature(pChosenVolunteerGuid))
                    {
                        if (pChosenVolunteer->isAlive())
                        {
                            pChosenVolunteer->DealDamage(pChosenVolunteer, pChosenVolunteer->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
                            m_creature->CastSpell(m_creature, SPELL_GIFT_OF_THE_HERALD, true);
                        }
                    }
                    if (m_vVolunteerGuid.empty() || victimCounter >= 6)
                    {
                        DepawnVolunteers();
                        SpawnVolunteers();
                        victimCounter = 0;
                    }

                    m_creature->NearTeleportTo(CORD_CENTER_X, CORD_CENTER_Y, CORD_CENTER_Z, START_O);
                    m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
                    if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0))
                    {
                        m_creature->GetMotionMaster()->MoveChase(pTarget);
                        m_creature->Attack(pTarget, true);
                    }
                    
                    victimCounter++;
                    volunteerDeathTimer = 60000;
                    m_uiPhase = PHASE_GROUND;
                    
                }
                else
                    volunteerDeathTimer -= uiDiff;

                break;
            }
        }
    }