Esempio n. 1
0
        void UpdateAI(const uint32 diff)
        {
            if (!UpdateVictim())
                return;

            events.Update(diff);

            if (me->HasUnitState(UNIT_STATE_CASTING))
                return;

            while (uint32 eventId = events.ExecuteEvent())
            {
                switch (eventId)
                {
                    case EVENT_FELL_FIREBALL:
                        if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0))
                            DoCast(target, SPELL_FELL_FIREBALL);
                        events.RescheduleEvent(EVENT_FELL_FIREBALL, 1000);
                        return;
                }
            }

            DoMeleeAttackIfReady();
        }
Esempio n. 2
0
        void UpdateAI(const uint32 diff)
        {
            //Return since we have no target
            if (!UpdateVictim())
                return;

            events.Update(diff);

            if (me->HasUnitState(UNIT_STAT_CASTING))
                return;

            while (uint32 eventId = events.ExecuteEvent())
            {
                switch (eventId)
                {
                    case EVENT_SOUL_STRIKE:
                        DoCast(me->getVictim(), SPELL_SOUL_STRIKE);
                        events.RescheduleEvent(EVENT_SOUL_STRIKE, 8000);
                        return;
                }
            }

            DoMeleeAttackIfReady();
        }
		void UpdateAI(uint32 diff)
		{
			if (!UpdateVictim())
				return;

			events.Update(diff);

			if( me->HasUnitState(UNIT_STATE_CASTING) )
				return;

			switch( events.GetEvent() )
			{
				case 0:
					break;
				case EVENT_YELL_DEAD_1:
					Talk(YELL_DEAD_1);
					events.PopEvent();
					break;
				case EVENT_START_RESURRECTION:
					me->CastSpell(me, SPELL_SUMMON_VALKYR, true);
					events.PopEvent();
					events.RescheduleEvent(EVENT_VALKYR_BEAM, 7000);
					events.RescheduleEvent(EVENT_VALKYR_MOVE, 1);
					events.RescheduleEvent(EVENT_ANNHYLDE_YELL, 3000);
					break;
				case EVENT_VALKYR_MOVE:
					if( Creature* s = ObjectAccessor::GetCreature(*me, ValkyrGUID) )
						s->GetMotionMaster()->MovePoint(1, s->GetPositionX(), s->GetPositionY(), s->GetPositionZ()-15.0f);
					events.PopEvent();
					break;
				case EVENT_ANNHYLDE_YELL:
					if( Creature* s = ObjectAccessor::GetCreature(*me, ValkyrGUID) )
						s->AI()->Talk(YELL_ANHYLDE_2);
					events.PopEvent();
					break;
				case EVENT_VALKYR_BEAM:
					me->RemoveAura(SPELL_SUMMON_VALKYR);
					if( Creature* c = ObjectAccessor::GetCreature(*me, ValkyrGUID) )
						c->CastSpell(me, SPELL_RESURRECTION_BEAM, false);
					events.PopEvent();
					events.RescheduleEvent(EVENT_RESURRECTION_BALL, 4000);
					break;
				case EVENT_RESURRECTION_BALL:
					me->CastSpell(me, SPELL_RESURRECTION_BALL, true);
					events.PopEvent();
					events.RescheduleEvent(EVENT_RESURRECTION_HEAL, 4000);
					break;
				case EVENT_RESURRECTION_HEAL:
					me->RemoveAura(SPELL_RESURRECTION_BALL);
					me->CastSpell(me, SPELL_RESURRECTION_HEAL, true);
					FeignDeath(false);
					events.PopEvent();
					events.RescheduleEvent(EVENT_MORPH_TO_UNDEAD, 3000);
					break;
				case EVENT_MORPH_TO_UNDEAD:
					me->CastSpell(me, SPELL_INGVAR_TRANSFORM, true);
					events.PopEvent();
					events.RescheduleEvent(EVENT_START_PHASE_2, 1000);
					break;
				case EVENT_START_PHASE_2:
					if( Creature* c = ObjectAccessor::GetCreature(*me, ValkyrGUID) )
					{
						c->DespawnOrUnsummon();
						summons.DespawnAll();
					}
					events.PopEvent();
					me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
					AttackStart(me->GetVictim());
					me->GetMotionMaster()->MoveChase(me->GetVictim());
					Talk(YELL_AGGRO_2);

					// schedule Phase 2 abilities
					events.RescheduleEvent(EVENT_SPELL_ROAR, 15000);
					events.RescheduleEvent(EVENT_SPELL_CLEAVE_OR_WOE_STRIKE, 2000);
					events.RescheduleEvent(EVENT_SPELL_SMASH, 5000);
					events.RescheduleEvent(EVENT_SPELL_ENRAGE_OR_SHADOW_AXE, 10000);

					break;

				// ABILITIES HERE:
				case EVENT_UNROOT:
					me->SetControlled(false, UNIT_STATE_ROOT);
					me->DisableRotate(false);
					events.PopEvent();
					break;
				case EVENT_SPELL_ROAR:
					Talk(EMOTE_ROAR);

					me->_AddCreatureSpellCooldown(SPELL_STAGGERING_ROAR, 0);
					me->_AddCreatureSpellCooldown(SPELL_DREADFUL_ROAR, 0);

					if (me->GetDisplayId() == DISPLAYID_DEFAULT)
						me->CastSpell((Unit*)NULL, SPELL_STAGGERING_ROAR, false);
					else
						me->CastSpell((Unit*)NULL, SPELL_DREADFUL_ROAR, false);
					events.RepeatEvent(urand(15000,20000));
					break;
				case EVENT_SPELL_CLEAVE_OR_WOE_STRIKE:
					if( me->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID) == 0 )
					{
						events.RepeatEvent(3000);
						break;
					}
					if (me->GetDisplayId() == DISPLAYID_DEFAULT)
						me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false);
					else
						me->CastSpell(me->GetVictim(), SPELL_WOE_STRIKE, false);
					events.RepeatEvent(urand(0,4000)+3000);
					break;
				case EVENT_SPELL_SMASH:
					if( me->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID) == 0 )
					{
						events.RepeatEvent(3000);
						break;
					}
					me->SetControlled(true, UNIT_STATE_ROOT);
					me->DisableRotate(true);
					me->SendMovementFlagUpdate();
					if (me->GetDisplayId() == DISPLAYID_DEFAULT)
						me->CastSpell((Unit*)NULL, SPELL_SMASH, false);
					else
						me->CastSpell((Unit*)NULL, SPELL_DARK_SMASH, false);
					events.RepeatEvent(urand(9000,11000));
					events.RescheduleEvent(EVENT_UNROOT, 3750);
					break;
				case EVENT_SPELL_ENRAGE_OR_SHADOW_AXE:
					if (me->GetDisplayId() == DISPLAYID_DEFAULT)
					{
						me->CastSpell(me, SPELL_ENRAGE, false);
						events.RepeatEvent(10000);
					}
					else
					{
						me->CastSpell((Unit*)NULL, SPELL_SHADOW_AXE, true);
						SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
						events.RepeatEvent(35000);
						events.RescheduleEvent(EVENT_AXE_RETURN, 10000);
					}
					break;
				case EVENT_AXE_RETURN:
					if (Creature* c = ObjectAccessor::GetCreature(*me, ThrowGUID))
						c->GetMotionMaster()->MoveCharge(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+0.5f);
					events.PopEvent();
					events.RescheduleEvent(EVENT_AXE_PICKUP, 1500);
					break;
				case EVENT_AXE_PICKUP:
					if (Creature* c = ObjectAccessor::GetCreature(*me, ThrowGUID))
					{
						c->DestroyForNearbyPlayers();
						c->DespawnOrUnsummon();
						summons.DespawnAll();
					}
					ThrowGUID = 0;
					SetEquipmentSlots(true);
					events.PopEvent();
					break;
			}

			if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
				DoMeleeAttackIfReady();
		}
