void Aggro(Unit* /*pWho*/) override { DoScriptText(SAY_AGGRO, m_creature); if ((m_pTrigger1 = m_pInstance->SelectRandomPantherTrigger(true))) m_pTrigger1->CastSpell(m_pTrigger1, SPELL_SUMMON_ZULIAN_PROWLERS, TRIGGERED_NONE); if ((m_pTrigger2 = m_pInstance->SelectRandomPantherTrigger(false))) m_pTrigger2->CastSpell(m_pTrigger2, SPELL_SUMMON_ZULIAN_PROWLERS, TRIGGERED_NONE); }
void UpdateAI(const uint32 uiDiff) override { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; // Summon panters every 5 seconds if (m_uiSummonTimer < uiDiff) { if (m_pInstance) { if (Creature* pTrigger = m_pInstance->SelectRandomPantherTrigger(true)) m_creature->SummonCreature(NPC_ZULIAN_PROWLER, pTrigger->GetPositionX(), pTrigger->GetPositionY(), pTrigger->GetPositionZ(), 0, TEMPSUMMON_TIMED_OOC_DESPAWN, 30000); if (Creature* pTrigger = m_pInstance->SelectRandomPantherTrigger(false)) m_creature->SummonCreature(NPC_ZULIAN_PROWLER, pTrigger->GetPositionX(), pTrigger->GetPositionY(), pTrigger->GetPositionZ(), 0, TEMPSUMMON_TIMED_OOC_DESPAWN, 30000); } m_uiSummonTimer = 5000; } else m_uiSummonTimer -= uiDiff; if (m_uiVisibleTimer) { if (m_uiVisibleTimer <= uiDiff) { // Restore visibility m_creature->SetVisibility(VISIBILITY_ON); if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) AttackStart(pTarget); m_uiVisibleTimer = 0; } else m_uiVisibleTimer -= uiDiff; // Do nothing while vanished return; } // Troll phase if (!m_bIsPhaseTwo) { if (m_uiShadowWordPainTimer < uiDiff) { if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) { if (DoCastSpellIfCan(pTarget, SPELL_SHADOW_WORD_PAIN) == CAST_OK) m_uiShadowWordPainTimer = 15000; } } else m_uiShadowWordPainTimer -= uiDiff; if (m_uiMarkTimer < uiDiff) { if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0, SPELL_MARK_ARLOKK, SELECT_FLAG_PLAYER)) { if (DoCastSpellIfCan(pTarget, SPELL_MARK_ARLOKK) == CAST_OK) { DoScriptText(SAY_FEAST_PANTHER, m_creature, pTarget); m_uiMarkTimer = 30000; } } } else m_uiMarkTimer -= uiDiff; if (m_uiGougeTimer < uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_GOUGE) == CAST_OK) { if (Unit* pTarget = m_creature->getVictim()) { if (m_creature->getThreatManager().getThreat(pTarget)) m_creature->getThreatManager().modifyThreatPercent(pTarget, -80); } m_uiGougeTimer = urand(17000, 27000); } } else m_uiGougeTimer -= uiDiff; // Transform to Panther if (m_uiTransformTimer < uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_PANTHER_TRANSFORM) == CAST_OK) { m_uiTransformTimer = 80000; m_bIsPhaseTwo = true; } } else m_uiTransformTimer -= uiDiff; } // Panther phase else { if (m_uiRavageTimer < uiDiff) { if (DoCastSpellIfCan(m_creature->getVictim(), SPELL_RAVAGE) == CAST_OK) m_uiRavageTimer = urand(10000, 15000); } else m_uiRavageTimer -= uiDiff; if (m_uiTrashTimer < uiDiff) { if (DoCastSpellIfCan(m_creature->getVictim(), SPELL_TRASH) == CAST_OK) m_uiTrashTimer = urand(13000, 15000); } else m_uiTrashTimer -= uiDiff; if (m_uiWhirlwindTimer < uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_WHIRLWIND) == CAST_OK) m_uiWhirlwindTimer = 15000; } else m_uiWhirlwindTimer -= uiDiff; if (m_uiVanishTimer < uiDiff) { // Note: this is a workaround because we do not know the real vanish spell m_creature->SetVisibility(VISIBILITY_OFF); DoResetThreat(); m_uiVanishTimer = 85000; m_uiVisibleTimer = 45000; } else m_uiVanishTimer -= uiDiff; // Transform back if (m_uiTransformTimer < uiDiff) { m_creature->RemoveAurasDueToSpell(SPELL_PANTHER_TRANSFORM); m_uiTransformTimer = 30000; m_bIsPhaseTwo = false; } else m_uiTransformTimer -= uiDiff; } DoMeleeAttackIfReady(); }