Exemplo n.º 1
0
        void EnterCombat(Unit* who)
        {
			BossAI::EnterCombat(who);
			me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
			if (events.Empty() && events2.Empty())
				events2.ScheduleEvent(EVENT_INTRO_2, 3000);
        }
Exemplo n.º 2
0
        void UpdateAI(uint32 diff)
        {
			events2.Update(diff);
			switch (events2.ExecuteEvent())
			{
				case EVENT_ENTROPIUS_AURAS:
					me->CastSpell(me, SPELL_ENTROPIUS_COSMETIC_SPAWN, false);
					me->CastSpell(me, SPELL_NEGATIVE_ENERGY_PERIODIC, true);
					break;
				case EVENT_ENTROPIUS_COMBAT:
					me->SetReactState(REACT_AGGRESSIVE);
					me->SetInCombatWithZone();
					AttackStart(SelectTargetFromPlayerList(50.0f));
					break;
			}

			if (!events2.Empty())
				return;

            if (!UpdateVictim())
                return;

			events.Update(diff);
			if (me->HasUnitState(UNIT_STATE_CASTING))
				return;

			switch (events.ExecuteEvent())
			{
				case EVENT_SPELL_ENRAGE:
					me->CastSpell(me, SPELL_ENRAGE, true);
					break;
				case EVENT_SPAWN_DARKNESS:
					if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
						me->CastSpell(target, SPELL_DARKNESS, true);
					events.ScheduleEvent(EVENT_SPAWN_DARKNESS, 15000);
					break;
				case EVENT_SPAWN_BLACK_HOLE:
					if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
						me->CastSpell(target, SPELL_BLACK_HOLE, true);
					events.ScheduleEvent(EVENT_SPAWN_BLACK_HOLE, 15000);
					break;
			}

            DoMeleeAttackIfReady();
        }
Exemplo n.º 3
0
        void UpdateAI(uint32 diff)
        {
			events2.Update(diff);
			switch (events2.ExecuteEvent())
			{
				case EVENT_TALK_GOOD_1:
					me->SetRegeneratingHealth(false);
					me->RemoveAllAuras();
					me->SetReactState(REACT_PASSIVE);
					me->CombatStop();
					me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
					me->setFaction(35);
					events2.ScheduleEvent(EVENT_TALK_GOOD_2, 1000);
					break;
				case EVENT_TALK_GOOD_2:
					if (Creature* Sath = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_SATHROVARR)))
					{
						summons.Despawn(Sath);
						Unit::Kill(me, Sath);
					}
					events2.ScheduleEvent(EVENT_TALK_GOOD_3, 8000);
					break;
				case EVENT_TALK_GOOD_3:
					Talk(SAY_GOOD_PLRWIN);
					events2.ScheduleEvent(EVENT_TALK_GOOD_4, 10000);
					break;
				case EVENT_TALK_GOOD_4:
					me->SetDisableGravity(true);
					me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
					events2.ScheduleEvent(EVENT_TALK_GOOD_5, 10000);
					break;
				case EVENT_TALK_GOOD_5:
					me->SetVisible(false);
					Unit::Kill(me, me);
					break;
				case EVENT_TALK_BAD_1:
					me->SetReactState(REACT_PASSIVE);
					me->CombatStop();
					me->RemoveAllAuras();
					me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
					Talk(SAY_EVIL_ENRAGE);
					events2.ScheduleEvent(EVENT_TALK_BAD_2, 3000);
					break;
				case EVENT_TALK_BAD_2:
					me->SetDisableGravity(true);
					me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
					events2.ScheduleEvent(EVENT_TALK_BAD_3, 15000);
					break;
				case EVENT_TALK_BAD_3:
					me->SetVisible(false);
					EnterEvadeMode();
					break;
			}

			if (!events2.Empty())
				return;

			if (!UpdateVictim())
				return;

			events.Update(diff);
			if (me->HasUnitState(UNIT_STATE_CASTING))
				return;

			switch (events.ExecuteEvent())
			{
				case EVENT_SPAWN_SPECTRALS:
					me->SummonCreature(NPC_KALEC, 1702.21f, 931.7f, -74.56f, 5.07f, TEMPSUMMON_MANUAL_DESPAWN);
					me->SummonCreature(NPC_SATHROVARR, 1704.62f, 927.78f, -73.9f, 2.0f, TEMPSUMMON_MANUAL_DESPAWN);
					break;
				case EVENT_ARCANE_BUFFET:
					me->CastSpell(me, SPELL_ARCANE_BUFFET, false);
					events.ScheduleEvent(EVENT_ARCANE_BUFFET, 8000);
					break;
				case EVENT_FROST_BREATH:
					me->CastSpell(me->GetVictim(), SPELL_FROST_BREATH, false);
					events.ScheduleEvent(EVENT_FROST_BREATH, 15000);
					break;
				case EVENT_TAIL_LASH:
					me->CastSpell(me->GetVictim(), SPELL_TAIL_LASH, false);
					events.ScheduleEvent(EVENT_TAIL_LASH, 15000);
					break;
				case EVENT_WILD_MAGIC:
					me->CastCustomSpell(RAND(44978, 45001, 45002, 45004, 45006, 45010), SPELLVALUE_MAX_TARGETS, 1, me, false);
					events.ScheduleEvent(EVENT_WILD_MAGIC, 20000);
					break;
				case EVENT_SPECTRAL_BLAST:
					me->CastSpell(me, SPELL_SPECTRAL_BLAST, false);
					events.ScheduleEvent(EVENT_SPECTRAL_BLAST, urand(15000, 25000));
					break;
				case EVENT_CHECK_POS:
					if (me->GetDistance(me->GetHomePosition()) > 50.0f)
					{
						EnterEvadeMode();
						return;
					}
					events.ScheduleEvent(EVENT_CHECK_POS, 5000);
					break;
				case EVENT_CHECK_HEALTH:
					if (me->HealthBelowPct(10))
					{
						if (Creature* Sath = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_SATHROVARR)))
                            Sath->AI()->DoAction(ACTION_ENRAGE_OTHER);
                        DoAction(ACTION_ENRAGE);
						break;
					}
					events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
					break;
				case EVENT_CHECK_HEALTH2:
					if (me->HealthBelowPct(1))
					{
                        DoAction(ACTION_BANISH);
						break;
					}
					events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1000);
					break;
			}

			DoMeleeAttackIfReady();
		}