Esempio n. 4
0
        void SpellHit(Unit * Hitter, SpellInfo const* spell) override
        {
            m_events.RescheduleEvent(EVENT_COMBAT_TIMER, 1000);
            m_combatTime[Hitter->GetGUID()] = time(NULL);

            if (Player* player = Hitter->ToPlayer())
            {
                switch (player->getClass())
                {
                case CLASS_WARRIOR:
                {
                    if (spell->Id == 100) player->KilledMonsterCredit(44175);
                    break;
                }
                case CLASS_PALADIN:
                {
                    if (player->HasAura(105361) && spell->Id == 20271) // wowhead: this is the correct spell/aura	: Seal of Command	
                    {
                        player->KilledMonsterCredit(44420);
                        player->KilledMonsterCredit(44175);
                    }
                    if (player->HasAura(20154) && spell->Id == 20271)	// wowhead: this is a wrong lv 42 spell/aura, but used now in core.. : Seal of Righteousness				
                    {
                        player->KilledMonsterCredit(44420);
                        player->KilledMonsterCredit(44175);
                    }
                    break;
                }
                case CLASS_HUNTER:
                {
                    if (spell->Id == 56641) player->KilledMonsterCredit(44175);
                    break;
                }
                case CLASS_ROGUE:
                {
                    if (spell->Id == 2098) player->KilledMonsterCredit(44175);
                    break;
                }
                case CLASS_PRIEST:
                {
                    if (spell->Id == 589) player->KilledMonsterCredit(44175);
                    break;
                }
                case CLASS_DEATH_KNIGHT:
                {
                    break;
                }
                case CLASS_SHAMAN:
                {
                    if (spell->Id == 73899) player->KilledMonsterCredit(44175);
                    break;
                }
                case CLASS_MAGE:
                {
                    if (!m_spell_is_on_work)
                    {
                        if (Hitter->getRace() == RACE_TROLL)
                        {
                            if (spell->Id == 122) player->KilledMonsterCredit(44175);
                            if (spell->Id == 133) player->KilledMonsterCredit(44175);
                            if (spell->Id == 2136) player->KilledMonsterCredit(44175);
                        }
                        if (spell->Id == 7268 && !m_spell_is_on_work)
                        {
                            m_spell_is_on_work = true;
                            m_events.ScheduleEvent(EVENT_COOLDOWN, 7000);
                            player->KilledMonsterCredit(44175);
                        }
                    }
                    break;
                }
                case CLASS_WARLOCK:
                {
                    if (spell->Id == 172) player->KilledMonsterCredit(44175);
                    if (spell->Id == 348) player->KilledMonsterCredit(44175);
                    if (spell->Id == 2098) player->KilledMonsterCredit(44175);
                    break;
                }
                case CLASS_DRUID:
                {
                    if (spell->Id == 8921) player->KilledMonsterCredit(44175);
                    break;
                }
                }
            }
        }
Esempio n. 5
0
		void UpdateAI(uint32 diff)
		{
			if( !UpdateVictim() )
				return;

			events.Update(diff);

			if( me->HasUnitState(UNIT_STATE_CASTING) )
				return;

			if( !bPhase3 && HealthBelowPct(30) && !me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE) && !me->HasAura(SPELL_SUBMERGE) && !me->HasAura(SPELL_EMERGE) )
			{
				bPhase3 = true;
				events.CancelEvent(EVENT_SUBMERGE);
				events.CancelEvent(EVENT_EMERGE);
				events.CancelEvent(EVENT_EMERGE_2);
				if( !IsHeroic() )
					events.CancelEvent(EVENT_SUMMON_NERUBIAN);
				me->CastSpell((Unit*)NULL, SPELL_LEECHING_SWARM, false);
				Talk(EMOTE_LEECHING_SWARM);
				Talk(SAY_LEECHING_SWARM);
				return;
			}

			switch( events.GetEvent() )
			{
				case 0:
					break;
				case EVENT_ENRAGE:
					{
						me->CastSpell(me, SPELL_BERSERK, true);
						events.PopEvent();
					}
					break;
				case EVENT_RESPAWN_SPHERE:
					{
						uint8 StartAt = urand(0,5);
						uint8 i = StartAt;
						do
						{
							if( Creature* c = ObjectAccessor::GetCreature(*me, SphereGUID[i]) )
								if( !c->HasAura(SPELL_FROST_SPHERE) )
								{
									if( Creature* c = me->SummonCreature(NPC_FROST_SPHERE, AnubLocs[i+5]) )
										SphereGUID[i] = c->GetGUID();
									break;
								}
							i = (i+1)%6;
						}
						while( i != StartAt );
						events.RepeatEvent(4000);
					}
					break;
				case EVENT_SPELL_FREEZING_SLASH:
					{
						if( me->GetVictim() )
							me->CastSpell(me->GetVictim(), SPELL_FREEZING_SLASH, false);
						events.RepeatEvent(urand(15000,20000));
					}
					break;
				case EVENT_SPELL_PENETRATING_COLD:
					{
						me->CastCustomSpell(SPELL_PENETRATING_COLD, SPELLVALUE_MAX_TARGETS, RAID_MODE(2,5,2,5));
						events.RepeatEvent(18000);
					}
					break;
				case EVENT_SUMMON_NERUBIAN:
					{
						me->CastCustomSpell(SPELL_SUMMON_BURROWER, SPELLVALUE_MAX_TARGETS, RAID_MODE(1,2,2,4));
						events.RepeatEvent(45000);
					}
					break;
				case EVENT_SUBMERGE:
					{
						me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
						bool berserk = me->HasAura(SPELL_BERSERK);
						me->RemoveAllAuras();
						if (berserk)
							me->CastSpell(me, SPELL_BERSERK, true);
						Talk(EMOTE_SUBMERGE);
						Talk(EMOTE_BURROWER);
						me->CastSpell(me, SPELL_SUBMERGE, false);
						events.CancelEvent(EVENT_SUMMON_NERUBIAN);
						events.CancelEvent(EVENT_SPELL_FREEZING_SLASH);
						events.CancelEvent(EVENT_SPELL_PENETRATING_COLD);
						events.RescheduleEvent(EVENT_EMERGE, EMERGE_INTERVAL);
						events.RescheduleEvent(EVENT_SPELL_SUMMON_SPIKE, 2500);
						events.RescheduleEvent(EVENT_SUMMON_SCARAB, 3000);
						events.PopEvent();
					}
					break;
				case EVENT_SUMMON_SCARAB:
					{
						uint8 i = urand(0,3);
						if( Creature* c = ObjectAccessor::GetCreature(*me, BurrowGUID[i]) )
							me->CastSpell(c, SPELL_SUMMON_SCARAB, true);
						events.RepeatEvent(4000);
					}
					break;
				case EVENT_EMERGE:
					{
						me->CastSpell(me, SPELL_SPIKE_TELE, true);
						summons.DespawnEntry(NPC_SPIKE);
						events.CancelEvent(EVENT_SUMMON_SCARAB);
						events.RescheduleEvent(EVENT_EMERGE_2, 2000);
						events.PopEvent();
					}
					break;
				case EVENT_EMERGE_2:
					{
						Talk(SAY_EMERGE);
						me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
						me->setAttackTimer(BASE_ATTACK, 3000);
						me->RemoveAura(SPELL_SUBMERGE);
						me->CastSpell(me, SPELL_EMERGE, false);
						events.RescheduleEvent(EVENT_SUMMON_NERUBIAN, urand(5000,8000));
						events.RescheduleEvent(EVENT_SPELL_FREEZING_SLASH, urand(7000,15000));
						events.RescheduleEvent(EVENT_SPELL_PENETRATING_COLD, urand(15000,20000));
						events.RescheduleEvent(EVENT_SUBMERGE, SUBMERGE_INTERVAL);
						events.PopEvent();
					}
					break;
				case EVENT_SPELL_SUMMON_SPIKE:
					me->CastSpell(me, SPELL_SUMMON_SPIKE, true);
					events.PopEvent();
					break;
			}

			DoMeleeAttackIfReady();
		}
