void UpdateAI(const uint32 uiDiff) { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; // Slime Stream if (!m_uiSlimeStreamTimer) { if (!m_creature->CanReachWithMeleeAttack(m_creature->getVictim())) { if (DoCastSpellIfCan(m_creature, SPELL_SLIME_STREAM) == CAST_OK) // Give some time, to re-reach grobbulus m_uiSlimeStreamTimer = 3*IN_MILLISECONDS; } } else { if (m_uiSlimeStreamTimer < uiDiff) m_uiSlimeStreamTimer = 0; else m_uiSlimeStreamTimer -= uiDiff; } // Berserk if (m_uiBerserkTimer) { if (m_uiBerserkTimer <= uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_BERSERK) == CAST_OK) m_uiBerserkTimer = 0; } else m_uiBerserkTimer -= uiDiff; } // SlimeSpray if (m_uiSlimeSprayTimer < uiDiff) { if (DoCastSpellIfCan(m_creature->getVictim(), m_bIsRegularMode ? SPELL_SLIME_SPRAY : SPELL_SLIME_SPRAY_H) == CAST_OK) { m_uiSlimeSprayTimer = urand(30*IN_MILLISECONDS, 60*IN_MILLISECONDS); DoScriptText(EMOTE_SPRAY_SLIME, m_creature); } } else m_uiSlimeSprayTimer -= uiDiff; // Mutagen Injection if (m_uiInjectionTimer < uiDiff) { if (DoCastMutagenInjection()) { // Timer dependend on time of encounter - on enrage time between 5-8s, heroic 2-5s (TODO no reliable source for heroic) if (m_bIsRegularMode) m_uiInjectionTimer = urand(10*IN_MILLISECONDS, 13*IN_MILLISECONDS) - 5 * (m_uiBerserkTimeSecs*IN_MILLISECONDS - m_uiBerserkTimer) / m_uiBerserkTimeSecs; else m_uiInjectionTimer = urand(10*IN_MILLISECONDS, 13*IN_MILLISECONDS) - 8 * (m_uiBerserkTimeSecs*IN_MILLISECONDS - m_uiBerserkTimer) / m_uiBerserkTimeSecs; } } else m_uiInjectionTimer -= uiDiff; // Poison Cloud if (m_uiPoisonCloudTimer < uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_POISON_CLOUD) == CAST_OK) m_uiPoisonCloudTimer = 15*IN_MILLISECONDS; } else m_uiPoisonCloudTimer -= uiDiff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 uiDiff) override { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; // Slime Stream if (!m_uiSlimeStreamTimer) { if (!m_creature->CanReachWithMeleeAttack(m_creature->getVictim())) { if (DoCastSpellIfCan(m_creature, SPELL_SLIME_STREAM) == CAST_OK) // Give some time, to re-reach grobbulus m_uiSlimeStreamTimer = 3 * IN_MILLISECONDS; } } else { if (m_uiSlimeStreamTimer < uiDiff) m_uiSlimeStreamTimer = 0; else m_uiSlimeStreamTimer -= uiDiff; } // Berserk if (m_uiBerserkTimer) { if (m_uiBerserkTimer <= uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_BERSERK) == CAST_OK) m_uiBerserkTimer = 0; } else m_uiBerserkTimer -= uiDiff; } // SlimeSpray if (m_uiSlimeSprayTimer < uiDiff) { if (DoCastSpellIfCan(m_creature->getVictim(), SPELL_SLIME_SPRAY) == CAST_OK) { m_uiSlimeSprayTimer = urand(30 * IN_MILLISECONDS, 60 * IN_MILLISECONDS); DoScriptText(EMOTE_SPRAY_SLIME, m_creature); } } else m_uiSlimeSprayTimer -= uiDiff; // Mutagen Injection if (m_uiInjectionTimer < uiDiff) { if (DoCastMutagenInjection()) { // Mutagen Injection should be used more often when below 30% if (m_creature->GetHealthPercent() > 30.0f) m_uiInjectionTimer = urand(7000, 13000); else m_uiInjectionTimer = urand(3000, 7000); } } else m_uiInjectionTimer -= uiDiff; // Poison Cloud if (m_uiPoisonCloudTimer < uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_POISON_CLOUD) == CAST_OK) m_uiPoisonCloudTimer = 15 * IN_MILLISECONDS; } else m_uiPoisonCloudTimer -= uiDiff; DoMeleeAttackIfReady(); }