Example #1
0
    void UpdateAI(const uint32 diff)
    {
        if(!UpdateVictim())
            return;

        if(!m_creature->HasAura(SPELL_BERSERK, 0))
        {
            if(EnrageTimer < diff)
            {
                DoCast(m_creature, SPELL_BERSERK);
                switch(rand()%2)
                {
                case 0: DoScriptText(SAY_ENRAGE1, m_creature); break;
                case 1: DoScriptText(SAY_ENRAGE2, m_creature); break;
                }
            }else EnrageTimer -= diff;
        }

        if(ArcingSmashTimer < diff)
        {
            DoCast(m_creature->getVictim(),Phase1 ? SPELL_ARCING_SMASH_1 : SPELL_ARCING_SMASH_2);
            ArcingSmashTimer = 10000;
        }else ArcingSmashTimer -= diff;

        if(FelBreathTimer < diff)
        {
            DoCast(m_creature->getVictim(),Phase1 ? SPELL_FELBREATH_1 : SPELL_FELBREATH_2);
            FelBreathTimer = 25000;
        }else FelBreathTimer -= diff;

        if(EjectTimer < diff)
        {
            DoCast(m_creature->getVictim(),Phase1 ? SPELL_EJECT_1 : SPELL_EJECT_2);
            EjectTimer = 15000;
        }else EjectTimer -= diff;


        if(Charge_Timer < diff)
        {
            if(m_creature->GetDistance2d(m_creature->getVictim()) > 15)
                DoCast(m_creature->getVictim(),SPELL_CHARGE);
            Charge_Timer = 10000;
        }else Charge_Timer -= diff;

        if(Phase1)
        {
            if(BewilderingStrikeTimer < diff)
            {
                DoCast(m_creature->getVictim(), SPELL_BEWILDERING_STRIKE);
                BewilderingStrikeTimer = 20000;
            }else BewilderingStrikeTimer -= diff;

            if(BloodboilTimer < diff)
            {
                if(BloodboilCount < 5)                      // Only cast it five times.
                {
                    CastBloodboil(); // Causes issues on windows, so is commented out.
                    //DoCast(m_creature->getVictim(), SPELL_BLOODBOIL);
                    ++BloodboilCount;
                    BloodboilTimer = 10000;
                }
            }else BloodboilTimer -= diff;
        }

        if(!Phase1)
        {
            if(FelGeyserTimer < diff)
            {
                DoCast(m_creature->getVictim(), SPELL_FEL_GEYSER);
                FelGeyserTimer = 30000;
            }else FelGeyserTimer -= diff;

            if(m_creature->getVictim()->IsImmunedToDamage(SPELL_SCHOOL_MASK_ALL,true))
                m_creature->getThreatManager().modifyThreatPercent(m_creature->getVictim(),-100);
        }

        if(PhaseChangeTimer < diff)
        {
            if(Phase1)
            {
                Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0,100,true);
                if(target && target->isAlive())
                {
                    Phase1 = false;

                    TargetThreat = DoGetThreat(target);
                    TargetGUID = target->GetGUID();
                    if(DoGetThreat(target))
                        DoModifyThreatPercent(target, -100);
                    m_creature->AddThreat(target, 50000000.0f);
                    target->CastSpell(m_creature, SPELL_TAUNT_GURTOGG, true);
                    m_creature->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
                    m_creature->ApplySpellImmune(0, IMMUNITY_EFFECT,SPELL_EFFECT_ATTACK_ME, true);

                    // If VMaps are disabled, this spell can call the whole instance
                    DoCast(m_creature, SPELL_INSIGNIFIGANCE, true);
                    DoCast(target,SPELL_FEL_RAGE_1, true);
                    DoCast(target,SPELL_FEL_RAGE_2, true);
                    DoCast(target,SPELL_FEL_RAGE_3, true);
                    DoCast(target,SPELL_FEL_RAGE_SCALE, true);

                    //Cast this without triggered so that it appears in combat logs and shows visual.
                    DoCast(m_creature, SPELL_FEL_RAGE_SELF);

                    switch(rand()%2)
                    {
                    case 0: DoScriptText(SAY_SPECIAL1, m_creature); break;
                    case 1: DoScriptText(SAY_SPECIAL2, m_creature); break;
                    }

                    FelGeyserTimer = 1000;
                    PhaseChangeTimer = 30000;
                }
            }else                                           // Encounter is a loop pretty much. Phase 1 -> Phase 2 -> Phase 1 -> Phase 2 till death or enrage
            {
                if(TargetGUID)
                    RevertThreatOnTarget(TargetGUID);
                TargetGUID = 0;
                Phase1 = true;
                BloodboilTimer = 10000;
                BloodboilCount = 0;
                ArcingSmashTimer += 2000;
                FelBreathTimer += 2000;
                EjectTimer += 2000;
                PhaseChangeTimer = 65000;
                m_creature->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false);
                m_creature->ApplySpellImmune(0, IMMUNITY_EFFECT,SPELL_EFFECT_ATTACK_ME, false);
            }
        }else PhaseChangeTimer -= diff;

        DoMeleeAttackIfReady();
    }