Esempio n. 6
0
 void Reset() override
 {
     _drizzleGuid = 0;
     _player_GUID = 0;
     _events.RescheduleEvent(EVENT_START_ANIM, 500);
 }
        void UpdateAI(uint32 diff)
        {
			events.Update(diff);
			uint32 eventId = events.GetEvent();

			if (eventId == EVENT_SPELL_INHIBIT_MAGIC)
            {
                Map::PlayerList const &PlayerList = me->GetMap()->GetPlayers();
                for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
                    if (Player* player = i->GetSource())
					{
						float dist = me->GetDistance(player);
                        if (player->IsAlive() && dist < 45.0f)
                        {
                            Aura* aura = player->GetAura(SPELL_INHIBIT_MAGIC);
							if (!aura)
								aura = me->AddAura(SPELL_INHIBIT_MAGIC, player);
							else
								aura->RefreshDuration();

							if (aura)
								aura->SetStackAmount(getStackCount(dist));
                        }
						else
							player->RemoveAurasDueToSpell(SPELL_INHIBIT_MAGIC);
					}
				events.RepeatEvent(3000);
				return;
			}

            if (!UpdateVictim())
                return;


			switch (eventId)
			{
				case EVENT_SPELL_ATTRACT_MAGIC:
					me->CastSpell(me, SPELL_ATTRACT_MAGIC, false);
					events.RepeatEvent(30000);
					events.RescheduleEvent(EVENT_SPELL_CARNIVOROUS, 1500);
					break;
				case EVENT_SPELL_CARNIVOROUS:
					me->CastSpell(me, DUNGEON_MODE(SPELL_CARNIVOROUS_BITE_N, SPELL_CARNIVOROUS_BITE_H), false);
					events.RepeatEvent(10000);
					break;
				case EVENT_SPELL_FOCUS_FIRE:
					if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, true))
					{
						if (Creature* cr = me->SummonCreature(ENTRY_FOCUS_FIRE, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 7000))
							focusGUID = cr->GetGUID();
						Talk(EMOTE_FOCUSED, target);
					}
					events.RepeatEvent(urand(15000, 20000));
					events.ScheduleEvent(EVENT_SPELL_FOCUS_FIRE_2, 3000);
					events.ScheduleEvent(EVENT_SPELL_FOCUS_FIRE_2, 3500);
					events.ScheduleEvent(EVENT_SPELL_FOCUS_FIRE_2, 4000);
					events.ScheduleEvent(EVENT_SPELL_FOCUS_FIRE_3, 5000);
					me->SetControlled(true, UNIT_STATE_ROOT);
					break;
				case EVENT_SPELL_FOCUS_FIRE_2:
					if (Unit* flare = ObjectAccessor::GetCreature(*me, focusGUID))
						me->CastSpell(flare, SPELL_FOCUS_CAST, true);
					events.PopEvent();
					break;
				case EVENT_SPELL_FOCUS_FIRE_3:
					me->SetControlled(false, UNIT_STATE_ROOT);
					events.PopEvent();
					break;
			}

            DoMeleeAttackIfReady();
        }
        void UpdateAI(uint32 diff)
        {
            events.Update(diff);
            switch(events.GetEvent())
            {
                case 0:
                    break;
                case 20:
                    if (pInstance)
                    {
                        pInstance->SetData(DATA_INSTANCE_PROGRESS, INSTANCE_PROGRESS_FINISHED_KRICK_SCENE);

                        if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_LEADER_FIRST_GUID)))
                        {
                            c->GetMotionMaster()->Clear();
                            c->UpdatePosition(SBSLeaderStartPos, true);
                            c->StopMovingOnCurrentPos();
                            c->AI()->Reset();
                        }
                    }
                    events.PopEvent();
                    events.RescheduleEvent(1, 3000);
                    break;
                case 1:
                    Talk(SAY_OUTRO_KRICK_1);
                    if (pInstance)
                    {
                        if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_LEADER_FIRST_GUID)))
                        {
                            float angle = me->GetAngle(c);
                            me->SetFacingTo(angle);
                            float x = me->GetPositionX()+cos(angle)*7.0f;
                            float y = me->GetPositionY()+sin(angle)*7.0f;
                            c->GetMotionMaster()->MovePoint(0, x, y, me->GetPositionZ());
                        }

                        for (uint8 i=0; i<2; ++i)
                            if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_GUARD_1_GUID+i)))
                                c->DespawnOrUnsummon();
                    }
                    events.PopEvent();
                    events.RescheduleEvent(2, 7000);
                    break;
                case 2:
                    if (pInstance)
                    {
                        if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_TYRANNUS_EVENT_GUID)))
                        {
                            c->setActive(true);
                            c->UpdatePosition(SBSTyrannusStartPos, true);
                            c->SetHomePosition(SBSTyrannusStartPos);
                        }
                        if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_LEADER_FIRST_GUID)))
                            c->AI()->Talk(c->GetEntry() == NPC_JAINA_PART1 ? SAY_JAINA_KRICK_1 : SAY_SYLVANAS_KRICK_1);
                    }
                    events.PopEvent();
                    events.RescheduleEvent(3, 6500);
                    break;
                case 3:
                    Talk(SAY_OUTRO_KRICK_2);
                    events.PopEvent();
                    events.RescheduleEvent(4, 17000);
                    break;
                case 4:
                    if (pInstance)
                    {
                        if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_TYRANNUS_EVENT_GUID)))
                            c->GetMotionMaster()->MovePath(PATH_BEGIN_VALUE+10, false);
                        if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_LEADER_FIRST_GUID)))
                            c->AI()->Talk(c->GetEntry() == NPC_JAINA_PART1 ? SAY_JAINA_KRICK_2 : SAY_SYLVANAS_KRICK_2);
                    }
                    events.PopEvent();
                    events.RescheduleEvent(5, 6500);
                    break;
                case 5:
                    Talk(SAY_OUTRO_KRICK_3);
                    events.PopEvent();
                    events.RescheduleEvent(6, 6500);
                    break;
                case 6:
                    if (pInstance)
                        if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_TYRANNUS_EVENT_GUID)))
                        {
                            c->SetFacingToObject(me);
                            c->AI()->Talk(SAY_TYRANNUS_KRICK_1);
                        }
                    events.PopEvent();
                    events.RescheduleEvent(7, 4000);
                    break;
                case 7:
                    me->CastSpell(me, 69413, true);
                    me->SendMeleeAttackStop(me->GetVictim());
                    me->SetCanFly(true);
                    me->SetDisableGravity(true);
                    me->SendMovementFlagUpdate();
                    me->GetMotionMaster()->MoveTakeoff(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+9.0f, 0.5f * 7.0f);

                    events.PopEvent();
                    events.RescheduleEvent(8, 2000);
                    break;
                case 8:
                    Talk(SAY_OUTRO_KRICK_4);
                    events.PopEvent();
                    events.RescheduleEvent(9, 1500);
                    break;
                case 9:
                    if (pInstance)
                        if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_TYRANNUS_EVENT_GUID)))
                            c->CastSpell(c, 69753, false);

                    me->SetReactState(REACT_PASSIVE);
                    me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29 | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
                    me->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
                    me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
                    me->AddUnitState(UNIT_STATE_DIED);

                    me->CastSpell(me, SPELL_KRICK_KILL_CREDIT, true);

                    me->RemoveAllAuras();
                    me->GetMotionMaster()->MoveFall(0, true);
                    events.PopEvent();
                    events.RescheduleEvent(10, 5000);
                    break;
                case 10:
                    if (pInstance)
                        if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_TYRANNUS_EVENT_GUID)))
                            c->AI()->Talk(SAY_TYRANNUS_KRICK_2);
                    events.PopEvent();
                    events.RescheduleEvent(11, 9000);
                    break;
                case 11:
                    if (pInstance)
                    {
                        if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_TYRANNUS_EVENT_GUID)))
                            c->GetMotionMaster()->MovePoint(1, 809.39f, 74.69f, 541.54f);
                        if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_LEADER_FIRST_GUID)))
                        {
                            c->AI()->Talk(c->GetEntry() == NPC_JAINA_PART1 ? SAY_JAINA_KRICK_3 : SAY_SYLVANAS_KRICK_3);
                            c->GetMotionMaster()->MovePath(PATH_BEGIN_VALUE+11, false);
                        }
                    }
                    me->setActive(false);
                    Unit::Kill(me, me);
                    events.PopEvent();
                    break;
            }
        }
