Esempio n. 1
0
            void MySelectNextTarget()
            {
                if (_ebonGargoyleGUID)
                {
                    Unit* gargoyle = ObjectAccessor::GetUnit(*me, _ebonGargoyleGUID);
                    if (gargoyle && gargoyle->GetAI())
                        gargoyle->GetAI()->AttackStart(me);
                    _ebonGargoyleGUID = 0;
                }
                Unit* owner = me->GetOwner();
                if (owner && owner->GetTypeId() == TYPEID_PLAYER)
                {
                    Unit* selection = owner->ToPlayer()->GetSelectedUnit();

                    if (selection)
                    {
                        me->getThreatManager().resetAllAggro();
                        me->AddThreat(selection, 1000000.0f);

                        if (owner->IsInCombat())
                            AttackStart(selection);
                    }

                    if (!owner->IsInCombat() && !me->GetVictim())
                        EnterEvadeMode();
                }
            }
Esempio n. 2
0
            void HandleScript(SpellEffIndex /*eff*/)
            {
                Unit* caster = GetCaster();
                if (!caster)
                    return;

                if (GetHitDamage() >= int32(GetHitUnit()->GetHealth()))
                    if (caster->GetAI())
                        caster->GetAI()->SetData(DATA_GRAVITY_BOMB_CASUALTY, 1);
            }
Esempio n. 3
0
 void HandlePeriodicTick(AuraEffect const* aurEff)
 {
     if (aurEff->GetBase()->GetStackAmount() < 2)
         return;
     Unit* caster = GetCaster();
     //TODO: the caster should be boss but not the player
     if (!caster || !caster->GetAI())
         return;
     caster->GetAI()->SetGUID(GetTarget()->GetGUID(), DATA_INTENSE_COLD);
 }
Esempio n. 4
0
            void HandlePeriodicTick(AuraEffect const* aurEff)
            {
                Unit* caster = GetCaster();
                if (!caster)
                    return;

                if (aurEff->GetBase()->GetStackAmount() >= 2)
                    caster->GetAI()->SetGUID(GetTarget()->GetGUID(), DATA_INTENSE_COLD);
            }
        void UpdateAI(uint32 diff)
        {
            if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_CASTING))
                return;

            if(me->GetPositionX() == position[5].GetPositionX() && me->GetPositionY() == position[5].GetPositionY() &&  me->GetPositionZ() == position[5].GetPositionZ() && !HomePosition)
            {
                pDragah->GetAI()->DoAction(ACTION_DRAGAH_IS_ON_THE_GROUND);

                me->SetSpeed(MOVE_WALK, 1.0f);
                me->SetCanFly(false);
                me->SetReactState(REACT_AGGRESSIVE);
                me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);

                events.ScheduleEvent(EVENT_VALIONAS_FLAME, urand(4000,7000));
                events.ScheduleEvent(EVENT_SHREDDING_SWIPE, urand(10000,13000));

                if(me->GetMap()->IsHeroic())
                   events.ScheduleEvent(EVENT_DEVOURING_FLAMES, urand(15000,17000));

                HomePosition = true;
            }

            events.Update(diff);

            while (uint32 eventId = events.GetEvent())
            {
                switch (eventId)
                {
                    case EVENT_VALIONAS_FLAME:
                        if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0))
                            DoCast(pTarget, SPELL_VALIONAS_FLAME);
                        events.RepeatEvent(urand(15000,25000));
                        break;
                    case EVENT_SHREDDING_SWIPE:
                        if(me->getVictim())
                            me->CastSpell(me->getVictim(), SPELL_SHREDDING_SWIPE, true);
                        events.RepeatEvent(urand(21000,30000));
                        break;
                    case EVENT_DEVOURING_FLAMES:
                        DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0), SPELL_DEVOURING_FLAMES_H);
                        events.RepeatEvent(urand(30000,35000));
                        break;
                    default:
                        events.PopEvent();
                        break;
                }
            }

            DoMeleeAttackIfReady();
        }
    void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
    {
        Unit* caster = GetCaster();
        if (!caster || caster->GetEntry() != NPC_SNOBOLD_VASSAL)
            return;

        if (Creature* gormok = GetTarget()->ToCreature())
            if (Unit* target = gormok->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0, SnobolledTargetSelector()))
            {
                gormok->AI()->Talk(EMOTE_SNOBOLLED);
                caster->GetAI()->DoAction(ACTION_ACTIVE_SNOBOLD);
                caster->CastSpell(target, SPELL_RIDE_PLAYER, true);
            }
    }
