void UpdateAI(uint32 const Diff)
            {
                if (!UpdateVictim())
                    return;

                events.Update(Diff);

                if (HealthBelowPct(50) && !PermaGround)
                    EnterPermaGround();

                if (EnrageTimer <= Diff && !Enraged)
                {
                    DoCast(me, SPELL_BERSERK);
                    Enraged = true;
                }
                else
                    EnrageTimer -= Diff;

                if (HarpoonCounter == RAID_MODE(2, 4))
                {
                    HarpoonCounter = 0;
                    me->GetMotionMaster()->MovePoint(1, RazorGround);
                }

                if (phase == PHASE_GROUND)
                {
                    while (uint32 eventId = events.ExecuteEvent())
                    {
                        switch (eventId)
                        {
                            case EVENT_FLIGHT:
                                phase = PHASE_FLIGHT;
                                events.SetPhase(PHASE_FLIGHT);
                                me->SetFlying(true);
                                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                                me->SetReactState(REACT_PASSIVE);
                                me->AttackStop();
                                me->GetMotionMaster()->MovePoint(0, RazorFlight);
                                events.ScheduleEvent(EVENT_FIREBALL, 7000, 0, PHASE_FLIGHT);
                                events.ScheduleEvent(EVENT_DEVOURING, 10000, 0, PHASE_FLIGHT);
                                events.ScheduleEvent(EVENT_SUMMON, 5000, 0, PHASE_FLIGHT);
                                ++FlyCount;
                                return;
                            case EVENT_LAND:
                                me->SetFlying(false);
                                me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED | UNIT_FLAG_PACIFIED);
                                if (Creature* commander = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(DATA_EXP_COMMANDER) : 0))
                                    commander->AI()->DoAction(ACTION_GROUND_PHASE);
                                events.ScheduleEvent(EVENT_BREATH, 30000, 0, PHASE_GROUND);
                                events.ScheduleEvent(EVENT_BUFFET, 33000, 0, PHASE_GROUND);
                                events.ScheduleEvent(EVENT_FLIGHT, 35000, 0, PHASE_GROUND);
                                return;
                            case EVENT_BREATH:
                                me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED | UNIT_FLAG_PACIFIED);
                                me->RemoveAllAuras();
                                me->SetReactState(REACT_AGGRESSIVE);
                                DoScriptText(EMOTE_BREATH, me, 0);
                                DoCastAOE(SPELL_FLAMEBREATH);
                                events.CancelEvent(EVENT_BREATH);
                                return;
                            case EVENT_BUFFET:
                                DoCastAOE(SPELL_WINGBUFFET);
                                if (Creature* controller = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(DATA_RAZORSCALE_CONTROL) : 0))
                                    controller->CastSpell(controller, SPELL_FLAMED, true);
                                events.CancelEvent(EVENT_BUFFET);
                                return;
                        }
                    }
                }
                if (phase == PHASE_PERMAGROUND)
                {
                    while (uint32 eventId = events.ExecuteEvent())
                    {
                        switch (eventId)
                        {
                            case EVENT_FLAME:
                                DoCastAOE(SPELL_FLAMEBUFFET);
                                events.ScheduleEvent(EVENT_FLAME, 10000, 0, PHASE_PERMAGROUND);
                                return;
                            case EVENT_BREATH:
                                me->MonsterTextEmote(EMOTE_BREATH, 0, true);
                                DoCastVictim(SPELL_FLAMEBREATH);
                                events.ScheduleEvent(EVENT_BREATH, 20000, 0, PHASE_PERMAGROUND);
                                return;
                            case EVENT_FIREBALL:
                                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 200.0f, true))
                                    DoCast(target, SPELL_FIREBALL);
                                events.ScheduleEvent(EVENT_FIREBALL, 3000, 0, PHASE_PERMAGROUND);
                                return;
                            case EVENT_DEVOURING:
                                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 200.0f, true))
                                    DoCast(target, SPELL_DEVOURING_FLAME);
                                events.ScheduleEvent(EVENT_DEVOURING, 10000, 0, PHASE_PERMAGROUND);
                                return;
                            case EVENT_BUFFET:
                                DoCastAOE(SPELL_WINGBUFFET);
                                events.CancelEvent(EVENT_BUFFET);
                                return;
                            case EVENT_FUSE:
                                DoCast(me->getVictim(), SPELL_FUSEARMOR);
                                events.ScheduleEvent(EVENT_FUSE, 10000, 0, PHASE_PERMAGROUND);
                                return;
                        }
                    }

                    DoMeleeAttackIfReady();
                }
                else
                {
                    if (uint32 eventId = events.ExecuteEvent())
                    {
                        switch (eventId)
                        {
                            case EVENT_FIREBALL:
                                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 200.0f, true))
                                    DoCast(target, SPELL_FIREBALL);
                                events.ScheduleEvent(EVENT_FIREBALL, 3000, 0, PHASE_FLIGHT);
                                return;
                            case EVENT_DEVOURING:
                                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 200.0f, true))
                                    me->CastSpell(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), SPELL_DEVOURING_FLAME, true);
                                events.ScheduleEvent(EVENT_DEVOURING, 10000, 0, PHASE_FLIGHT);
                                return;
                            case EVENT_SUMMON:
                                SummonMoleMachines();
                                events.ScheduleEvent(EVENT_SUMMON, 45000, 0, PHASE_FLIGHT);
                                return;
                        }
                    }
                }
            }
		void UpdateAI(const uint32 diff) {
			if (!UpdateVictim())
				return;

			if (me->getVictim()
					&& !me->getVictim()->GetCharmerOrOwnerPlayerOrPlayerItself())
				me->Kill(me->getVictim());

			events.Update(diff);

			if (HealthBelowPct(50) && !PermaGround)
				EnterPermaGround();

			if (EnrageTimer <= diff && !Enraged) {
				DoCast(me, SPELL_BERSERK);
				Enraged = true;
			} else
				EnrageTimer -= diff;

			if (phase == PHASE_GROUND) {
				while (uint32 eventId = events.ExecuteEvent()) {
					switch (eventId) {
					case EVENT_FLIGHT:
						phase = PHASE_FLIGHT;
						events.SetPhase(PHASE_FLIGHT);
						me->SetFlying(true);
						me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
						me->SetReactState(REACT_PASSIVE);
						me->AttackStop();
						me->RemoveAllAuras();
						me->GetMotionMaster()->MovePoint(0, RazorFlight);
						events.ScheduleEvent(EVENT_FIREBALL, 7000, 0,
								PHASE_FLIGHT);
						events.ScheduleEvent(EVENT_DEVOURING, 10000, 0,
								PHASE_FLIGHT);
						events.ScheduleEvent(EVENT_SUMMON, 5000, 0,
								PHASE_FLIGHT);
						events.ScheduleEvent(EVENT_GROUND, 75000, 0,
								PHASE_FLIGHT);
						++FlyCount;
						return;
					case EVENT_LAND:
						me->SetFlying(false);
						me->NearTeleportTo(586.966f, -175.534f, 391.517f,
								1.692f);
						DoCast(me, SPELL_STUN, true);
						me->RemoveFlag(UNIT_FIELD_FLAGS,
								UNIT_FLAG_NON_ATTACKABLE);
						if (Creature *pCommander = me->GetCreature(*me, instance->GetData64(DATA_EXP_COMMANDER)))
							pCommander->AI()->DoAction(ACTION_GROUND_PHASE);
						events.ScheduleEvent(EVENT_HARPOON, 0, 0, PHASE_GROUND);
						events.ScheduleEvent(EVENT_BREATH, 30000, 0,
								PHASE_GROUND);
						events.ScheduleEvent(EVENT_BUFFET, 33000, 0,
								PHASE_GROUND);
						events.ScheduleEvent(EVENT_FLIGHT, 35000, 0,
								PHASE_GROUND);
						return;
					case EVENT_HARPOON:
						for (uint8 n = 0; n < RAID_MODE(2, 4); ++n)
							if (Harpoon[n])
								Harpoon[n]->CastSpell(me, SPELL_HARPOON, true);
						events.ScheduleEvent(EVENT_HARPOON, 1500, 0,
								PHASE_GROUND);
						return;
					case EVENT_BREATH:
						me->MonsterTextEmote(EMOTE_BREATH, 0, true);
						DoCastAOE(SPELL_FLAMEBREATH);
						events.CancelEvent(EVENT_HARPOON);
						events.CancelEvent(EVENT_BREATH);
						return;
					case EVENT_BUFFET:
						DoCastAOE(SPELL_WINGBUFFET);
						for (uint8 n = 0; n < RAID_MODE(2, 4); ++n)
							if (Harpoon[n])
								Harpoon[n]->CastSpell(Harpoon[n], SPELL_FLAMED,
										true);
						events.CancelEvent(EVENT_BUFFET);
						return;
					}
				}
			}
			if (phase == PHASE_PERMAGROUND) {
				while (uint32 eventId = events.ExecuteEvent()) {
					switch (eventId) {
					case EVENT_FLAME:
						DoCastAOE(SPELL_FLAMEBUFFET);
						events.ScheduleEvent(EVENT_FLAME, 10000, 0,
								PHASE_PERMAGROUND);
						return;
					case EVENT_BREATH:
						me->MonsterTextEmote(EMOTE_BREATH, 0, true);
						DoCastVictim(SPELL_FLAMEBREATH);
						events.ScheduleEvent(EVENT_BREATH, 20000, 0,
								PHASE_PERMAGROUND);
						return;
					case EVENT_FIREBALL:
						if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 200, true))
							DoCast(pTarget, SPELL_FIREBALL);
						events.ScheduleEvent(EVENT_FIREBALL, 3000, 0,
								PHASE_PERMAGROUND);
						return;
					case EVENT_DEVOURING:
						if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 200, true))
							DoCast(pTarget, SPELL_DEVOURING_FLAME);
						events.ScheduleEvent(EVENT_DEVOURING, 10000, 0,
								PHASE_PERMAGROUND);
						return;
					case EVENT_BUFFET:
						DoCastAOE(SPELL_WINGBUFFET);
						events.CancelEvent(EVENT_BUFFET);
						return;
					case EVENT_FUSE:
						DoCastVictim(SPELL_FUSEARMOR);
						events.ScheduleEvent(EVENT_FUSE, 10000, 0,
								PHASE_PERMAGROUND);
						return;
					}
				}

				DoMeleeAttackIfReady();
			} else {
				if (uint32 eventId = events.ExecuteEvent()) {
					switch (eventId) {
					case EVENT_GROUND:
						phase = PHASE_GROUND;
						events.SetPhase(PHASE_GROUND);
						if (Harpoon[0])
							Harpoon[0]->MonsterTextEmote(EMOTE_HARPOON, 0,
									true);
						me->GetMotionMaster()->MovePoint(0, RazorGround);
						events.ScheduleEvent(EVENT_LAND, 5500, 0, PHASE_GROUND);
						return;
					case EVENT_FIREBALL:
						if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 200, true))
							DoCast(pTarget, SPELL_FIREBALL);
						events.ScheduleEvent(EVENT_FIREBALL, 3000, 0,
								PHASE_FLIGHT);
						return;
					case EVENT_DEVOURING:
						if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 200, true))
							DoCast(pTarget, SPELL_DEVOURING_FLAME);
						events.ScheduleEvent(EVENT_DEVOURING, 10000, 0,
								PHASE_FLIGHT);
						return;
					case EVENT_SUMMON:
						SummonAdds();
						events.ScheduleEvent(EVENT_SUMMON, 45000, 0,
								PHASE_FLIGHT);
						return;
					}
				}
			}
		}