Esempio n. 9
0
		void UpdateAI(uint32 diff)
		{
			if (!UpdateVictim())
				return;

			if( me->GetPositionX() < 490.0f || me->GetPositionX() > 690.0f || me->GetPositionY() < 130.0f || me->GetPositionY() > 410.0f )
			{
				EnterEvadeMode();
				return;
			}

			events.Update(diff);

			if (me->HasUnitState(UNIT_STATE_CASTING))
				return;

			switch (events.GetEvent())
			{
				case 0:
					break;
				case EVENT_ACTIVATE_CONSTRUCT:
					me->CastCustomSpell(SPELL_ACTIVATE_CONSTRUCT, SPELLVALUE_MAX_TARGETS, 1, (Unit*)NULL, false);
					if (++counter >= 20)
					{
						me->MonsterYell(TEXT_BERSERK, LANG_UNIVERSAL, 0);
						me->PlayDirectSound(SOUND_BERSERK);
						me->CastSpell(me, SPELL_BERSERK, true);
						events.PopEvent();
						break;
					}
					events.RepeatEvent(RAID_MODE(40000,30000));
					break;
				case EVENT_SPELL_SCORCH:
					if( rand()%2 )
					{
						me->MonsterYell(TEXT_SCORCH_1, LANG_UNIVERSAL, 0);
						me->PlayDirectSound(SOUND_SCORCH_1);
					}
					else
					{
						me->MonsterYell(TEXT_SCORCH_2, LANG_UNIVERSAL, 0);
						me->PlayDirectSound(SOUND_SCORCH_2);
					}
					me->SetControlled(true, UNIT_STATE_ROOT);
					me->DisableRotate(true);
					me->SendMovementFlagUpdate();
					me->CastSpell(me->GetVictim(), S_SCORCH, false);
					events.RepeatEvent(20000);
					events.RescheduleEvent(EVENT_ENABLE_ROTATE, 3001);
					break;
				case EVENT_ENABLE_ROTATE:
					me->SetControlled(false, UNIT_STATE_ROOT);
					me->DisableRotate(false);
					events.PopEvent();
					break;
				case EVENT_SPELL_FLAME_JETS:
					me->MonsterTextEmote(TEXT_FLAME_JETS, 0, true);
					me->CastSpell(me->GetVictim(), S_FLAME_JETS, false);
					events.RepeatEvent(25000);
					break;
				case EVENT_GRAB:
					{
						std::list<Creature*> icl;
						me->GetCreaturesWithEntryInRange(icl, 300.0f, NPC_IRON_CONSTRUCT);

						std::vector<uint64> playerGUIDs;
						Map::PlayerList const& pl = me->GetMap()->GetPlayers();
						Player* temp = NULL;

						for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr )
						{
							temp = itr->GetSource();
							if( !temp->IsAlive() || temp->GetExactDist2d(me) > 90.0f )
								continue;
							if( me->GetVictim() && temp->GetGUID() == me->GetVictim()->GetGUID() )
								continue;
							bool found = false;
							for( std::list<Creature*>::iterator itr = icl.begin(); itr != icl.end(); ++itr )
								if( (*itr)->GetVictim() && (*itr)->GetVictim()->GetGUID() == temp->GetGUID() )
								{
									found = true;
									break;
								}

							if( !found )
								playerGUIDs.push_back(temp->GetGUID());
						}

						if( !playerGUIDs.empty() )
						{
							int8 pos = urand(0, playerGUIDs.size()-1);
							if( Player* pTarget = ObjectAccessor::GetPlayer(*me,playerGUIDs.at(pos)) )
							{
								me->MonsterYell(TEXT_SLAG_POT, LANG_UNIVERSAL, 0);
								me->PlayDirectSound(SOUND_SLAG_POT);
								me->CastSpell(pTarget, SPELL_GRAB, false);
							}
						}

						events.RepeatEvent(24000); // +6000 below
						events.DelayEvents(6000);
					}
					break;
			}

			DoMeleeAttackIfReady();
		}
        void UpdateAI(uint32 diff)
        {
            if (startPath)
            {
                me->StopMoving();
                startPath = false;
                if (WaypointPath const* i_path = sWaypointMgr->GetPath(me->GetWaypointPath()))
                {
                    Movement::PointsArray pathPoints;
                    pathPoints.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()));
                    for (uint8 i = 0; i < i_path->size(); ++i)
                    {
                        WaypointData const* node = i_path->at(i);
                        pathPoints.push_back(G3D::Vector3(node->x, node->y, node->z));
                    }
                    me->GetMotionMaster()->MoveSplinePath(&pathPoints);
                }
            }

            if (!UpdateVictim())
                return;

            events.Update(diff);

            if (me->HasUnitState(UNIT_STATE_CASTING))
                return;

            switch (events.GetEvent())
            {
                case 0:
                    break;
                case EVENT_ENRAGE:
                    me->CastSpell(me, SPELL_BERSERK, true);
                    events.RepeatEvent(600000);
                    break;
                case EVENT_COMMANDER_SAY_AGGRO:
                    if (Creature* commander = ObjectAccessor::GetCreature(*me, CommanderGUID))
                        commander->AI()->Talk(SAY_COMMANDER_AGGRO);
                    events.PopEvent();
                    break;
                case EVENT_EE_SAY_MOVE_OUT:
                    for (uint8 i=0; i<3; ++i)
                        if (Creature* c = ObjectAccessor::GetCreature(*me, ExpeditionEngineerGUIDs[i]))
                        {
                            if (!i)
                                c->MonsterYell(TEXT_EE_MOVE_OUT, LANG_UNIVERSAL, 0);
                            c->AI()->SetData(1, 0); // start repairing
                        }
                    events.PopEvent();
                    break;
                case EVENT_SPELL_FIREBALL:
                    if( Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 200.0f, true) )
                        me->CastSpell(pTarget, SPELL_FIREBALL, false);
                    events.RepeatEvent(4000);
                    break;
                case EVENT_SPELL_DEVOURING_FLAME:
                    if( Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 200.0f, true) )
                        me->CastSpell(pTarget, SPELL_DEVOURINGFLAME, false);
                    events.RepeatEvent(13000);
                    break;
                case EVENT_SUMMON_MOLE_MACHINES:
                    {
                        memset(cords, '\0', sizeof(cords));
                        uint8 num = RAID_MODE( urand(2,3), urand(2,4) );
                        for( int i=0; i<num; ++i )
                        {
                            // X: (550, 625) Y: (-185, -230)
                            cords[i][0] = urand(550, 625);
                            cords[i][1] = -230 + rand()%45;
                            if( GameObject* drill = me->SummonGameObject(GO_DRILL, cords[i][0], cords[i][1], 391.1f, M_PI/4, 0.0f, 0.0f, 0.0f, 0.0f, 8) )
                            {
                                //drill->SetGoAnimProgress(0);
                                //drill->SetLootState(GO_READY);
                                //drill->UseDoorOrButton(8);
                                //drill->SetGoState(GO_STATE_READY);
                                drill->SetGoState(GO_STATE_ACTIVE);
                                drill->SetGoAnimProgress(0);
                            }
                        }
                        events.RepeatEvent(45000);
                        events.RescheduleEvent(EVENT_SUMMON_ADDS, 4000);
                    }
                    break;
                case EVENT_SUMMON_ADDS:
                    for( int i=0; i<4; ++i )
                    {
                        if( !cords[i][0] )
                            break;

                        uint8 opt;
                        uint8 r = urand(1,100);
                        if( r <= 30 ) opt = 1;
                        else if( r <= 65 ) opt = 2;
                        else opt = 3;

                        for( int j=0; j<4; ++j )
                        {
                            float x = cords[i][0] + 4.0f*cos(j*M_PI/2);
                            float y = cords[i][1] + 4.0f*sin(j*M_PI/2);

                            uint32 npc_entry = 0;
                            switch( opt )
                            {
                                case 1: if( j == 1 ) npc_entry = NPC_DARK_RUNE_SENTINEL; break;
                                case 2:
                                    switch( j )
                                    {
                                        case 1: npc_entry = NPC_DARK_RUNE_WATCHER; break;
                                        case 2: npc_entry = NPC_DARK_RUNE_GUARDIAN; break;
                                    }
                                    break;
                                default: // case 3:
                                    switch( j )
                                    {
                                        case 1: npc_entry = NPC_DARK_RUNE_WATCHER; break;
                                        case 2: npc_entry = NPC_DARK_RUNE_GUARDIAN; break;
                                        case 3: npc_entry = NPC_DARK_RUNE_GUARDIAN; break;
                                    }
                                    break;
                            }

                            if( npc_entry )
                                if (Creature* c = me->SummonCreature(npc_entry, x, y, 391.1f, j*M_PI/2, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000))
                                    DoZoneInCombat(c);

                        }
                    }
                    events.PopEvent();
                    break;
                case EVENT_WARN_DEEP_BREATH:
                    me->MonsterTextEmote(TEXT_DEEP_BREATH, 0, true);
                    me->RemoveAura(62794);
                    events.PopEvent();
                    events.ScheduleEvent(EVENT_PHASE2_FLAME_BREATH, 2500);
                    break;
                case EVENT_PHASE2_FLAME_BREATH:
                    me->CastSpell(me, S_FLAMEBREATH, true);
                    events.PopEvent();
                    events.ScheduleEvent(EVENT_FLY_UP, 2000);
                    break;
                case EVENT_FLY_UP:
                    me->SetInCombatWithZone(); // just in case
                    if (pInstance)
                        for( int i=0; i<4; ++i )
                            if( uint64 guid = pInstance->GetData64(DATA_HARPOON_FIRE_STATE_1 + i) )
                                if( Creature* hfs = ObjectAccessor::GetCreature(*me, guid) )
                                {
                                    me->SummonCreature(34188, hfs->GetPositionX(), hfs->GetPositionY(), hfs->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 22000);
                                    hfs->AI()->SetData(1, 0);
                                }

                    me->RemoveAura(SPELL_LAUNCH_CHAIN);
                    me->RemoveAura(SPELL_CHAIN_1);
                    me->RemoveAura(SPELL_CHAIN_3);
                    if (RAID_MODE(0,1))
                    {
                        me->RemoveAura(SPELL_CHAIN_2);
                        me->RemoveAura(SPELL_CHAIN_4);
                    }
                    me->CastSpell(me, SPELL_WINGBUFFET, true);
                    
                    if( (me->GetHealth()*100) / me->GetMaxHealth() < 50 ) // start phase 3
                    {
                        me->SetControlled(false, UNIT_STATE_ROOT);
                        me->DisableRotate(false);
                        DoResetThreat();
                        Unit* target = SelectTarget(SELECT_TARGET_NEAREST, 0, 0.0, true);
                        if (!target)
                            target = me->SelectNearestPlayer(200.0f);
                        if (target)
                        {
                            AttackStart(target);
                            me->GetMotionMaster()->MoveChase(target);
                        }
                        bGroundPhase = true;
                        events.PopEvent();
                        events.CancelEvent(EVENT_SPELL_FIREBALL);
                        events.CancelEvent(EVENT_SPELL_DEVOURING_FLAME);
                        events.CancelEvent(EVENT_SUMMON_MOLE_MACHINES);

                        events.ScheduleEvent(EVENT_SPELL_FLAME_BREATH, 20000);
                        events.ScheduleEvent(EVENT_SPELL_DEVOURING_FLAME_GROUND, 5000);
                        events.ScheduleEvent(EVENT_SPELL_FUSE_ARMOR, 10000);
                        events.ScheduleEvent(EVENT_SPELL_FLAME_BUFFET, 3000);

                        break;
                    }
                    else
                    {
                        ++flyTimes;
                        me->SetControlled(false, UNIT_STATE_ROOT);
                        me->DisableRotate(false);
                        me->SendMeleeAttackStop(me->GetVictim());
                        me->GetMotionMaster()->MoveIdle();
                        me->StopMoving();
                        me->SetCanFly(true);
                        me->SetDisableGravity(true);
                        me->SetHover(true);
                        me->SendMovementFlagUpdate();
                        me->GetMotionMaster()->MoveTakeoff(1, CORDS_AIR, 25.0f);
                        events.ScheduleEvent(EVENT_RESUME_FIXING, 22000);
                    }

                    events.PopEvent();
                    break;
                case EVENT_RESUME_FIXING:
                    for (uint8 i=0; i<3; ++i)
                        if (Creature* c = ObjectAccessor::GetCreature(*me, ExpeditionEngineerGUIDs[i]))
                        {
                            if (!i)
                                c->MonsterYell(TEXT_EE_FIRES_OUT, LANG_UNIVERSAL, 0);
                            c->AI()->SetData(1, 0); // start repairing
                        }
                    events.PopEvent();
                    break;
                case EVENT_SPELL_FLAME_BREATH:
                    me->CastSpell(me->GetVictim(), S_FLAMEBREATH, false);
                    events.RepeatEvent(20000);
                    break;
                case EVENT_SPELL_DEVOURING_FLAME_GROUND:
                    me->CastSpell(me->GetVictim(), SPELL_DEVOURINGFLAME, false);
                    events.RepeatEvent(13000);
                    break;
                case EVENT_SPELL_FUSE_ARMOR:
                    if (Unit* victim = me->GetVictim())
                        if (me->IsWithinMeleeRange(victim))
                        {
                            me->CastSpell(victim, SPELL_FUSEARMOR, false);
                            if (Aura* aur = victim->GetAura(SPELL_FUSEARMOR))
                                if (aur->GetStackAmount() == 5)
                                    victim->CastSpell(victim, 64774, true);
                            events.RepeatEvent(10000);
                            break;
                        }
                    events.RepeatEvent(2000);
                    break;
                case EVENT_SPELL_FLAME_BUFFET:
                    me->CastSpell(me->GetVictim(), S_FLAMEBUFFET, false);
                    events.RepeatEvent(7000);
                    break;
            }

            if (bGroundPhase)
                DoMeleeAttackIfReady();
        }
