void Reset() override { if (_instance->GetBossState(DATA_TERON_GOREFIEND) != IN_PROGRESS) { me->DespawnOrUnsummon(); return; } targetGUID.Clear(); _scheduler.CancelAll(); _scheduler.Schedule(Seconds(12), [this](TaskContext atrophy) { DoCastVictim(SPELL_ATROPHY); atrophy.Repeat(Seconds(10), Seconds(12)); }); _scheduler.Schedule(Milliseconds(200), [this](TaskContext checkPlayer) { if (Unit* target = ObjectAccessor::GetUnit(*me, targetGUID)) { if (!target->IsAlive() || !me->CanCreatureAttack(target)) SelectNewTarget(); } else SelectNewTarget(); checkPlayer.Repeat(Seconds(1)); }); if (Creature* teron = _instance->GetCreature(DATA_TERON_GOREFIEND)) teron->AI()->JustSummoned(me); SelectNewTarget(); }
void UpdateAI(uint32 diff) { if( TargetGUID ) { Unit* target = ObjectAccessor::GetPlayer(*me, TargetGUID); if( !target || !target->HasAura(SPELL_MARK) || !me->IsValidAttackTarget(target) || me->GetMotionMaster()->GetCurrentMovementGeneratorType() != CHASE_MOTION_TYPE || !me->HasUnitState(UNIT_STATE_CHASE_MOVE) ) { SelectNewTarget(true); return; } } events.Update(diff); switch( events.GetEvent() ) { case 0: break; case 1: me->CastSpell(me, SPELL_SPIKE_SPEED2, true); events.PopEvent(); events.RescheduleEvent(2, 7000); break; case 2: me->CastSpell(me, SPELL_SPIKE_SPEED3, true); events.PopEvent(); break; case 3: Reset(); break; } }
void Reset() { SelectNewTarget(false); }
void UpdateAI(uint32 diff) { if (me->GetVictim()) if(!me->HasAura(RAID_MODE(SPELL_FACE_RAGE_10N, SPELL_FACE_RAGE_25N,SPELL_FACE_RAGE_10H, SPELL_FACE_RAGE_25H)) && me->GetVictim()->HasAura(SPELL_FACE_RAGE) && !me->HasAura(CRYSTAL_PRISON_EFFECT)) { if (Unit* RageTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 500.0f, true, SPELL_RAGE)) { me->getThreatManager().resetAllAggro(); me->AddThreat(RageTarget, 500.0f); if (me->GetDistance(RageTarget) >= 13.0f) me->JumpTo(RageTarget,15); me->GetMotionMaster()->MoveChase(RageTarget); me->AI()->AttackStart(RageTarget); } me->GetVictim()->RemoveAurasDueToSpell(SPELL_FACE_RAGE); } if(GetShannox() && !me->IsInCombat()) { if (me->GetDistance(GetShannox()) > 20.0f) me->SetPosition(GetShannox()->GetPositionX()+5,GetShannox()->GetPositionY()-5,GetShannox()->GetPositionZ(),0); else me->GetMotionMaster()->MoveFollow(GetShannox(), walkRagefaceDistance, walkRagefaceAngle); } events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_CHANGE_TARGET: if (!me->GetVictim()->HasAura(SPELL_RAGE) && !me->HasAura(RAID_MODE(SPELL_FACE_RAGE_10N, SPELL_FACE_RAGE_25N,SPELL_FACE_RAGE_10H, SPELL_FACE_RAGE_25H))) SelectNewTarget(); events.ScheduleEvent(EVENT_CHANGE_TARGET, urand(9000,15000)); break; case EVENT_FACE_RAGE: if (Unit *FaceRageTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 500, true)) { me->getThreatManager().resetAllAggro(); me->AddThreat(FaceRageTarget, 500.0f); if (me->GetDistance(FaceRageTarget) >= 13.0f) me->JumpTo(FaceRageTarget,15); me->GetMotionMaster()->MoveChase(FaceRageTarget); me->AI()->AttackStart(FaceRageTarget); DoCast(FaceRageTarget,SPELL_FACE_RAGE); } events.ScheduleEvent(EVENT_FACE_RAGE, 61000); break; case EVENT_PRISON_DOG_ATTACK_RAGEFACE: if (Creature* prison = me->FindNearestCreature(NPC_CRYSTAL_PRISON, 50.0f, true)) { int32 dmg = prison->GetMaxHealth() * 0.20; me->DealDamage(prison,dmg); if (prison->IsAlive()) events.ScheduleEvent(EVENT_PRISON_DOG_ATTACK_RAGEFACE, 1000); } break; default: break; } } if (me->HasAura(CRYSTAL_PRISON_EFFECT) && !prisonStartAttack) if (me->FindNearestCreature(NPC_CRYSTAL_PRISON, 50.0f, true)) { events.ScheduleEvent(EVENT_PRISON_DOG_ATTACK_RAGEFACE, 1000); prisonStartAttack = true; } if(GetShannox()) { if(GetShannox()->GetHealthPct() <= 30 && frenzy == false && !me->GetMap()->IsHeroic()) { frenzy = true; DoCast(me, SPELL_FRENZIED_DEVOLUTION); } if(GetShannox()->GetDistance2d(me) >= maxDistanceBetweenShannoxAndDogs && !me->HasAura(SPELL_SEPERATION_ANXIETY)) //TODO Sniff right Distance { DoCast(me, SPELL_SEPERATION_ANXIETY); } } if (!UpdateVictim()) return; if(Unit* victim = me->GetVictim()) // DoMeleeAttackIfReady implementation of Feeding Frenzy. if (me->isAttackReady() && me->IsWithinMeleeRange(victim)) { me->AttackerStateUpdate(victim); me->resetAttackTimer(); if (me->GetMap()->IsHeroic()) me->AddAura(SPELL_FEEDING_FRENZY_H, me); } }