示例#1
0
        void UpdateAI(uint32 diff)
        {
            if (!(UpdateVictim() && isInManglePhase) || me->HasUnitState(UNIT_STATE_CASTING))
                return; 

            if(me->GetMap()->IsHeroic())
            {
                if (Creature* nefarian = me->FindNearestCreature(NPC_NEFARIAN_HELPER_HEROIC, 150.0f, true))
                {
                    if(me->GetHealthPct() < 95 && say1 == false)
                    {
                        nefarian->AI()->Talk(NEF_H_STARTED_C);
                        say1 = true;
                    }

                    if(me->GetHealthPct() < 31 && say2 == false)
                    {
                        nefarian->AI()->Talk(NEF_H_LOW_HP);
                        say2 = true;
                        events.CancelEvent(EVENT_BLAZING_INFERNO);
                        events.ScheduleEvent(EVENT_SHADOW_BREATH, urand(6000, 9000));
                    }
                }
            }

            events.Update(diff);

            while (uint32 eventId = events.ExecuteEvent())
            {
                switch(eventId)
                {
                    case EVENT_IGNITION:
                        CastIgnition();
                        break;

                    case EVENT_SHADOW_BREATH:
                        if (Creature* nefarian = me->FindNearestCreature(NPC_NEFARIAN_HELPER_HEROIC, 150.0f, true))
                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
                                nefarian->CastSpell(target, SPELL_SHADOW_BREATH, false);
                        events.ScheduleEvent(EVENT_SHADOW_BREATH, urand(9000, 13000));
                        break;

                    case EVENT_BLAZING_INFERNO:
                        if (Creature* nefarian = me->FindNearestCreature(NPC_NEFARIAN_HELPER_HEROIC, 150.0f, true))
                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
                                nefarian->CastSpell(target, SPELL_BLAZING_INFERNO, false);
                        events.ScheduleEvent(EVENT_BLAZING_INFERNO, urand(30000, 35000));
                        break;

                    case EVENT_MAGMA_SPIT:
                        me->AttackStop();
                        CastMagmaSpit();
                        me->Attack(me->GetVictim(), true);
                        events.ScheduleEvent(EVENT_MAGMA_SPIT, urand(8000, 11000));
                        break;

                    case EVENT_LAVA_SPEW:
                        DoCastAOE(SPELL_LAVA_SPEW);
                        events.ScheduleEvent(EVENT_LAVA_SPEW, urand(17000,20000));
                        break;

                    case EVENT_BREAK_FREE:
                        if (me->HasAura(SPELL_CUSTOM_STATE_05)) // Check if the second chain hit or not.
                        {
                            Talk(ANN_BREAK_FREE);
                            me->RemoveAura(SPELL_CUSTOM_STATE_05);
                            if (Creature* spikeStalker = me->FindNearestCreature(41767, 50.0f, true))
                                spikeStalker->AI()->DoAction(ACTION_SPIKE_RESET);
                        }
                        break;

                    case EVENT_PILLAR_OF_FLAME:
                        if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0, 80.0f, true)) // Try to select farthest target.
                        {
                            if (me->GetDistance2d(target) >= 15.0f) // If target is over 15y away, it's ok.
                                DoCast(target, SPELL_PILLAR_OF_FLAME);
                            else
                                if (me->GetDistance2d(target) < 15.0f) // If target is less then 15y away, cast on nearest, as they are hacking the encounter by standing all melee.
                                    if (Unit* target2 = SelectTarget(SELECT_TARGET_NEAREST, 0, 80.0f, true))
                                        DoCast(target2, SPELL_PILLAR_OF_FLAME);
                        }
                        events.ScheduleEvent(EVENT_PILLAR_OF_FLAME, urand(20000, 25000));
                        break;

                    case EVENT_BERSERK:
                        DoCast(me, SPELL_BERSERK);
                        break;

                    case EVENT_MANGLE:
                        if (Unit* victim = me->GetVictim())
                        {
                            if (victim->GetTypeId() == TYPEID_PLAYER)
                            {
                                sTarget = victim;
                                sTar = true;
                                isInManglePhase = true;
                                Talk(ANN_CLOSE_HEAD);
                                me->AddAura(SPELL_MANGLE, victim);
                                DoCast(me, SPELL_CUSTOM_IMPACT_06);
                                if (Unit* magmawHead = vehicle->GetPassenger(0))
                                    victim->CastSpell(magmawHead, SPELL_ENTER_MOUTH, true);
                                //sTarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); 
                            }
                        }
                        events.ScheduleEvent(EVENT_MANGLE, 90000);
                        events.ScheduleEvent(EVENT_IGNITION, 5000);
                        events.ScheduleEvent(EVENT_MASSIVE_CRASH, 10000);
                        events.ScheduleEvent(EVENT_KILL_TANK, 30000);
                        break;

                    case EVENT_MASSIVE_CRASH:
                        events.CancelEvent(EVENT_LAVA_SPEW);
                        events.CancelEvent(EVENT_PILLAR_OF_FLAME);
                        events.CancelEvent(EVENT_MAGMA_SPIT);

                        DoCast(me, SPELL_MASSIVE_CRASH);
                        Talk(ANN_EXPOSE_PINCERS);

                        me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);

                        // Enter Head Phase
                        if (Unit* head = vehicle->GetPassenger(0)) 
                        {
                            Unit* pincer1 = head->GetVehicleKit()->GetPassenger(0);
                            Unit* pincer2 = head->GetVehicleKit()->GetPassenger(1);

                            // Make pincers visible and right faction.
                            if (pincer1 && pincer2)
                            {
                                pincer1->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
                                pincer2->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
                                pincer1->setFaction(35);
                                pincer2->setFaction(35);
                            }
                        }
                        break;

                    case EVENT_EJECT_PINCERS:
                        if (Unit* head = vehicle->GetPassenger(0)) 
                        {
                            Unit* pincer1 = head->GetVehicleKit()->GetPassenger(0);
                            Unit* pincer2 = head->GetVehicleKit()->GetPassenger(1);

                            // Eject pincer passengers and set right faction.
                            if (pincer1 && pincer2)
                            {
                                pincer1->GetVehicleKit()->RemoveAllPassengers();
                                pincer2->GetVehicleKit()->RemoveAllPassengers();
                                pincer1->setFaction(14);
                                pincer2->setFaction(14);
                                pincer1->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                                pincer2->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                            }

                            if (sTar)
                            {
                                head->RemoveAura(SPELL_ENTER_MOUTH); // Remove from mouth seat.
                                sTarget->CastSpell(sTarget, SPELL_SWELTERING_ARMOR, true);
                                if (Unit* hTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
                                    sTarget->JumpTo(hTarget, 10.0f);
                                isInManglePhase = false;
                                sTar = false;
                            }
                        }
                        break;

                    case EVENT_KILL_TANK:
                        if (Unit* head = vehicle->GetPassenger(0)) 
                        if (sTar)
                        {
                            head->RemoveAura(SPELL_ENTER_MOUTH); // Remove from mouth seat.
                            sTarget->CastSpell(sTarget, SPELL_MANGLED_LIFELESS, true);
                            me->Kill(sTarget);
                            isInManglePhase = false;
                            sTar = false;
                            me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                        }
                        break;

                    case EVENT_LEAVE_GROUND_PHASE:
                        // Leave Head Phase
                        if (Unit* head = vehicle->GetPassenger(0)) 
                        {
                            head->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                            head->RemoveAllAuras();
                            me->RemoveAura(SPELL_POINT_OF_VULNERABILITY2);
                            head->RemoveAura(SPELL_POINT_OF_VULNERABILITY);
                            head->RemoveAura(SPELL_POINT_OF_VULNERABILITY2);
                        }

                        me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                        me->RemoveAura(SPELL_CUSTOM_STATE_04);
                    
                        events.ScheduleEvent(EVENT_LAVA_SPEW, urand(17000,20000));
                        events.ScheduleEvent(EVENT_MAGMA_SPIT, urand(8000, 11000));
                        events.ScheduleEvent(EVENT_PILLAR_OF_FLAME, 25000);
                        break;
                }
            }

            if(!me->HasAura(SPELL_CUSTOM_STATE_04) && !me->HasAura(SPELL_CUSTOM_STATE_05) && !isInManglePhase)
                DoMeleeAttackIfReady();
        }