Esempio n. 11
0
		void UpdateAI(uint32 diff)
		{
			if (!UpdateVictim() && !me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
				return;

			events.Update(diff);

			if (me->HasUnitState(UNIT_STATE_CASTING))
				return;

			switch(events.GetEvent())
			{
				case 0:
					break;
				case EVENT_EMERGE:
					me->SetVisible(true);
					me->CastSpell(me, SPELL_EMERGE_0, false);
					events.PopEvent();
					events.RescheduleEvent(EVENT_ATTACK, 2000);
					break;
				case EVENT_SUMMON_TOTEMS:
					for (uint8 i=0; i<3; ++i)
						DoSummon(NPC_TOTEM, TotemPos[i], 10*60*1000, TEMPSUMMON_TIMED_DESPAWN);
					events.PopEvent();
					break;
				case EVENT_INVOKER_SAY_1:
					if (Player* plr = ObjectAccessor::GetPlayer(*me, InvokerGUID))
					{
						plr->MonsterSay("The Ice Stone has melted!", LANG_UNIVERSAL, 0);
						plr->CastSpell(plr, SPELL_MAKE_BONFIRE, true);
					}
					events.PopEvent();
					events.RescheduleEvent(EVENT_INVOKER_SAY_2, 2000);
					break;
				case EVENT_INVOKER_SAY_2:
					if (Player* plr = ObjectAccessor::GetPlayer(*me, InvokerGUID))
						plr->MonsterSay("Ahune, your strength grows no more!", LANG_UNIVERSAL, 0);
					events.PopEvent();
					events.RescheduleEvent(EVENT_INVOKER_SAY_3, 2000);
					break;
				case EVENT_INVOKER_SAY_3:
					if (Player* plr = ObjectAccessor::GetPlayer(*me, InvokerGUID))
						plr->MonsterSay("Your frozen reign will not come to pass!", LANG_UNIVERSAL, 0);
					events.PopEvent();
					break;
				case EVENT_ATTACK:
					events.Reset();
					if (Player* plr = ObjectAccessor::GetPlayer(*me, InvokerGUID))
						AttackStart(plr);
					me->SetInCombatWithZone();
					if (!me->IsInCombat())
					{
						EnterEvadeMode();
						return;
					}
					else
						me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
					break;
				case EVENT_TOTEMS_ATTACK:
					for (uint8 i=0; i<3; ++i)
						if (Creature* bunny = me->FindNearestCreature(NPC_TOTEM_BUNNY_1+i, 150.0f, true))
							bunny->CastSpell(me, SPELL_TOTEM_BEAM, false);
					events.PopEvent();
					events.RescheduleEvent(EVENT_SUBMERGE, 10000);
					break;
				case EVENT_SUBMERGE:
					me->MonsterTextEmote(TEXT_RETREAT, 0, true);
					me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
					me->CastSpell(me, SPELL_SUBMERGE_0, true);
					me->CastSpell(me, SPELL_SELF_STUN, true);
					if (Creature* c = DoSummon(NPC_FROZEN_CORE, *me, 24000, TEMPSUMMON_TIMED_DESPAWN))
					{
						c->SetHealth(me->GetHealth());
					}
					events.Reset();
					events.RescheduleEvent(EVENT_COMBAT_EMERGE, 25000);
					events.RescheduleEvent(EVENT_EMERGE_WARNING, 20000);
					break;
				case EVENT_EMERGE_WARNING:
					me->MonsterTextEmote(TEXT_RESURFACE, 0, true);
					events.PopEvent();
					break;
				case EVENT_COMBAT_EMERGE:
					me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
					me->RemoveAura(SPELL_SELF_STUN);
					me->CastSpell(me, SPELL_EMERGE_0, false);
					// me->CastSpell(me, SPELL_AHUNE_RESURFACES, true); // done in SummonedCreatureDespawn
					me->RemoveAura(SPELL_SUBMERGE_0);
					events.PopEvent();
					StartPhase1();
					break;

				case EVENT_SPELL_COLD_SLAP:
					if (Unit* target = SelectTarget(SELECT_TARGET_NEAREST, 0, 5.0f, true))
						if (target->GetPositionZ() < me->GetPositionZ()+6.0f)
						{
							int32 dmg = urand(5500,6000);
							me->CastCustomSpell(target, SPELL_COLD_SLAP, &dmg, NULL, NULL, false);
							float x, y, z;
							target->GetNearPoint(target, x, y, z, target->GetObjectSize(), 30.0f, target->GetAngle(me->GetPositionX(), me->GetPositionY()) + M_PI);
							target->GetMotionMaster()->MoveJump(x, y, z+20.0f, 10.0f, 20.0f);
						}
					events.RepeatEvent(1500);
					break;
				case EVENT_SPELL_SUMMON_HAILSTONE:
					{
						float dist = (float)urand(3,10);
						float angle = rand_norm()*2*M_PI;
						me->CastSpell(MinionSummonPos.GetPositionX()+cos(angle)*dist, MinionSummonPos.GetPositionY()+sin(angle)*dist, MinionSummonPos.GetPositionZ(), SPELL_SUMMON_HAILSTONE, false);
						events.RepeatEvent(30000);
					}
					break;
				case EVENT_SPELL_SUMMON_COLDWAVE:
					for (uint8 i=0; i<2; ++i)
					{
						float dist = (float)urand(3,10);
						float angle = rand_norm()*2*M_PI;
						me->CastSpell(MinionSummonPos.GetPositionX()+cos(angle)*dist, MinionSummonPos.GetPositionY()+sin(angle)*dist, MinionSummonPos.GetPositionZ(), SPELL_SUMMON_COLDWAVE, false);
					}
					{
						float dist = (float)urand(3,10);
						float angle = rand_norm()*2*M_PI;
						me->CastSpell(MinionSummonPos.GetPositionX()+cos(angle)*dist, MinionSummonPos.GetPositionY()+sin(angle)*dist, MinionSummonPos.GetPositionZ(), SPELL_SUMMON_FROSTWIND, false);
					}
					events.RepeatEvent(6000);
					break;

				default:
					events.PopEvent();
					break;
			}

			DoMeleeAttackIfReady();
		}
Esempio n. 12
0
 void DamageTaken(Unit* /*attacker*/, uint32& damage)
 {
     damage = 0;
     events.RescheduleEvent(EVENT_DUMMY_RESET, 10000);
 }
		void UpdateAI(uint32 diff)
		{
			events.Update(diff);

			if (!UpdateVictim())
			{
				while(uint32 eventId = events.ExecuteEvent())
				{
					switch(eventId)
					{
						if (instance)
						{
							case EVENT_ATTACK_START:
								me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED);
								me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
								me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
								events.ScheduleEvent(EVENT_DISSIPATION, 4*IN_MILLISECONDS);
								me->setActive(true);
								me->setFaction(14);
								me->SetInCombatWithZone();

								events.CancelEvent(EVENT_ATTACK_START);
								break;

							default:
								break;
						}
					}
				}
			}

			if (!me->HasAura(SPELL_INTENSITY) && intensityStacks != 0)
				intensityStacks = 0;

			if (damageDealt >= me->GetMaxHealth() * 0.02f)
			{
				me->RemoveAurasDueToSpell(SPELL_DISSIPATION);
				me->CastSpell(me, SPELL_INTENSITY);
				events.RescheduleEvent(EVENT_DISSIPATION, 4*IN_MILLISECONDS);
				intensityStacks++;
				damageDealt = 0;
			}

			if (intensityStacks == 10)
			{
				me->CastSpell(me, SPELL_ULTIMATE_POWER);
				me->RemoveAurasDueToSpell(SPELL_INTENSITY);
				intensityStacks = 0;
			}

			if (UpdateVictim())
			{
				if (!eventAgony)
				{
					events.ScheduleEvent(EVENT_AGONY, 1*IN_MILLISECONDS);
					eventAgony = true;
				}

				while(uint32 eventId = events.ExecuteEvent())
				{
					switch(eventId)
					{
						if (instance)
						{
							case EVENT_AGONY:
								me->CastSpell(me->getVictim(), SPELL_AGONY);

								events.RescheduleEvent(EVENT_AGONY, 2500);
								break;

							case EVENT_DISSIPATION:
								if (!me->HasAura(SPELL_ULTIMATE_POWER))
									me->CastSpell(me, SPELL_DISSIPATION);

								if (me->HasAura(SPELL_INTENSITY))
									me->RemoveAurasDueToSpell(SPELL_INTENSITY, me->GetGUID());

								intensityStacks = 0;

								events.RescheduleEvent(EVENT_DISSIPATION, 2*IN_MILLISECONDS);
								break;

							default:
								break;
						}
					}
				}
			}

			DoMeleeAttackIfReady();
		}
