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(); }
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(); }