Esempio n. 7
0
        void MovementInform(uint32 type, uint32 id)
        {
            if (type != POINT_MOTION_TYPE)
                return;

            switch (id)
            {
            case POINT_VALIONA_FLY_IN_THE_AIR:
                currentWaypoint++;

                if(currentWaypoint < 3) // You can extend the Waypoints by yourself if you want
                {
                    me->GetMotionMaster()->MovePoint(POINT_VALIONA_FLY_IN_THE_AIR, position[currentWaypoint]);
                }else
                    me->GetMotionMaster()->MovePoint(POINT_VALIONA_LAND, position[3]);

                break;

            case POINT_VALIONA_LAND:
                pDragah->GetAI()->DoAction(ACTION_DRAGAH_IS_ON_THE_GROUND);

                me->SetSpeed(MOVE_WALK, 1.0f);

                me->SetFlying(false);
                me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
                me->SetReactState(REACT_AGGRESSIVE);

                me->GetMotionMaster()->Clear();
                me->GetMotionMaster()->MoveChase(me->getVictim());

                events.ScheduleEvent(EVENT_VALIONAS_FLAME, urand(4000,7000));
                events.ScheduleEvent(EVENT_SHREDDING_SWIPE, urand(10000,13000));

                if(/*me->GetMap()->IsHeroic()*/ true) // To test it on non heroic difficulty
                    events.ScheduleEvent(EVENT_DEVOURING_FLAMES, urand(15000,17000));
                break;

            case POINT_VALIONA_FLY_AWAY:
                DespawnCreatures(NPC_SEEPING_TWILIGHT_TRIGGER,500.0f);
                me->GetMotionMaster()->MovePoint(POINT_VALIONA_IS_AWAY, position[4]);
                break;

            case POINT_VALIONA_IS_AWAY:
                me->DespawnOrUnsummon();
                break;

            default:
                break;
            }
        }
Esempio n. 8
0
            void HandleEffectPeriodic(AuraEffect const* /*aurEff*/)
            {
                Unit* target = GetTarget();
                Unit* owner = target->GetOwner();

                if (!owner)
                    return;

                if (owner->IsMounted() && !target->IsMounted())
                {
                    if (VolunteerAI* volunteerAI = CAST_AI(VolunteerAI, target->GetAI()))
                        target->Mount(volunteerAI->GetMountId());
                }
                else if (!owner->IsMounted() && target->IsMounted())
                    target->Dismount();

                target->SetSpeed(MOVE_RUN, owner->GetSpeedRate(MOVE_RUN));
                target->SetSpeed(MOVE_WALK, owner->GetSpeedRate(MOVE_WALK));
            }
    void FilterTargets(std::list<WorldObject*>& targets)
    {
        Unit* caster = GetCaster();

        targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_HAS_DARK_BREWMAIDENS_BREW));

        if (targets.size() > 1)
            targets.remove_if([caster](WorldObject* obj)
        {
            if (obj->GetGUID() == caster->GetAI()->GetGUID(DATA_TARGET_GUID))
                return true;
            return false;
        });

        if (targets.empty())
            return;

        WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets);
        targets.clear();
        targets.push_back(target);
    }
		void MovementInform(uint32 uiType, uint32 /*uiId*/) override
		{
			if (uiType != POINT_MOTION_TYPE)
				return;

			if (me->IsSummon())
			{
				Unit* summoner = me->ToTempSummon()->GetSummoner();
				if (summoner && summoner->GetTypeId() == TYPEID_UNIT && summoner->IsAIEnabled)
				{
					npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI* ai =
						CAST_AI(npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI, summoner->GetAI());
					if (ai)
					{
						ai->uiTimer = 2000;
						ai->uiPhase = 5;
					}
					//me->ChangeOrient(0.0f, summoner);
				}
			}
		}