Esempio n. 14
0
        void UpdateAI(uint32 diff)
        {
            if (!pInstance)
                return;

            events.Update(diff);

            switch(events.GetEvent())
            {
                case 0:
                    break;
                case EVENT_SUMMON_KEEPER_OR_GUARDIAN:
                    bKorG = true;
                    spawned = true;
                    if (Creature *c = DoSummon(RAND(NPC_PORTAL_GUARDIAN, NPC_PORTAL_KEEPER), me, 2.0f, 0, TEMPSUMMON_DEAD_DESPAWN))
                        me->CastSpell(c, SPELL_PORTAL_CHANNEL, false);
                    events.PopEvent();
                    events.RescheduleEvent(EVENT_SUMMON_KEEPER_TRASH, 20000);
                    break;
                case EVENT_SUMMON_KEEPER_TRASH:
                    for (uint8 i=0; i<3+addValue; ++i)
                    {
                        uint32 entry = RAND(NPC_AZURE_INVADER_1, NPC_AZURE_INVADER_2, NPC_AZURE_SPELLBREAKER_1, NPC_AZURE_SPELLBREAKER_2, NPC_AZURE_MAGE_SLAYER_1, NPC_AZURE_MAGE_SLAYER_2, NPC_AZURE_BINDER_1, NPC_AZURE_BINDER_2);
                        DoSummon(entry, me, 2.0f, 20000, TEMPSUMMON_DEAD_DESPAWN);
                    }
                    events.RepeatEvent(20000);
                    break;
                case EVENT_SUMMON_ELITES:
                    spawned = true;
                    for (uint8 i=0; i<2+addValue; ++i)
                    {
                        uint32 entry = RAND(NPC_AZURE_CAPTAIN, NPC_AZURE_RAIDER, NPC_AZURE_STALKER, NPC_AZURE_SORCEROR);
                        DoSummon(entry, me, 2.0f, 20000, TEMPSUMMON_DEAD_DESPAWN);
                    }
                    me->SetVisible(false);
                    events.PopEvent();
                    break;
                case EVENT_SUMMON_SABOTEOUR:
                    DoSummon(NPC_SABOTEOUR, me, 2.0f, 0, TEMPSUMMON_CORPSE_DESPAWN);
                    me->DespawnOrUnsummon(3000);
                    events.PopEvent();
                    break;
            }

            if (!spawned)
                return;

            if (bKorG)
            {
                if (!me->IsNonMeleeSpellCast(false)) // keeper/guardian died => channeled spell interrupted
                {
                    // if keeper/guard lost all victims, in enterevademode linking aura is removed, restore it:
                    if (pInstance)
                        for (SummonList::iterator itr = listOfMobs.begin(); itr != listOfMobs.end(); ++itr)
                            if (Creature* c = pInstance->instance->GetCreature(*itr))
                                if (c->IsAlive() && (c->GetEntry() == NPC_PORTAL_GUARDIAN || c->GetEntry() == NPC_PORTAL_KEEPER))
                                {
                                    me->CastSpell(c, SPELL_PORTAL_CHANNEL, false);
                                    return;
                                }
                    Unit::Kill(me, me, false);
                }
            }
            else
            {
                if (listOfMobs.empty())
                    Unit::Kill(me, me, false);
            }
        }
Esempio n. 15
0
 void EnterEvadeMode() override 
 { 
     StartAttackThyala();
     m_events.RescheduleEvent(EVENT_CHECK_ATTACK, 1000);
 }