Example #2
0
    void UpdateAI(const uint32 diff)
    {
        if (!UpdateVictim())
            return;

        if (ArcingSmashTimer <= diff)
        {
            DoCast(me->getVictim(), SPELL_ARCING_SMASH);
            ArcingSmashTimer = 10000;
        } else ArcingSmashTimer -= diff;

        if (FelAcidTimer <= diff)
        {
            DoCast(me->getVictim(), SPELL_FEL_ACID);
            FelAcidTimer = 25000;
        } else FelAcidTimer -= diff;

        if (!me->HasAura(SPELL_BERSERK))
        {
            if (EnrageTimer <= diff)
            {
                DoCast(me, SPELL_BERSERK);
                DoScriptText(RAND(SAY_ENRAGE1,SAY_ENRAGE2), me);
            } else EnrageTimer -= diff;
        }

        if (Phase1)
        {
            if (BewilderingStrikeTimer <= diff)
            {
                DoCast(me->getVictim(), SPELL_BEWILDERING_STRIKE);
                float mt_threat = DoGetThreat(me->getVictim());
                if (Unit *pTarget = SelectUnit(SELECT_TARGET_TOPAGGRO, 1))
                    me->AddThreat(pTarget, mt_threat);
                BewilderingStrikeTimer = 20000;
            } else BewilderingStrikeTimer -= diff;

            if (EjectTimer <= diff)
            {
                DoCast(me->getVictim(), SPELL_EJECT1);
                DoModifyThreatPercent(me->getVictim(), -40);
                EjectTimer = 15000;
            } else EjectTimer -= diff;

            if (AcidicWoundTimer <= diff)
            {
                DoCast(me->getVictim(), SPELL_ACIDIC_WOUND);
                AcidicWoundTimer = 10000;
            } else AcidicWoundTimer -= diff;

            if (BloodboilTimer <= diff)
            {
                if (BloodboilCount < 5)                      // Only cast it five times.
                {
                    //CastBloodboil(); // Causes issues on windows, so is commented out.
                    DoCast(me->getVictim(), SPELL_BLOODBOIL);
                    ++BloodboilCount;
                    BloodboilTimer = 10000*BloodboilCount;
                }
            } else BloodboilTimer -= diff;
        }

        if (!Phase1)
        {
            if (AcidGeyserTimer <= diff)
            {
                DoCast(me->getVictim(), SPELL_ACID_GEYSER);
                AcidGeyserTimer = 30000;
            } else AcidGeyserTimer -= diff;

            if (EjectTimer <= diff)
            {
                DoCast(me->getVictim(), SPELL_EJECT2);
                EjectTimer = 15000;
            } else EjectTimer -= diff;
        }

        if (PhaseChangeTimer <= diff)
        {
            if (Phase1)
            {
                Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0);
                if (pTarget && pTarget->isAlive())
                {
                    Phase1 = false;

                    TargetThreat = DoGetThreat(pTarget);
                    TargetGUID = pTarget->GetGUID();
                    pTarget->CastSpell(me, SPELL_TAUNT_GURTOGG, true);
                    if (DoGetThreat(pTarget))
                        DoModifyThreatPercent(pTarget, -100);
                    me->AddThreat(pTarget, 50000000.0f);
                    me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
                    me->ApplySpellImmune(0, IMMUNITY_EFFECT,SPELL_EFFECT_ATTACK_ME, true);
                    // If VMaps are disabled, this spell can call the whole instance
                    DoCast(me, SPELL_INSIGNIFIGANCE, true);
                    DoCast(pTarget, SPELL_FEL_RAGE_TARGET, true);
                    DoCast(pTarget, SPELL_FEL_RAGE_2, true);
                    /* These spells do not work, comment them out for now.
                    DoCast(pTarget, SPELL_FEL_RAGE_2, true);
                    DoCast(pTarget, SPELL_FEL_RAGE_3, true);*/

                    //Cast this without triggered so that it appears in combat logs and shows visual.
                    DoCast(me, SPELL_FEL_RAGE_SELF);

                    DoScriptText(RAND(SAY_SPECIAL1,SAY_SPECIAL2), me);

                    AcidGeyserTimer = 1000;
                    PhaseChangeTimer = 30000;
                }
            } else                                           // Encounter is a loop pretty much. Phase 1 -> Phase 2 -> Phase 1 -> Phase 2 till death or enrage
            {
                if (TargetGUID)
                    RevertThreatOnTarget(TargetGUID);
                TargetGUID = 0;
                Phase1 = true;
                BloodboilTimer = 10000;
                BloodboilCount = 0;
                AcidicWoundTimer += 2000;
                ArcingSmashTimer += 2000;
                FelAcidTimer += 2000;
                EjectTimer += 2000;
                PhaseChangeTimer = 60000;
                me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false);
                me->ApplySpellImmune(0, IMMUNITY_EFFECT,SPELL_EFFECT_ATTACK_ME, false);
            }
        } else PhaseChangeTimer -= diff;

        DoMeleeAttackIfReady();
    }
    void UpdateAI(const uint32 diff)
    {
        if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
            return;

        if (ArcingSmashTimer < diff)
        {
            DoCastSpellIfCan(m_creature->getVictim(), SPELL_ARCING_SMASH);
            ArcingSmashTimer = 10000;
        }else ArcingSmashTimer -= diff;

        if (FelAcidTimer < diff)
        {
            DoCastSpellIfCan(m_creature->getVictim(), SPELL_FEL_ACID);
            FelAcidTimer = 25000;
        }else FelAcidTimer -= diff;

        if (!m_creature->HasAura(SPELL_BERSERK, EFFECT_INDEX_0))
        {
            if (EnrageTimer < diff)
            {
                if (DoCastSpellIfCan(m_creature, SPELL_BERSERK) == CAST_OK)
                    DoScriptText(urand(0, 1) ? SAY_ENRAGE1 : SAY_ENRAGE2, m_creature);
            }else EnrageTimer -= diff;
        }

        if (Phase1)
        {
            if (BewilderingStrikeTimer < diff)
            {
                DoCastSpellIfCan(m_creature->getVictim(), SPELL_BEWILDERING_STRIKE);
                float mt_threat = m_creature->getThreatManager().getThreat(m_creature->getVictim());

                if (Unit* target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_TOPAGGRO, 1))
                    m_creature->AddThreat(target, mt_threat);

                BewilderingStrikeTimer = 20000;
            }else BewilderingStrikeTimer -= diff;

            if (EjectTimer < diff)
            {
                DoCastSpellIfCan(m_creature->getVictim(), SPELL_EJECT1);
                m_creature->getThreatManager().modifyThreatPercent(m_creature->getVictim(), -40);
                EjectTimer = 15000;
            }else EjectTimer -= diff;

            if (AcidicWoundTimer < diff)
            {
                DoCastSpellIfCan(m_creature->getVictim(), SPELL_ACIDIC_WOUND);
                AcidicWoundTimer = 10000;
            }else AcidicWoundTimer -= diff;

            if (BloodboilTimer < diff)
            {
                if (BloodboilCount < 5)                     // Only cast it five times.
                {
                    //CastBloodboil(); // Causes issues on windows, so is commented out.
                    DoCastSpellIfCan(m_creature->getVictim(), SPELL_BLOODBOIL);
                    ++BloodboilCount;
                    BloodboilTimer = 10000*BloodboilCount;
                }
            }else BloodboilTimer -= diff;
        }

        if (!Phase1)
        {
            if (AcidGeyserTimer < diff)
            {
                DoCastSpellIfCan(m_creature->getVictim(), SPELL_ACID_GEYSER);
                AcidGeyserTimer = 30000;
            }else AcidGeyserTimer -= diff;

            if (EjectTimer < diff)
            {
                DoCastSpellIfCan(m_creature->getVictim(), SPELL_EJECT2);
                EjectTimer = 15000;
            }else EjectTimer -= diff;
        }

        if (PhaseChangeTimer < diff)
        {
            if (Phase1)
            {
                Unit* target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0);
                if (target && target->isAlive())
                {
                    Phase1 = false;

                    TargetThreat = m_creature->getThreatManager().getThreat(target);
                    m_targetGuid = target->GetObjectGuid();
                    target->CastSpell(m_creature, SPELL_TAUNT_GURTOGG, true);

                    if (m_creature->getThreatManager().getThreat(target))
                        m_creature->getThreatManager().modifyThreatPercent(target, -100);

                    m_creature->AddThreat(target, 50000000.0f);

                    // If VMaps are disabled, this spell can call the whole instance
                    DoCastSpellIfCan(m_creature, SPELL_INSIGNIFIGANCE, CAST_TRIGGERED);
                    DoCastSpellIfCan(target, SPELL_FEL_RAGE_TARGET, CAST_TRIGGERED);
                    DoCastSpellIfCan(target, SPELL_FEL_RAGE_2, CAST_TRIGGERED);

                    /* These spells do not work, comment them out for now.
                    DoCastSpellIfCan(target, SPELL_FEL_RAGE_2, CAST_TRIGGERED);
                    DoCastSpellIfCan(target, SPELL_FEL_RAGE_3, CAST_TRIGGERED);*/

                    //Cast this without triggered so that it appears in combat logs and shows visual.
                    DoCastSpellIfCan(m_creature, SPELL_FEL_RAGE_SELF);

                    DoScriptText(urand(0, 1) ? SAY_SPECIAL1 : SAY_SPECIAL2, m_creature);

                    AcidGeyserTimer = 1000;
                    PhaseChangeTimer = 30000;
                }
            }else                                           // Encounter is a loop pretty much. Phase 1 -> Phase 2 -> Phase 1 -> Phase 2 till death or enrage
            {
                if (m_targetGuid)
                    RevertThreatOnTarget(m_targetGuid);

                m_targetGuid.Clear();
                Phase1 = true;
                BloodboilTimer = 10000;
                BloodboilCount = 0;
                AcidicWoundTimer += 2000;
                ArcingSmashTimer += 2000;
                FelAcidTimer += 2000;
                EjectTimer += 2000;
                PhaseChangeTimer = 60000;
            }
        }else PhaseChangeTimer -= diff;

        //Enrage
        if (m_uiEnrageTimer < diff)
        {
            DoCast(m_creature, SPELL_ENRAGE);
            m_uiEnrageTimer = 60000;
        }else m_uiEnrageTimer -= diff;

        DoMeleeAttackIfReady();
    }