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(); }
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; } } }