Esempio n. 16
0
    void UpdateAI(const uint32 diff)
    {
        if (!UpdateVictim())
            return;

		if(phase == 2 && boss_phase == 1)
		{
			events.RescheduleEvent(EVENT_CHAIN_LIGHTNING, urand(9000,17000));
			events.RescheduleEvent(EVENT_OVERLOAD, urand(60000,125000));
            events.RescheduleEvent(EVENT_LIGHTNING_WHIRL, urand(20000,40000));
			boss_phase++;

		}
		if(phase == 3 && boss_phase == 2)
		{
			events.RescheduleEvent(EVENT_CHAIN_LIGHTNING, urand(9000,17000));
			events.RescheduleEvent(EVENT_OVERLOAD, urand(60000,125000));
            events.RescheduleEvent(EVENT_LIGHTNING_WHIRL, urand(20000,40000));
			DoCast(me, SPELL_STORMSHIELD);
            events.RescheduleEvent(EVENT_LIGHTNING_TENDRILS, urand(40000,80000));
        }

        events.Update(diff);
		if(!me->HasAura(SPELL_OVERLOAD) && overload == true) 
		{
			DoCast(63480);
			overload = false;
		}

        while (uint32 eventId = events.ExecuteEvent())
        {
            switch(eventId)
            {
                case EVENT_ENRAGE:
                    DoScriptText(SAY_BRUNDIR_BERSERK, me);
                    DoCast(SPELL_BERSERK);
                    break;
                case EVENT_CHAIN_LIGHTNING:
                    if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
                        DoCast(pTarget, RAID_MODE(SPELL_CHAIN_LIGHTNING_N , SPELL_CHAIN_LIGHTNING_H));
                    events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, urand(9000,17000));
                    break;
                case EVENT_OVERLOAD:
                    DoCast(SPELL_OVERLOAD);
					overload = true;
					events.ScheduleEvent(EVENT_OVERLOAD, urand(60000,125000));
                    break;
                case EVENT_LIGHTNING_WHIRL:
                    DoCast(RAID_MODE(SPELL_LIGHTNING_WHIRL , SPELL_LIGHTNING_WHIRL_H));
					DoCast(RAID_MODE(61916, 63482));
                    events.ScheduleEvent(EVENT_LIGHTNING_WHIRL, urand(20000,40000));
                    break;
                case EVENT_LIGHTNING_TENDRILS:
                    DoCast(RAID_MODE(SPELL_LIGHTNING_TENDRILS, SPELL_LIGHTNING_TENDRILS_H));
					DoCast(RAID_MODE(61886, 63485));
                    events.DelayEvents(15000, 5000);
                    DoResetThreat();
                    break;
            }
        }

        DoMeleeAttackIfReady();
    }