Exemplo n.º 4
0
        void UpdateAI(uint32 diff)
        {
			events2.Update(diff);
			switch (events2.ExecuteEvent())
			{
				case EVENT_INTRO_1:
					me->SetStandState(UNIT_STAND_STATE_STAND);
					events2.ScheduleEvent(EVENT_INTRO_2, 4000);
					break;
				case EVENT_INTRO_2:
					Talk(YELL_BIRTH);
					me->SetDisableGravity(true);
					me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
					me->SendMovementFlagUpdate();
					events2.ScheduleEvent(EVENT_INTRO_3, 1500);
					break;
				case EVENT_INTRO_3:
					me->GetMotionMaster()->MovePoint(POINT_AIR, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+10.0f, false, true);
					events2.ScheduleEvent(EVENT_INTRO_4, 2000);
					break;
				case EVENT_INTRO_4:
					events.ScheduleEvent(EVENT_LAND, 3000, 1);
					events.ScheduleEvent(EVENT_SPELL_BERSERK, 600000);
					me->SetInCombatWithZone();
					me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
					me->CastSpell(me, SPELL_NOXIOUS_FUMES, true);
					me->GetMotionMaster()->MovePoint(POINT_MISC, 1472.18f, 603.38f, 34.0f, false, true);
					break;
			}

			if (!events2.Empty())
				return;

            if (!UpdateVictim())
                return;

            events.Update(diff);
            if (me->HasUnitState(UNIT_STATE_CASTING))
                return;

			switch(events.ExecuteEvent())
			{
				case EVENT_RESTORE_COMBAT:
					me->SetReactState(REACT_AGGRESSIVE);
					break;
				case EVENT_RESTORE_COMBAT2:
					me->SetTarget(me->GetVictim()->GetGUID());
					me->GetMotionMaster()->MoveChase(me->GetVictim());
					break;
				case EVENT_LAND:
					me->GetMotionMaster()->MovePoint(POINT_GROUND, me->GetPositionX(), me->GetPositionY(), me->GetMap()->GetHeight(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()), false, true);
					break;
				case EVENT_SPELL_BERSERK:
					Talk(YELL_BERSERK);
					me->CastSpell(me, SPELL_BERSERK, true);
					break;
				case EVENT_SPELL_CLEAVE:
					me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false);
					events.ScheduleEvent(EVENT_SPELL_CLEAVE, 7500, 1);
					break;
				case EVENT_SPELL_CORROSION:
					me->CastSpell(me->GetVictim(), SPELL_CORROSION, false);
					events.ScheduleEvent(EVENT_SPELL_CORROSION, 20000, 1);
					break;
				case EVENT_SPELL_GAS_NOVA:
					DoCast(me, SPELL_GAS_NOVA, false);
					events.ScheduleEvent(EVENT_SPELL_GAS_NOVA, 20000, 1);
					break;
				case EVENT_SPELL_ENCAPSULATE:
					if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
						me->CastSpell(target, SPELL_ENCAPSULATE_CHANNEL, false);
					events.ScheduleEvent(EVENT_SPELL_ENCAPSULATE, 25000, 1);
					break;
				case EVENT_FLIGHT:
					events.CancelEventGroup(1);
					events.ScheduleEvent(EVENT_FLIGHT_SEQ, 1000);
					me->SetReactState(REACT_PASSIVE);
					me->StopMoving();
					me->GetMotionMaster()->Clear();
					break;
				case EVENT_FLIGHT_SEQ:
                    Talk(YELL_TAKEOFF);
					me->SetTarget(0);
					me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
					me->SetDisableGravity(true);
					me->SendMovementFlagUpdate();

					events.ScheduleEvent(EVENT_FLIGHT_MOVE_UP, 2000);
					events.ScheduleEvent(EVENT_FLIGHT_VAPOR, 8000);
					events.ScheduleEvent(EVENT_FLIGHT_VAPOR, 21000);
					events.ScheduleEvent(EVENT_FLIGHT_BREATH1, 35000);
					events.ScheduleEvent(EVENT_FLIGHT_BREATH1, 72000);
					events.ScheduleEvent(EVENT_LAND_FIGHT, 86000);
					break;
				case EVENT_FLIGHT_MOVE_UP:
					me->GetMotionMaster()->MovePoint(POINT_AIR, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+15.0f, false, true);
					break;
				case EVENT_FLIGHT_VAPOR:
					me->CastSpell(me, SPELL_SUMMON_DEMONIC_VAPOR, true);
					break;
				case EVENT_FLIGHT_BREATH1:
				{
					Position pos = {1447.0f + urand(0, 2)*25.0f, 705.0f, 50.0f, 4.71f};
					me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_START1, pos, false, true);
					break;
				}
				case EVENT_FLIGHT_BREATH2:
				{
					Position pos = {1447.0f + urand(0, 2)*25.0f, 515.0f, 50.0f, 1.57f};
					me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_START2, pos, false, true);
					break;
				}
				case EVENT_FLIGHT_EMOTE:
					Talk(EMOTE_BREATH);
					break;
				case EVENT_CORRUPT_TRIGGERS:
                    me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(0));
					me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(500));
					me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(1000));
					me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(1500));
					me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(2000));
					me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(2500));
					me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(3000));
					me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(3500));
					me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(4000));
					break;
				case EVENT_FLIGHT_FLYOVER1:
					me->CastSpell(me, SPELL_FELMYST_SPEED_BURST, true);
					me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_END1, me->GetPositionX(), me->GetPositionY()-200.0f, me->GetPositionZ()+5.0f, false, true);
					break;
				case EVENT_FLIGHT_FLYOVER2:
					me->CastSpell(me, SPELL_FELMYST_SPEED_BURST, true);
					me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_END2, me->GetPositionX(), me->GetPositionY()+200.0f, me->GetPositionZ()+5.0f, false, true);
					break;
				case EVENT_LAND_FIGHT:
					me->GetMotionMaster()->MovePoint(POINT_GROUND, 1500.0f, 552.8f, 26.52f, false, true);
					break;

			}

			if (!me->HasUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY))
				DoMeleeAttackIfReady();
        }