void Reset() { instance->SetBossState(DATA_MAJORDOMUS, NOT_STARTED); events.Reset(); me->GetMotionMaster()->MoveTargetedHome(); summons.DespawnAll(); TransformToDruid(); }
void UpdateAI(uint32 diff) { if (!UpdateVictim() && phase != PHASE_NONE || me->HasUnitState(UNIT_STATE_CASTING)) return; if (phase == PHASE_SCORPION && me->GetPower(POWER_ENERGY) == 100) { DoCast(me, RAID_MODE(SPELL_FLAME_SCYTE_10N,SPELL_FLAME_SCYTE_25N,SPELL_FLAME_SCYTE_10H,SPELL_FLAME_SCYTE_25H)); Talk(SAY_SCYTE); } if (phase == PHASE_CAT && me->GetPower(POWER_ENERGY) == 100) { DoCast(me, SPELL_LEAPING_FLAMES_SUMMON); if (Unit* tempTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 500.0f, true)) { DoCast(tempTarget, SPELL_LEAPING_FLAMES); DoCast(tempTarget, RAID_MODE(SPELL_LEAP_FLAMES_DMG_10N,SPELL_LEAP_FLAMES_DMG_25N,SPELL_LEAP_FLAMES_DMG_10H,SPELL_LEAP_FLAMES_DMG_25H)); } Talk(SAY_LEAP); } events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_CHECK_FORM: { uint8 numb = 0; Map::PlayerList const& players = me->GetMap()->GetPlayers(); for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) if (Player* player = itr->getSource()) if (me->GetDistance(player) <= 7.0f) ++numb; if ((numb >= (Is25ManRaid() ? 18 : 7)) && phase != PHASE_SCORPION && phase != PHASE_DRUID) { if (transformcount == 3) { transformcount = 0; TransformToDruid(); } else { transformcount += 1; TransformToScorpion(); } } else if ((numb < (Is25ManRaid() ? 18 : 7)) && phase != PHASE_CAT && phase != PHASE_DRUID) { if (transformcount == 3) { transformcount = 0; TransformToDruid(); } else { transformcount += 1; TransformToCat(); } } events.ScheduleEvent(EVENT_CHECK_FORM, 1000); break; } case EVENT_ENERGY_REGEN: { if (phase == PHASE_CAT || phase == PHASE_SCORPION) { int32 power = 5; if (me->HasAura(SPELL_ADRENALINE)) power += power * (me->GetAura(SPELL_ADRENALINE)->GetStackAmount() * 20) / 100; me->SetPower(POWER_ENERGY, me->GetPower(POWER_ENERGY)+power); } events.ScheduleEvent(EVENT_ENERGY_REGEN, 1000); break; } case EVENT_INTRO_1: Talk(SAY_INTRO_1); break; case EVENT_INTRO_2: Talk(SAY_INTRO_2); break; case EVENT_INTRO_3: Talk(SAY_INTRO_3); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); me->SetReactState(REACT_DEFENSIVE); break; case EVENT_BERSERK: DoCast(me, SPELL_BERSERK); break; case EVENT_SUMMON_ORBS: { std::list<Unit*> targets; SelectTargetList(targets, RAID_MODE(2, 3, 2, 3), SELECT_TARGET_RANDOM, 200.0f, true); if (!targets.empty()) for (std::list<Unit*>::iterator itr = targets.begin(); itr != targets.end(); ++itr) DoCast(*itr, SPELL_BURNING_ORBS_SUMMON); break; } } } DoMeleeAttackIfReady(); }