Esempio n. 17
0
    void UpdateAI(const uint32 diff)
    {
        if (!UpdateVictim())
            return;
		
		if(phase == 2 && boss_phase == 1)
		{
			events.RescheduleEvent(EVENT_SHIELD_OF_RUNES, 27000);
			events.RescheduleEvent(EVENT_RUNE_OF_POWER, 60000);
			events.RescheduleEvent(EVENT_RUNE_OF_DEATH, 30000);
			boss_phase++;

		}
		
		if(phase == 3 && boss_phase == 2)
		{
			
			events.RescheduleEvent(EVENT_SHIELD_OF_RUNES, 27000);
			events.RescheduleEvent(EVENT_RUNE_OF_POWER, 60000);
			events.RescheduleEvent(EVENT_RUNE_OF_DEATH, 30000);
			events.RescheduleEvent(EVENT_RUNE_OF_SUMMONING, urand(20000,30000));
			

		}

        events.Update(diff);


        while (uint32 eventId = events.ExecuteEvent())
        {
            switch(eventId)
            {
                case EVENT_ENRAGE:
                    DoScriptText(SAY_MOLGEIM_BERSERK, me);
                    DoCast(SPELL_BERSERK);
                    break;
                case EVENT_RUNE_OF_POWER: // Improve target selection; random alive friendly
                {
                    Unit *pTarget = DoSelectLowestHpFriendly(60);
                    if (!pTarget || (pTarget && !pTarget->isAlive()))
                        pTarget = me;
					me->SummonCreature(33705, pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ() , 0 , TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60000); // Fais pop la rune
				    events.ScheduleEvent(EVENT_RUNE_OF_POWER, 60000);
                    break;
                }
                case EVENT_SHIELD_OF_RUNES:
                    DoCast(me, RAID_MODE(SPELL_SHIELD_OF_RUNES, SPELL_SHIELD_OF_RUNES_H));
                    events.ScheduleEvent(EVENT_SHIELD_OF_RUNES, urand(27000,34000));
                    break;
                case EVENT_RUNE_OF_DEATH:
                    DoScriptText(SAY_MOLGEIM_RUNE_DEATH, me);
                    if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM))
                        DoCast(pTarget, SPELL_RUNE_OF_DEATH);
                    events.ScheduleEvent(EVENT_RUNE_OF_DEATH, urand(30000,40000));
                    break;
                case EVENT_RUNE_OF_SUMMONING:
                    DoScriptText(SAY_MOLGEIM_SUMMON, me);
                    if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM))
                      //  DoCast(pTarget, SPELL_RUNE_OF_SUMMONING);
                    events.ScheduleEvent(EVENT_RUNE_OF_SUMMONING, urand(20000,30000));
                    break;
            }
        }

        DoMeleeAttackIfReady();
    }
 void ResetTimer(uint32 inc = 0)
 {
     events.RescheduleEvent(EVENT_NEEDLE, 10000 + inc, GCD_CAST);
     events.RescheduleEvent(EVENT_SPINE, 20000 + inc, GCD_CAST);
     events.RescheduleEvent(EVENT_SHIELD, 60000 + inc);
 }
        void UpdateAI(const uint32 diff)
        {
            if (!UpdateVictim())
                return;

            events.Update(diff);

            if (me->HasUnitState(UNIT_STATE_CASTING))
                return;

            if (phase == PHASE_MOVE && !phaseInitiated)
            {
                me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NOT_SELECTABLE);
                me->RemoveAurasDueToSpell(SPELL_ENERGY_SHIELD);
                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, MAX_VISIBILITY_DISTANCE, true))
                    me->GetMotionMaster()->MoveFollow(target, 3, 2);
                gravity = 0;
                summon = 0;
                creature = false;
                events.CancelEvent(EVENT_SEISMIC_SHARD);
                events.CancelEvent(EVENT_ENERGY_SHIELD);
                events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, 1 *IN_MILLISECONDS);
                events.ScheduleEvent(EVENT_GRAVITY_WELL, 2 *IN_MILLISECONDS);
                events.ScheduleEvent(EVENT_PHASE_SHIELD, 35 *IN_MILLISECONDS);
                phaseInitiated = true;
            }

            if (phase == PHASE_SHIELDS && !phaseInitiated)
            {
                me->GetMotionMaster()->MovePoint(1, MeteorPosition[3]);
                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NOT_SELECTABLE);
                DoCast(me, SPELL_ENERGY_SHIELD);
                DoCast(me, SPELL_SEISMIC_SHARD_DUMMY);
                events.CancelEvent(EVENT_CURSE_OF_BLOOD);
                events.CancelEvent(EVENT_GRAVITY_WELL);
                events.ScheduleEvent(EVENT_SUMMON_GUARDS, 1 *IN_MILLISECONDS);
                events.ScheduleEvent(EVENT_SEISMIC_SHARD, 2 *IN_MILLISECONDS);
                events.ScheduleEvent(EVENT_START_METEOR, 12 *IN_MILLISECONDS);
                events.ScheduleEvent(EVENT_PHASE_MOVE, 35 *IN_MILLISECONDS);
                phaseInitiated = true;
                creature = true;
            }

            while (uint32 eventId = events.ExecuteEvent())
            {
                switch (eventId)
                {
                case EVENT_PHASE_SHIELD:
                    phase = PHASE_SHIELDS;
                    phaseInitiated = false;
                    break;
                case EVENT_PHASE_MOVE:
                    phase = PHASE_MOVE;
                    phaseInitiated = false;
                    break;
                case EVENT_CURSE_OF_BLOOD:
                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, MAX_VISIBILITY_DISTANCE, true))
                        DoCast(target, SPELL_CURSE_OF_BLOOD);
                    events.RescheduleEvent(EVENT_CURSE_OF_BLOOD, 15 *IN_MILLISECONDS);
                    break;
                case EVENT_GRAVITY_WELL:
                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, MAX_VISIBILITY_DISTANCE, true))
                        DoCast(target, SPELL_GRAVITY_WELL_SUMMON);
                    
                    if (++gravity <= 6)
                        events.RescheduleEvent(EVENT_GRAVITY_WELL, 5 *IN_MILLISECONDS);
                    break;
                case EVENT_SUMMON_GUARDS:
                    for (uint8 i = 0; i < 10; ++i)                                  //summon 10 Guards
                        me->SummonCreature(NPC_DEVOUT_FOLLOWER, MeteorPosition[4], TEMPSUMMON_CORPSE_DESPAWN);
                    for (uint8 i = 0; i < 10; ++i)                                  //summon 10 Guards
                        me->SummonCreature(NPC_DEVOUT_FOLLOWER, MeteorPosition[5], TEMPSUMMON_CORPSE_DESPAWN);
                    break;
                case EVENT_SEISMIC_SHARD:
                    meteors.push_back(me->SummonCreature(NPC_SEISMIC_SHARD, MeteorPosition[0], TEMPSUMMON_CORPSE_DESPAWN));
                    meteors.push_back(me->SummonCreature(NPC_SEISMIC_SHARD, MeteorPosition[1], TEMPSUMMON_CORPSE_DESPAWN));
                    meteors.push_back(me->SummonCreature(NPC_SEISMIC_SHARD, MeteorPosition[2], TEMPSUMMON_CORPSE_DESPAWN));
                    break;
                case EVENT_START_METEOR:
                    if (meteors.size())
                    {
                        if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, MAX_VISIBILITY_DISTANCE, true))
                        {
                            uint8 i = urand(0, meteors.size()-1);
                            if (Unit* trigger = me->SummonCreature(NPC_SEISMIC_SHARD_TRIGGER, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_DESPAWN))
                            {
                                meteors[i]->SetSpeed(MOVE_RUN, speed*3.0f, true);
                                meteors[i]->SetSpeed(MOVE_WALK, speed*3.0f, true);
                                meteors[i]->SetSpeed(MOVE_FLIGHT, speed*3.0f, true);
                                meteors[i]->GetMotionMaster()->MovePoint(1, trigger->GetPositionX(), trigger->GetPositionY(), trigger->GetPositionZ());
                                trigger->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NOT_SELECTABLE);
                                triggerGUID = trigger->GetGUID();
                                meteorGUID = meteors[i]->GetGUID();
                            }
                            meteors.erase(meteors.begin() + i);

                            if (++summon <= 3)
                                events.ScheduleEvent(EVENT_SEND_NEXT_METEOR, 1 *IN_MILLISECONDS);

                            if (meteors.size())
                                events.RescheduleEvent(EVENT_START_METEOR, 10 *IN_MILLISECONDS);
                        }
                    }
                    break;
                case EVENT_SEND_NEXT_METEOR:
                    if (Unit * cast = Unit::GetCreature(*me, triggerGUID))
                    {
                        cast->setFaction(16);
                        cast->CastSpell(me, SPELL_SEISMIC_SHARD_DAMAGE, true);
                    }
                    if (Unit * despawn = Unit::GetCreature(*me, meteorGUID))
                        despawn->SetVisible(false);
                    break;
                case EVENT_BERSERK:
                    DoCast(me, SPELL_BERSERK);
                    break;
                }
            }

            DoMeleeAttackIfReady();
        }
        void UpdateAI(const uint32 diff)
        {
            if (!UpdateVictim())
                return;
            
            events.Update(diff);
        
            if (me->HasUnitState(UNIT_STAT_CASTING))
                return;

            while (uint32 eventId = events.ExecuteEvent())
            {
                switch(eventId)
                {
                    case EVENT_MOVE_POS:
                        MovePos();
                        events.RescheduleEvent(EVENT_MOVE_POS, 10000);
                        break;            
                    case EVENT_ENRAGE:
                        DoScriptText(SAY_BRUNDIR_BERSERK, me);
                        DoCast(SPELL_BERSERK);
                        break;
                    case EVENT_CHAIN_LIGHTNING:
                        if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0))
                            DoCast(pTarget, SPELL_CHAIN_LIGHTNING);
                        events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, urand(4000, 6000));
                        break;
                    case EVENT_OVERLOAD:
                        me->MonsterTextEmote(EMOTE_OVERLOAD, 0, true);
                        DoScriptText(SAY_BRUNDIR_SPECIAL, me);
                        me->GetMotionMaster()->Initialize();
                        DoCast(SPELL_OVERLOAD);
                        events.ScheduleEvent(EVENT_OVERLOAD, urand(60000, 120000));
                        break;
                    case EVENT_LIGHTNING_WHIRL:
                        me->GetMotionMaster()->Initialize();
                        DoCast(SPELL_LIGHTNING_WHIRL);
                        events.ScheduleEvent(EVENT_LIGHTNING_WHIRL, urand(15000, 20000));
                        break;
                    case EVENT_LIGHTNING_TENDRILS:
                        DoScriptText(SAY_BRUNDIR_FLIGHT, me);
                        DoCast(SPELL_LIGHTNING_TENDRILS);
                        DoCast(SPELL_LIGHTNING_TENDRILS_SELF_VISUAL);
                        me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
                        me->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), 435);
                        events.DelayEvents(34000);
                        events.ScheduleEvent(EVENT_FLIGHT, 2500);
                        events.ScheduleEvent(EVENT_ENDFLIGHT, 28000);
                        events.ScheduleEvent(EVENT_LIGHTNING_TENDRILS, 90000);
                        break;
                    case EVENT_FLIGHT:
                        if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0))
                            me->GetMotionMaster()->MovePoint(0, pTarget->GetPositionX(), pTarget->GetPositionY(), 435);
                        events.ScheduleEvent(EVENT_FLIGHT, 6000);
                        break;
                    case EVENT_ENDFLIGHT:
                        me->GetMotionMaster()->MovePoint(0, 1586.920f, 119.849f, 435);
                        events.CancelEvent(EVENT_FLIGHT);
                        events.ScheduleEvent(EVENT_LAND, 4000);
                        break;
                    case EVENT_LAND:
                        me->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), 427.28f);
                        events.ScheduleEvent(EVENT_GROUND, 1500);
                        break;
                    case EVENT_GROUND:
                        me->RemoveAurasDueToSpell(SPELL_LIGHTNING_TENDRILS);
                        me->RemoveAurasDueToSpell(SPELL_LIGHTNING_TENDRILS_SELF_VISUAL);
                        me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
                        me->SendMovementFlagUpdate();
                        break;
                }
            }
        }
        void UpdateAI(uint32 diff)
        {
            if (!UpdateVictim())
                return;

            if (me->GetVictim())
            {
                float x,y,z;
                me->GetVictim()->GetPosition(x, y, z);
                if (TSDistCheckPos.GetExactDist(x,y,z) > 100.0f || z > TSDistCheckPos.GetPositionZ()+20.0f || z < TSDistCheckPos.GetPositionZ()-20.0f)
                {
                    me->SetHealth(me->GetMaxHealth());
                    EnterEvadeMode();
                    return;
                }
            }

            events.Update(diff);

            if (me->HasUnitState(UNIT_STATE_CASTING))
                return;

            switch(events.GetEvent())
            {
                case 0:
                    break;
                case EVENT_SPELL_FORCEFUL_SMASH:
                    if (me->IsWithinMeleeRange(me->GetVictim()))
                    {
                        me->CastSpell(me->GetVictim(), SPELL_FORCEFUL_SMASH, false);
                        events.PopEvent();
                        events.RescheduleEvent(EVENT_SPELL_UNHOLY_POWER, 1000);
                        break;
                    }
                    events.RepeatEvent(3000);
                    break;
                case EVENT_SPELL_UNHOLY_POWER:
                    Talk(SAY_SMASH);
                    Talk(EMOTE_SMASH);
                    me->CastSpell(me, SPELL_UNHOLY_POWER, false);
                    events.PopEvent();
                    events.ScheduleEvent(EVENT_SPELL_FORCEFUL_SMASH, urand(40000, 48000));
                    break;
                case EVENT_SPELL_OVERLORDS_BRAND:
                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 95.0f, true))
                        me->CastSpell(target, SPELL_OVERLORDS_BRAND, false);
                    events.RepeatEvent(urand(11000,12000));
                    break;
                case EVENT_RIMEFANG_SPELL_ICY_BLAST:
                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 190.0f, true))
                        if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_RIMEFANG_GUID)))
                            c->CastSpell(target, RIMEFANG_SPELL_ICY_BLAST, false);
                    events.RepeatEvent(5000);
                    break;
                case EVENT_SPELL_MARK_OF_RIMEFANG:
                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 190.0f, true))
                        if (Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_RIMEFANG_GUID)))
                        {
                            Talk(SAY_MARK);
                            c->AI()->Talk(EMOTE_RIMEFANG_ICEBOLT, target);
                            c->CastSpell(target, RIMEFANG_SPELL_HOARFROST, false);
                        }
                    events.RepeatEvent(25000);
                    events.RescheduleEvent(EVENT_RIMEFANG_SPELL_ICY_BLAST, 10000);
                    break;
            }

            DoMeleeAttackIfReady();
        }