void JustReachedHome() override { if (m_pInstance) m_pInstance->SetData(TYPE_IONAR, FAIL); DespawnSpark(); }
void JustDied(Unit* killer) { DoScriptText(SAY_DEATH, m_creature); DespawnSpark(); if (m_pInstance) m_pInstance->SetData(TYPE_IONAR, DONE); }
void UpdateAI(const uint32 uiDiff) { // Splitted if (m_creature->GetVisibility() == VISIBILITY_OFF) { if (!m_creature->getVictim()) { Reset(); return; } if (m_uiSplit_Timer < uiDiff) { m_uiSplit_Timer = 2500; // Return sparks to where Ionar splitted if (m_bIsSplitPhase) { CallBackSparks(); m_bIsSplitPhase = false; } // Lightning effect and restore Ionar else if (m_uiSparkAtHomeCount == MAX_SPARKS) { m_creature->SetVisibility(VISIBILITY_ON); m_creature->CastSpell(m_creature, SPELL_SPARK_DESPAWN, false); DespawnSpark(); m_uiSparkAtHomeCount = 0; m_uiSplit_Timer = 25000; m_bIsSplitPhase = true; if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() != TARGETED_MOTION_TYPE) { if (m_creature->getVictim()) m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); } } } else m_uiSplit_Timer -= uiDiff; return; } //Return since we have no target if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; if (m_uiStaticOverload_Timer < uiDiff) { if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(pTarget, m_bIsRegularMode ? SPELL_STATIC_OVERLOAD_N : SPELL_STATIC_OVERLOAD_H); m_uiStaticOverload_Timer = urand(5000, 6000); } else m_uiStaticOverload_Timer -= uiDiff; if (m_uiBallLightning_Timer < uiDiff) { DoCast(m_creature->getVictim(), m_bIsRegularMode ? SPELL_BALL_LIGHTNING_N : SPELL_BALL_LIGHTNING_H); m_uiBallLightning_Timer = urand(10000, 11000); } else m_uiBallLightning_Timer -= uiDiff; // Health check if ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < (100-(20*m_uiHealthAmountModifier))) { ++m_uiHealthAmountModifier; DoScriptText(urand(0, 1) ? SAY_SPLIT_1 : SAY_SPLIT_2, m_creature); if (m_creature->IsNonMeleeSpellCasted(false)) m_creature->InterruptNonMeleeSpells(false); DoCast(m_creature, SPELL_DISPERSE); } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 uiDiff) { // Splitted if (m_creature->GetVisibility() == VISIBILITY_OFF) { if (!m_creature->isInCombat()) { Reset(); return; } if (m_uiSplit_Timer < uiDiff) { m_uiSplit_Timer = 2500; // Return sparks to where Ionar splitted if (m_bIsSplitPhase) { CallBackSparks(); m_bIsSplitPhase = false; } // Lightning effect and restore Ionar else { m_creature->SetVisibility(VISIBILITY_ON); m_creature->CastSpell(m_creature, SPELL_SPARK_DESPAWN, false); DespawnSpark(); m_uiSparkAtHomeCount = 0; m_uiSplit_Timer = 25000; m_bIsSplitPhase = true; if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() != CHASE_MOTION_TYPE) { if (m_creature->getVictim()) m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); } } } else m_uiSplit_Timer -= uiDiff; return; } if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; if (m_uiStaticOverload_Timer < uiDiff) { if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) DoCastSpellIfCan(pTarget, m_bIsRegularMode ? SPELL_STATIC_OVERLOAD_N : SPELL_STATIC_OVERLOAD_H); m_uiStaticOverload_Timer = urand(5000, 6000); } else m_uiStaticOverload_Timer -= uiDiff; if (m_uiBallLightning_Timer < uiDiff) { if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) m_creature->CastSpell(pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(), m_bIsRegularMode ? SPELL_BALL_LIGHTNING_N : SPELL_BALL_LIGHTNING_H, false, NULL, NULL, m_creature->GetObjectGuid()); m_uiBallLightning_Timer = urand(10000, 11000); } else m_uiBallLightning_Timer -= uiDiff; // Health check if (m_creature->GetHealthPercent() < float(100 - 20*m_uiHealthAmountModifier)) { ++m_uiHealthAmountModifier; DoScriptText(urand(0, 1) ? SAY_SPLIT_1 : SAY_SPLIT_2, m_creature); if (m_creature->IsNonMeleeSpellCasted(false)) m_creature->InterruptNonMeleeSpells(false); DoCastSpellIfCan(m_creature, SPELL_DISPERSE); } DoMeleeAttackIfReady(); }