void MoveVolunteer() { if (Creature* pVolunteer = SelectRandomCreatureOfEntryInRange(NPC_VOLUNTEER, 100.0f)) { if (pVolunteer->isAlive()) { pVolunteer->GetMotionMaster()->Clear(); pVolunteer->GetMotionMaster()->MovePoint(0, CORD_CENTER_X, CORD_CENTER_Y, CORD_CENTER_Z); pVolunteer->setFaction(FAC_HOSTILE); pVolunteer->RemoveAurasDueToSpell(SPELL_SPHERE_VISUAL); pChosenVolunteer = pVolunteer; switch(urand(0, 1)) { case 0: DoScriptText(SAY_CALL_SACRIFICE_1, pVolunteer); break; case 1: DoScriptText(SAY_CALL_SACRIFICE_2, pVolunteer); break; } if (pVisualTrigger = m_creature->SummonCreature(NPC_VISUAL_TRIGGER, CORD_CENTER_X, CORD_CENTER_Y, CORD_CENTER_X, 0, TEMPSUMMON_TIMED_DESPAWN, 20000)) { pVisualTrigger->GetMotionMaster()->Clear(); pVisualTrigger->GetMotionMaster()->MoveIdle(); pVisualTrigger->SetVisibility(VISIBILITY_ON); pVisualTrigger->CastSpell(pVisualTrigger, SPELL_SACRIFICE_VISUAL, true); } } else { MoveVolunteer(); if (pVisualTrigger) pVisualTrigger->ForcedDespawn(); } } }
void MoveVolunteer() { if (!m_vVolunteerGuid.empty()) { uint32 random = urand(0, m_vVolunteerGuid.size() -1); pChosenVolunteerGuid = m_vVolunteerGuid[random]; m_vVolunteerGuid.erase(m_vVolunteerGuid. begin() + random); if (Creature* pVolunteer = m_creature->GetMap()->GetCreature(pChosenVolunteerGuid)) { if (pVolunteer->isAlive()) { if (Creature* pVisualTrigger = m_creature->SummonCreature(NPC_VISUAL_TRIGGER, CORD_CENTER_X, CORD_CENTER_Y, CORD_CENTER_Z, 0, TEMPSUMMON_TIMED_DESPAWN, 20000)) { pVisualTrigger->GetMotionMaster()->Clear(); pVisualTrigger->GetMotionMaster()->MoveIdle(); pVisualTrigger->SetVisibility(VISIBILITY_ON); pVisualTrigger->CastSpell(pVisualTrigger, SPELL_SACRIFICE_VISUAL, true); } pVolunteer->GetMotionMaster()->Clear(); pVolunteer->GetMotionMaster()->MovePoint(0, CORD_CENTER_X, CORD_CENTER_Y, CORD_CENTER_Z); pVolunteer->setFaction(FAC_HOSTILE); pVolunteer->RemoveFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NOT_SELECTABLE); pVolunteer->RemoveAurasDueToSpell(SPELL_SPHERE_VISUAL); switch(urand(0, 1)) { case 0: DoScriptText(SAY_CALL_SACRIFICE_1, pVolunteer); break; case 1: DoScriptText(SAY_CALL_SACRIFICE_2, pVolunteer); break; } } else { MoveVolunteer(); } } } }
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; } } }