void SummonedCreatureJustDied(Creature* pSummoned) { if (!m_pInstance) return; switch (pSummoned->GetEntry()) { case NPC_GORMOK: if (m_uiPhase == PHASE_GORMOK) DoSummonNextBeast(NPC_DREADSCALE); break; case NPC_DREADSCALE: case NPC_ACIDMAW: if (m_bFirstWormDied && m_uiPhase == PHASE_WORMS) DoSummonNextBeast(NPC_ICEHOWL); else m_bFirstWormDied = true; break; case NPC_ICEHOWL: m_pInstance->SetData(TYPE_NORTHREND_BEASTS, DONE); m_creature->ForcedDespawn(); break; } }
void UpdateAI(const uint32 uiDiff) { if (m_uiNextBeastTimer) { if (m_uiNextBeastTimer <= uiDiff) { if (m_uiPhase == PHASE_GORMOK) DoSummonNextBeast(NPC_DREADSCALE); else if (m_uiPhase == PHASE_WORMS) DoSummonNextBeast(NPC_ICEHOWL); m_uiNextBeastTimer = 0; } else m_uiNextBeastTimer -= uiDiff; } if (m_uiAttackDelayTimer) { if (m_uiAttackDelayTimer <= uiDiff) { if (m_uiPhase == PHASE_WORMS) m_creature->SummonCreature(NPC_ACIDMAW, aSpawnPositions[3][0], aSpawnPositions[3][1], aSpawnPositions[3][2], aSpawnPositions[3][3], TEMPSUMMON_DEAD_DESPAWN, 0); if (Creature* pBeast = m_creature->GetMap()->GetCreature(m_aSummonedBossGuid[m_uiPhase])) pBeast->SetInCombatWithZone(); m_uiAttackDelayTimer = 0; } else m_uiAttackDelayTimer -= uiDiff; } if (m_uiBerserkTimer) { if (m_uiBerserkTimer < uiDiff) { for (uint8 i = 0; i < 4; ++i) { Creature* pBoss = m_creature->GetMap()->GetCreature(m_aSummonedBossGuid[i]); if (pBoss && pBoss->isAlive()) pBoss->CastSpell(pBoss, SPELL_BERSERK, true); } } else m_uiBerserkTimer -= uiDiff; } m_creature->SelectHostileTarget(); }
void SummonedCreatureJustDied(Creature* pSummoned) override { if (!m_pInstance) return; switch (pSummoned->GetEntry()) { case NPC_GORMOK: if (m_uiPhase == PHASE_GORMOK) DoSummonNextBeast(NPC_DREADSCALE); break; case NPC_DREADSCALE: case NPC_ACIDMAW: if (m_bFirstWormDied && m_uiPhase == PHASE_WORMS) { DoSummonNextBeast(NPC_ICEHOWL); // cast achiev spell if timer is still running if (m_uiWormAchievTimer) { m_creature->CastSpell(m_creature, SPELL_JORMUNGAR_ACHIEV_CREDIT, TRIGGERED_OLD_TRIGGERED); m_uiWormAchievTimer = 0; } } else { m_bFirstWormDied = true; // jormungar brother enrages if (Creature* pWorm = m_pInstance->GetSingleCreatureFromStorage(pSummoned->GetEntry() == NPC_ACIDMAW ? NPC_DREADSCALE : NPC_ACIDMAW)) { pWorm->CastSpell(pWorm, SPELL_JORMUNGAR_ENRAGE, TRIGGERED_OLD_TRIGGERED); DoScriptText(EMOTE_JORMUNGAR_ENRAGE, pWorm); m_uiWormAchievTimer = 10000; } } break; case NPC_ICEHOWL: m_pInstance->SetData(TYPE_NORTHREND_BEASTS, DONE); m_creature->ForcedDespawn(); break; } }
void UpdateAI(const uint32 uiDiff) override { if (m_uiNextBeastTimer) { if (m_uiNextBeastTimer <= uiDiff) { if (m_uiPhase == PHASE_GORMOK) DoSummonNextBeast(NPC_DREADSCALE); else if (m_uiPhase == PHASE_WORMS) DoSummonNextBeast(NPC_ICEHOWL); m_uiNextBeastTimer = 0; } else m_uiNextBeastTimer -= uiDiff; } if (m_uiAttackDelayTimer) { if (m_uiAttackDelayTimer <= uiDiff) { // for worm phase, summon brother on aggro if (m_uiPhase == PHASE_WORMS) { m_creature->SummonCreature(NPC_ACIDMAW, aSpawnPositions[3][0], aSpawnPositions[3][1], aSpawnPositions[3][2], aSpawnPositions[3][3], TEMPSUMMON_DEAD_DESPAWN, 0); m_uiWormPhaseTimer = 45000; } // start combat if (Creature* pBeast = m_creature->GetMap()->GetCreature(m_aSummonedBossGuid[m_uiPhase])) { pBeast->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); // first boss doesn't automatically attack if (pBeast->GetEntry() != NPC_GORMOK) pBeast->SetInCombatWithZone(); } m_uiAttackDelayTimer = 0; } else m_uiAttackDelayTimer -= uiDiff; } if (m_uiBerserkTimer) { if (m_uiBerserkTimer < uiDiff) { for (uint8 i = 0; i < 4; ++i) { Creature* pBoss = m_creature->GetMap()->GetCreature(m_aSummonedBossGuid[i]); if (pBoss && pBoss->isAlive()) pBoss->CastSpell(pBoss, SPELL_BERSERK, TRIGGERED_OLD_TRIGGERED); } } else m_uiBerserkTimer -= uiDiff; } // jormungars phase switch control if (m_uiWormPhaseTimer) { if (m_uiWormPhaseTimer <= uiDiff) { if (!m_pInstance) return; ++m_uiWormPhaseStage; switch (m_uiWormPhaseStage) { // submerge worms case 1: if (Creature* pWorm = m_pInstance->GetSingleCreatureFromStorage(NPC_ACIDMAW)) { if (pWorm->isAlive()) SendAIEvent(AI_EVENT_CUSTOM_A, m_creature, pWorm); } if (Creature* pWorm = m_pInstance->GetSingleCreatureFromStorage(NPC_DREADSCALE)) { if (pWorm->isAlive()) SendAIEvent(AI_EVENT_CUSTOM_A, m_creature, pWorm); } m_uiWormPhaseTimer = 4000; break; // change places case 2: float fX, fY, fZ; if (Creature* pWorm = m_pInstance->GetSingleCreatureFromStorage(NPC_ACIDMAW)) { if (pWorm->isAlive()) { m_creature->GetRandomPoint(m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), 45.0f, fX, fY, fZ); pWorm->MonsterMoveWithSpeed(fX, fY, fZ, 7.7f); } } if (Creature* pWorm = m_pInstance->GetSingleCreatureFromStorage(NPC_DREADSCALE)) { if (pWorm->isAlive()) { m_creature->GetRandomPoint(m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), 45.0f, fX, fY, fZ); pWorm->MonsterMoveWithSpeed(fX, fY, fZ, 7.7f); } } m_uiWormPhaseTimer = 6000; break; // emerge and change phase case 3: if (Creature* pWorm = m_pInstance->GetSingleCreatureFromStorage(NPC_ACIDMAW)) { if (pWorm->isAlive()) SendAIEvent(AI_EVENT_CUSTOM_B, m_creature, pWorm); } if (Creature* pWorm = m_pInstance->GetSingleCreatureFromStorage(NPC_DREADSCALE)) { if (pWorm->isAlive()) SendAIEvent(AI_EVENT_CUSTOM_B, m_creature, pWorm); } m_uiWormPhaseStage = 0; m_uiWormPhaseTimer = 45000; break; } } else m_uiWormPhaseTimer -= uiDiff; } // jormungars achiev timer if (m_uiWormAchievTimer) { if (m_uiWormAchievTimer <= uiDiff) m_uiWormAchievTimer = 0; else m_uiWormAchievTimer -= uiDiff; } m_creature->SelectHostileTarget(); }