void KilledUnit(Unit* pVictim) override
    {
        if (!m_pInstance)
            return;

        Creature* pSpeaker = m_pInstance->GetSingleCreatureFromStorage(m_pInstance->GetPlayerTeam() == ALLIANCE ? NPC_GARROSH : NPC_VARIAN);
        if (!pSpeaker)
            return;

        switch (urand(0, 3))
        {
            case 0: DoScriptText(m_pInstance->GetPlayerTeam() == ALLIANCE ? SAY_GARROSH_PVP_A_SLAY_1 : SAY_VARIAN_PVP_H_SLAY_1, pSpeaker); break;
            case 1: DoScriptText(m_pInstance->GetPlayerTeam() == ALLIANCE ? SAY_GARROSH_PVP_A_SLAY_2 : SAY_VARIAN_PVP_H_SLAY_2, pSpeaker); break;
            case 2: DoScriptText(m_pInstance->GetPlayerTeam() == ALLIANCE ? SAY_GARROSH_PVP_A_SLAY_3 : SAY_VARIAN_PVP_H_SLAY_3, pSpeaker); break;
            case 3: DoScriptText(m_pInstance->GetPlayerTeam() == ALLIANCE ? SAY_GARROSH_PVP_A_SLAY_4 : SAY_VARIAN_PVP_H_SLAY_4, pSpeaker); break;
        }
    }
    void UpdateAI(const uint32 uiDiff) override
    {
        if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
            return;

        // Call specific virtual function
        if (!UpdateCrusaderAI(uiDiff))
            return;

        if (m_uiAbilityTimer < uiDiff)
        {
            uint8 uiIndex = urand(0, m_uiMaxAbilities - 1);
            uint32 uiMinHealth = m_pAbilityArray[uiIndex].m_uiMinHealth;
            uint8 uiTargetType = m_pAbilityArray[uiIndex].m_uiTargetType;

            SelectFlags spellSelectFlag = m_pAbilityArray[uiIndex].m_selectFlag;

            // check timers and health condition
            // only cast spells that have timers expired
            // also check for health percentage for self cast spells
            if (m_uiSpellTimer[uiIndex] || (uiTargetType == TARGET_TYPE_SELF && uiMinHealth && m_creature->GetHealthPercent() > uiMinHealth))
            {
                 m_uiAbilityTimer = 2000;
                 return;
            }
            else
            {
                uint32 uiSpellId = m_pAbilityArray[uiIndex].m_uiSpellId;

                // special case for heroism / bloodlust
                if (uiSpellId == SPELL_HEROISM && m_pInstance && m_pInstance->GetPlayerTeam() == ALLIANCE)
                    uiSpellId = SPELL_BLOODLUST;

                if (CanUseSpecialAbility(uiSpellId, uiTargetType, spellSelectFlag, uiMinHealth))
                {
                    m_uiSpellTimer[uiIndex] = m_pAbilityArray[uiIndex].m_uiCooldown;
                    m_uiAbilityTimer = urand(2000, 6000);
                }
                else
                    m_uiAbilityTimer = 2000;
            }
        }
        else
            m_uiAbilityTimer -= uiDiff;

        // spell cooldown
        for (uint8 i = 0; i < m_uiMaxAbilities; ++i)
        {
            if (m_uiSpellTimer[i])
            {
                if (m_uiSpellTimer[i] <= uiDiff)
                    m_uiSpellTimer[i] = 0;
                else
                    m_uiSpellTimer[i] -= uiDiff;
            }
        }

        // Change target
        if (m_uiResetThreatTimer < uiDiff)
        {
            if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 1))
            {
                DoResetThreat();
                AttackStart(pTarget);
                m_uiResetThreatTimer = urand(5000, 15000);
            }
        }
        else
            m_uiResetThreatTimer -= uiDiff;

        // CC check for PVP trinket
        if (m_uiIsCCTimer < uiDiff)
        {
            if (m_creature->isFrozen() || m_creature->hasUnitState(UNIT_STAT_CAN_NOT_REACT))
            {
                // Pvp trinket only in heroic mode
                if (m_pInstance && m_pInstance->IsHeroicDifficulty() && !m_uiTrinketCooldownTimer)
                {
                    if (DoCastSpellIfCan(m_creature, SPELL_PVP_TRINKET, CAST_TRIGGERED) == CAST_OK)
                        m_uiTrinketCooldownTimer = 120000;
                }

                SendAIEventAround(AI_EVENT_GOT_CCED, NULL, 0, CRUSADER_AIEVENT_THROW_RADIUS);
                SendAIEvent(AI_EVENT_GOT_CCED, NULL, m_creature);
                m_uiIsCCTimer = 5000;
            }
            else
                m_uiIsCCTimer = 2000;
        }
        else
            m_uiIsCCTimer -= uiDiff;

        // trinket cooldown
        if (m_uiTrinketCooldownTimer)
        {
            if (m_uiTrinketCooldownTimer <= uiDiff)
                m_uiTrinketCooldownTimer = 0;
            else
                m_uiTrinketCooldownTimer -= uiDiff;
        }

        DoMeleeAttackIfReady();
    }