Exemplo n.º 1
0
        void Reset()
        {
            instance->SetBossState(DATA_MAJORDOMUS, NOT_STARTED);
            events.Reset();

            me->GetMotionMaster()->MoveTargetedHome();

            summons.DespawnAll();

            TransformToDruid();
        }
Exemplo n.º 2
0
		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();
		}