示例#2
0
		void UpdateAI(const uint32 diff)
		{
			if(head != NULL && !IsInHeadPhase)
			{
				head->SetReactState(REACT_PASSIVE);
				head->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NOT_SELECTABLE);
			}else if(head == NULL)
			{
				head =  me->FindNearestCreature(NPC_MAGMAWS_HEAD,1000.0f, true);
			}

			if (!UpdateVictim())
				return;

			events.Update(diff);

			while (uint32 eventId = events.ExecuteEvent())
			{
				switch(eventId)
				{
					if(!IsInHeadPhase)
					{
				case EVENT_MAGMA_SPIT:
					// Maybe we have to cast the spell on all Players
					if(Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 200, true))
						DoCast(pTarget,SPELL_MAGMA_SPIT);
					
					events.ScheduleEvent(EVENT_MAGMA_SPIT, urand(15000,17000));
					break;

				case EVENT_LAVA_SPEW: 
					DoCastAOE(SPELL_LAVA_SPEW);

					events.ScheduleEvent(EVENT_LAVA_SPEW, urand(7000,9000));
					break;

				case EVENT_IN_RANGE_CHECK:
					DoCast(me, SPELL_MOLTEN_TANTRUM);

					events.ScheduleEvent(EVENT_IN_RANGE_CHECK, 5000);
					break;

				case EVENT_MANGLE:
					DoCastVictim(SPELL_MANGLE);

					if(head != NULL)
					{
						//me->getVictim()->EnterVehicle(head);
						head->CastSpell(head,SPELL_POINT_OF_VULNERABILITY, true);
						head->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
					}
					
					IsInHeadPhase = true;

					events.ScheduleEvent(EVENT_LEAVE_HEAD_PHASE, 10000);
					events.ScheduleEvent(EVENT_LAVA_SPEW, urand(95000,115000));
					DoCastVictim(SPELL_RIDE_VEHICLE, true);
					DoCastVictim(88287);
					break;

				case EVENT_PILLAR_OF_FLAME:
					if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 500, true))
						me->SummonCreature(NPC_PILLAR_OF_FLAME_TRIGGER,target->GetPositionX(),target->GetPositionY(),target->GetPositionZ(), 0,TEMPSUMMON_CORPSE_DESPAWN);		

					events.ScheduleEvent(EVENT_PILLAR_OF_FLAME, urand(20000,25000));
					break;

				case EVENT_BERSERK:
					DoCast(me, SPELL_BERSERK);
					break;

					}else
					{
				case EVENT_LEAVE_HEAD_PHASE:


					
					DoCastAOE(SPELL_MASSIVE_CRASH);
					CastIgnition();
					IsInHeadPhase = false;
					break;
					}
				}
			}

			DoMeleeAttackIfReady();
		}