Esempio n. 11
0
		void UpdateAI(const uint32 diff)
		{
			if (!UpdateVictim() || me->HasUnitState(UNIT_STAT_CASTING))
				return;

			if(ShouldSummonAdds)
			{
				// Despawns the Stalker
				DespawnCreatures(NPC_SHADOW_GALE_STALKER);
				RemoveShadowGaleDebuffFromPlayers();

				me->SetReactState(REACT_AGGRESSIVE);
				me->GetMotionMaster()->Clear();
				me->GetMotionMaster()->MoveChase(me->getVictim());

				if ((rand()%2))
					me->MonsterYell(SAY_SUMMON, LANG_UNIVERSAL, NULL);

				//Adds a visual portal effect to the Stalker
                            if (FacelessPortalStalker)
				FacelessPortalStalker->GetAI()->DoCast(FacelessPortalStalker,SPELL_TWILIGHT_PORTAL_VISUAL,true);
				events.ScheduleEvent(EVENT_REMOVE_TWILIGHT_PORTAL, 7000);

				//Summons Faceless over the Spell
                            if (FacelessPortalStalker)
				FacelessPortalStalker->GetAI()->DoCast(FacelessPortalStalker,SPELL_SPAWN_FACELESS,true);

				ShouldSummonAdds = false;

				// DBM says that the Spell has 40s CD
				events.ScheduleEvent(EVENT_SHADOW_GALE, urand(40000,44000));
			}

			events.Update(diff);

			while (uint32 eventId = events.ExecuteEvent())
			{
				switch (eventId)
				{

				case EVENT_ENFEEBLING_BLOW:
					DoCastVictim(SPELL_ENFEEBLING_BLOW);
					events.ScheduleEvent(EVENT_ENFEEBLING_BLOW, urand(19000,24000));
					break;

				case EVENT_SHADOW_GALE:
                                   if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0, true, 0))
                                   {
                                       ShadowGaleTrigger = me->SummonCreature(NPC_SHADOW_GALE_STALKER, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), target->GetOrientation(), TEMPSUMMON_CORPSE_DESPAWN);
                                       me->SetReactState(REACT_PASSIVE);
                                       me->GetMotionMaster()->MovePoint(POINT_ERUDAX_IS_AT_STALKER, -739.665f, -827.024f, 232.412f);
                                       me->MonsterYell(SAY_GALE, LANG_UNIVERSAL, NULL);
                                   }
					break;

				case EVENT_REMOVE_TWILIGHT_PORTAL:
					//Removes Portal effect from Stalker
					FacelessPortalStalker->RemoveAllAuras();
					break;

				case EVENT_BINDING_SHADOWS:

					if (Unit* tempTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 500.0f, true))
						DoCast(tempTarget,SPELL_BINDING_SHADOWS);
					events.ScheduleEvent(EVENT_BINDING_SHADOWS, urand(12000,17000));
					break;

				default:
					break;
				}
			}

			DoMeleeAttackIfReady();
		}
Esempio n. 12
0
 void HandleDummy(SpellEffIndex /*effIndex*/)
 {
     Unit* caster = GetCaster();
     caster->GetAI()->SetGUID(GetHitUnit()->GetGUID(), DATA_TARGET_GUID);
     caster->CastSpell(GetHitUnit(), SPELL_SEND_FIRST_MUG, true);
 }