void Reset() { m_uiPhase = PHASE_GROUND; m_uiTauntTimer = urand(20000,60000); // TODO, find information ResetPhase(); }
void UpdateAI(const uint32 uiDiff) { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; if (m_uiPhase == PHASE_GROUND) { // Teleport to platform if (m_uiPhaseTimer < uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_TELEPORT) == CAST_OK) { DoScriptText(EMOTE_TELEPORT, m_creature); m_creature->GetMotionMaster()->MoveIdle(); m_uiPhase = PHASE_PLATFORM; ResetPhase(); return; } } else m_uiPhaseTimer -= uiDiff; // Fever if (m_uiFeverTimer < uiDiff) { // DoCastSpellIfCan(m_creature, m_bIsRegularMode ? SPELL_DECREPIT_FEVER_N : SPELL_DECREPIT_FEVER_H); m_uiFeverTimer = 21000; } else m_uiFeverTimer -= uiDiff; // Disruption if (m_uiDisruptionTimer < uiDiff) { DoCastSpellIfCan(m_creature, SPELL_DISRUPTION); m_uiDisruptionTimer = 10000; } else m_uiDisruptionTimer -= uiDiff; } else //Platform Phase { if (m_uiPhaseTimer <= uiDiff) // return to fight { m_creature->InterruptNonMeleeSpells(true); DoScriptText(EMOTE_RETURN, m_creature); m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); m_uiPhase = PHASE_GROUND; ResetPhase(); return; } else m_uiPhaseTimer -= uiDiff; if (m_uiStartChannelingTimer) { if (m_uiStartChannelingTimer <=uiDiff) { DoScriptText(SAY_CHANNELING, m_creature); DoCastSpellIfCan(m_creature, SPELL_PLAGUE_CLOUD); m_uiStartChannelingTimer = 0; // no more } else m_uiStartChannelingTimer -= uiDiff; } } // Taunt if (m_uiTauntTimer < uiDiff) { switch(urand(0, 3)) { case 0: DoScriptText(SAY_TAUNT1, m_creature); break; case 1: DoScriptText(SAY_TAUNT2, m_creature); break; case 2: DoScriptText(SAY_TAUNT3, m_creature); break; case 3: DoScriptText(SAY_TAUNT4, m_creature); break; } m_uiTauntTimer = urand(20000, 70000); } else m_uiTauntTimer -= uiDiff; DoMeleeAttackIfReady(); // Handling of the erruptions, this is not related to melee attack or spell-casting if (!m_pInstance) return; // Eruption if (m_uiEruptionTimer <= uiDiff) { static int const m_auiMaxHeiganTraps[MAX_HEIGAN_TRAP_AREAS] = { m_pInstance->GetData(TYPE_MAX_HEIGAN_TRAPS_1), m_pInstance->GetData(TYPE_MAX_HEIGAN_TRAPS_2), m_pInstance->GetData(TYPE_MAX_HEIGAN_TRAPS_3), m_pInstance->GetData(TYPE_MAX_HEIGAN_TRAPS_4) }; for (uint8 uiArea = 0; uiArea < MAX_HEIGAN_TRAP_AREAS; ++uiArea) { if (uiArea == (m_uiPhaseEruption % 6) || uiArea == 6 - (m_uiPhaseEruption % 6)) continue; for (uint8 i = 0; i < m_auiMaxHeiganTraps[uiArea]; i++) { if (GameObject* pGo = m_creature->GetMap()->GetGameObject(m_pInstance->GetHeiganTrapData64(uiArea, i))) pGo->Use(m_creature); } } m_uiEruptionTimer = m_uiPhase == PHASE_GROUND ? urand(8000, 12000) : urand(2000, 3000); ++m_uiPhaseEruption; } else m_uiEruptionTimer -= uiDiff; }
void UpdateAI(const uint32 uiDiff) { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; if (m_uiDanceTimer < uiDiff) { for (uint8 i = TOP_MOST; i < TOTAL_AREAS; ++i) { if (i == CurrentSafeArea) continue; m_pInstance->ActivateAreaFissures(ChamberArea(i)); } if (CurrentSafeArea == BOTTOM_LOWEST) Direction = -1; else if (CurrentSafeArea == TOP_MOST) Direction = 1; CurrentSafeArea = CurrentSafeArea + Direction; m_uiDanceTimer = m_uiPhase == PHASE_GROUND ? 10000 : 3000; }else m_uiDanceTimer -= uiDiff; if (m_uiPhase == PHASE_GROUND) { // Teleport to platform if (m_uiPhaseTimer < uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_TELEPORT) == CAST_OK) { DoScriptText(EMOTE_TELEPORT, m_creature); m_creature->GetMotionMaster()->MoveIdle(); m_uiPhase = PHASE_PLATFORM; ResetPhase(); return; } } else m_uiPhaseTimer -= uiDiff; // Fever if (m_uiFeverTimer < uiDiff) { DoCastSpellIfCan(m_creature, m_bIsRegularMode ? SPELL_DECREPIT_FEVER_N : SPELL_DECREPIT_FEVER_H); m_uiFeverTimer = 21000; } else m_uiFeverTimer -= uiDiff; // Disruption if (m_uiDisruptionTimer < uiDiff) { DoCastSpellIfCan(m_creature, SPELL_DISRUPTION); m_uiDisruptionTimer = 10000; } else m_uiDisruptionTimer -= uiDiff; } else //Platform Phase { if (m_uiPhaseTimer <= uiDiff) // return to fight { m_creature->InterruptNonMeleeSpells(true); DoScriptText(EMOTE_RETURN, m_creature); m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); m_uiPhase = PHASE_GROUND; ResetPhase(); return; } else m_uiPhaseTimer -= uiDiff; if (m_uiStartChannelingTimer) { if (m_uiStartChannelingTimer <=uiDiff) { DoScriptText(SAY_CHANNELING, m_creature); DoCastSpellIfCan(m_creature, SPELL_PLAGUE_CLOUD); m_uiStartChannelingTimer = 0; // no more } else m_uiStartChannelingTimer -= uiDiff; } } // Taunt if (m_uiTauntTimer < uiDiff) { switch(urand(0, 3)) { case 0: DoScriptText(SAY_TAUNT1, m_creature); break; case 1: DoScriptText(SAY_TAUNT2, m_creature); break; case 2: DoScriptText(SAY_TAUNT3, m_creature); break; case 3: DoScriptText(SAY_TAUNT4, m_creature); break; } m_uiTauntTimer = urand(20000, 70000); } else m_uiTauntTimer -= uiDiff; DoMeleeAttackIfReady(); EnterEvadeIfOutOfCombatArea(uiDiff); }
void UpdateAI(const uint32 uiDiff) { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; if (m_uiPhase == PHASE_GROUND) { // Teleport to platform if (m_uiPhaseTimer < uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_TELEPORT) == CAST_OK) { DoScriptText(EMOTE_TELEPORT, m_creature); m_creature->GetMotionMaster()->MoveIdle(); m_uiPhase = PHASE_PLATFORM; ResetPhase(); return; } } else m_uiPhaseTimer -= uiDiff; // Fever if (m_uiFeverTimer < uiDiff) { DoCastSpellIfCan(m_creature, m_bIsRegularMode ? SPELL_DECREPIT_FEVER_N : SPELL_DECREPIT_FEVER_H); m_uiFeverTimer = 21000; } else m_uiFeverTimer -= uiDiff; // Disruption if (m_uiDisruptionTimer < uiDiff) { DoCastSpellIfCan(m_creature, SPELL_DISRUPTION); m_uiDisruptionTimer = 10000; } else m_uiDisruptionTimer -= uiDiff; if(m_uiEruptionTimer < uiDiff) { DoErupt(m_uiSafeSpot); if (m_bforward) m_uiSafeSpot++; else m_uiSafeSpot--; m_uiEruptionTimer = 10500; } else m_uiEruptionTimer -= uiDiff; } else //Platform Phase { if (m_uiPhaseTimer <= uiDiff) // return to fight { m_creature->InterruptNonMeleeSpells(true); DoScriptText(EMOTE_RETURN, m_creature); m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); m_uiPhase = PHASE_GROUND; ResetPhase(); return; } else m_uiPhaseTimer -= uiDiff; if (m_uiStartChannelingTimer) { if (m_uiStartChannelingTimer <=uiDiff) { DoScriptText(SAY_CHANNELING, m_creature); DoCastSpellIfCan(m_creature, SPELL_PLAGUE_CLOUD); m_uiStartChannelingTimer = 0; // no more } else m_uiStartChannelingTimer -= uiDiff; } if(m_uiEruptionTimer < uiDiff) { DoErupt(m_uiSafeSpot); if (m_bforward) m_uiSafeSpot++; else m_uiSafeSpot--; m_uiEruptionTimer = 3500; } else m_uiEruptionTimer-=uiDiff; } // Taunt if (m_uiTauntTimer < uiDiff) { switch(urand(0, 3)) { case 0: DoScriptText(SAY_TAUNT1, m_creature); break; case 1: DoScriptText(SAY_TAUNT2, m_creature); break; case 2: DoScriptText(SAY_TAUNT3, m_creature); break; case 3: DoScriptText(SAY_TAUNT4, m_creature); break; } m_uiTauntTimer = urand(20000, 70000); } else m_uiTauntTimer -= uiDiff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 uiDiff) override { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; if (m_uiPhase == PHASE_GROUND) { // Teleport to platform if (m_uiPhaseTimer < uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_TELEPORT) == CAST_OK) { DoScriptText(EMOTE_TELEPORT, m_creature); m_creature->GetMotionMaster()->MoveIdle(); m_uiPhase = PHASE_PLATFORM; ResetPhase(); return; } } else m_uiPhaseTimer -= uiDiff; // Fever if (m_uiFeverTimer < uiDiff) { DoCastSpellIfCan(m_creature, m_bIsRegularMode ? SPELL_DECREPIT_FEVER : SPELL_DECREPIT_FEVER_H); m_uiFeverTimer = 21000; } else m_uiFeverTimer -= uiDiff; // Disruption if (m_uiDisruptionTimer < uiDiff) { DoCastSpellIfCan(m_creature, SPELL_DISRUPTION); m_uiDisruptionTimer = 10000; } else m_uiDisruptionTimer -= uiDiff; } else // Platform Phase { if (m_uiPhaseTimer < uiDiff) // Return to fight { m_creature->InterruptNonMeleeSpells(true); DoScriptText(EMOTE_RETURN, m_creature); m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); m_uiPhase = PHASE_GROUND; ResetPhase(); return; } else m_uiPhaseTimer -= uiDiff; if (m_uiStartChannelingTimer) { if (m_uiStartChannelingTimer <= uiDiff) { DoScriptText(SAY_CHANNELING, m_creature); DoCastSpellIfCan(m_creature, SPELL_PLAGUE_CLOUD); m_uiStartChannelingTimer = 0; // no more } else m_uiStartChannelingTimer -= uiDiff; } } // Taunt if (m_uiTauntTimer < uiDiff) { switch (urand(0, 3)) { case 0: DoScriptText(SAY_TAUNT1, m_creature); break; case 1: DoScriptText(SAY_TAUNT2, m_creature); break; case 2: DoScriptText(SAY_TAUNT3, m_creature); break; case 3: DoScriptText(SAY_TAUNT4, m_creature); break; } m_uiTauntTimer = urand(20000, 70000); } else m_uiTauntTimer -= uiDiff; DoMeleeAttackIfReady(); // Handling of the erruptions, this is not related to melee attack or spell-casting if (!m_pInstance) return; // Eruption if (m_uiEruptionTimer < uiDiff) { for (uint8 uiArea = 0; uiArea < MAX_HEIGAN_TRAP_AREAS; ++uiArea) { // Actually this is correct :P if (uiArea == (m_uiPhaseEruption % 6) || uiArea == 6 - (m_uiPhaseEruption % 6)) continue; m_pInstance->DoTriggerHeiganTraps(m_creature, uiArea); } m_uiEruptionTimer = m_uiPhase == PHASE_GROUND ? 10000 : 3000; ++m_uiPhaseEruption; } else m_uiEruptionTimer -= uiDiff; }
void UpdateAI(const uint32 uiDiff) override { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; if (m_uiPhase == PHASE_GROUND) { // Teleport to platform if (m_uiPhaseTimer < uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_TELEPORT) == CAST_OK) { DoScriptText(EMOTE_TELEPORT, m_creature); m_creature->GetMotionMaster()->MoveIdle(); m_uiPhase = PHASE_PLATFORM; ResetPhase(); return; } } else m_uiPhaseTimer -= uiDiff; // Fever if (m_uiFeverTimer < uiDiff) { DoCastSpellIfCan(m_creature, SPELL_DECREPIT_FEVER); m_uiFeverTimer = 21000; } else m_uiFeverTimer -= uiDiff; // Disruption if (m_uiDisruptionTimer < uiDiff) { DoCastSpellIfCan(m_creature, SPELL_DISRUPTION); m_uiDisruptionTimer = 10000; } else m_uiDisruptionTimer -= uiDiff; if (m_uiTeleportTimer < uiDiff) { float fX, fY, fZ; // Teleport players in the tunnel for (uint8 i = 0; i < MAX_PLAYERS_TELEPORT; i++) { if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 1, uint32(0), SELECT_FLAG_PLAYER)) { m_creature->GetRandomPoint(aTunnelLoc[0], aTunnelLoc[1], aTunnelLoc[2], 5.0f, fX, fY, fZ); pTarget->NearTeleportTo(fX, fY, fZ, aTunnelLoc[3]); } } m_uiTeleportTimer = 70000; } else m_uiTeleportTimer -= uiDiff; } else // Platform Phase { if (m_uiPhaseTimer <= uiDiff) // Return to fight { m_creature->InterruptNonMeleeSpells(true); DoScriptText(EMOTE_RETURN, m_creature); m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); m_uiPhase = PHASE_GROUND; ResetPhase(); return; } else m_uiPhaseTimer -= uiDiff; if (m_uiStartChannelingTimer) { if (m_uiStartChannelingTimer <= uiDiff) { DoScriptText(SAY_CHANNELING, m_creature); DoCastSpellIfCan(m_creature, SPELL_PLAGUE_CLOUD); // ToDo: fill the tunnel with poison - required further research m_uiStartChannelingTimer = 0; // no more } else m_uiStartChannelingTimer -= uiDiff; } } // Taunt if (m_uiTauntTimer < uiDiff) { switch (urand(0, 3)) { case 0: DoScriptText(SAY_TAUNT1, m_creature); break; case 1: DoScriptText(SAY_TAUNT2, m_creature); break; case 2: DoScriptText(SAY_TAUNT3, m_creature); break; case 3: DoScriptText(SAY_TAUNT4, m_creature); break; } m_uiTauntTimer = urand(20000, 70000); } else m_uiTauntTimer -= uiDiff; DoMeleeAttackIfReady(); // Handling of the erruptions, this is not related to melee attack or spell-casting if (!m_pInstance) return; // Eruption if (m_uiEruptionTimer < uiDiff) { for (uint8 uiArea = 0; uiArea < MAX_HEIGAN_TRAP_AREAS; ++uiArea) { // Actually this is correct :P if (uiArea == (m_uiPhaseEruption % 6) || uiArea == 6 - (m_uiPhaseEruption % 6)) continue; m_pInstance->DoTriggerHeiganTraps(m_creature, uiArea); } m_uiEruptionTimer = m_uiPhase == PHASE_GROUND ? 10000 : 3000; ++m_uiPhaseEruption; } else m_uiEruptionTimer -= uiDiff; }