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(); }
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(); }