Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "ScriptPCH.h"
- enum Spells
- {
- SPELL_SONIC_STRIKE = 41168,
- SPELL_CONSUME_FLESH = 4280,
- SPELL_SWOOP = 51919
- };
- enum Events
- {
- EVENT_CHANGE_FLAGS = 1,
- EVENT_FLY_TO_POS = 2,
- EVENT_SPAWN_CREATURE = 3,
- EVENT_CHECK_POSITION_OF_PLAYER = 4,
- EVENT_REMOVE_FLAGS = 5,
- EVENT_SONIC_STRIKE = 6,
- EVENT_CONSUME_FLESH = 7
- };
- enum Phases
- {
- PHASE_ZERO = 0,
- PHASE_ONE = 1,
- PHASE_TWO = 2,
- PHASE_THREE = 3,
- };
- class boss_groyat : public CreatureScript
- {
- public:
- boss_groyat() : CreatureScript("boss_groyat") { }
- struct boss_groyatAI : public BossAI
- {
- boss_groyatAI(Creature* creature) : BossAI(creature, 0) { }
- Creature* echo;
- void Reset() override
- {
- _Reset();
- }
- void EnterCombat(Unit* /*who*/) override
- {
- me->setActive(true);
- DoZoneInCombat(me);
- events.SetPhase(PHASE_ONE);
- events.ScheduleEvent(EVENT_SONIC_STRIKE, 6000, 0, 0);
- events.ScheduleEvent(EVENT_CONSUME_FLESH, 2000, 0, 0);
- }
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
- events.Update(diff);
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
- if (HealthBelowPct(75) && events.IsInPhase(PHASE_ONE))
- {
- events.SetPhase(PHASE_TWO);
- events.ScheduleEvent(EVENT_CHANGE_FLAGS, 1000);
- events.CancelEvent(EVENT_SONIC_STRIKE);
- events.CancelEvent(EVENT_CONSUME_FLESH);
- }
- else if (HealthBelowPct(25) && events.IsInPhase(PHASE_TWO))
- {
- events.SetPhase(PHASE_THREE);
- events.ScheduleEvent(EVENT_CHANGE_FLAGS, 1000);
- events.CancelEvent(EVENT_SONIC_STRIKE);
- events.CancelEvent(EVENT_CONSUME_FLESH);
- }
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_SONIC_STRIKE:
- if (Unit* target = SelectTarget(SELECT_TARGET_BOTTOMAGGRO))
- {
- me->CastSpell(target, SPELL_SONIC_STRIKE);
- events.ScheduleEvent(SPELL_SONIC_STRIKE, 6000, 0, 0);
- }
- break;
- case EVENT_CONSUME_FLESH:
- me->CastSpell(me->GetVictim(), SPELL_CONSUME_FLESH);
- events.ScheduleEvent(SPELL_CONSUME_FLESH, 2000, 0, 0);
- break;
- case EVENT_CHANGE_FLAGS:
- me->AttackStop();
- me->SetReactState(REACT_PASSIVE);
- events.ScheduleEvent(EVENT_FLY_TO_POS, 1000);
- break;
- case EVENT_FLY_TO_POS:
- me->GetMotionMaster()->MovePoint(1, 2089.227539f, 2006.428223f, 68.773973f);
- break;
- case EVENT_SPAWN_CREATURE:
- if (Unit* target = SelectTarget(SELECT_TARGET_BOTTOMAGGRO))
- {
- echo = me->SummonCreature(46041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), target->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
- echo->SetReactState(REACT_PASSIVE);
- }
- events.ScheduleEvent(EVENT_CHECK_POSITION_OF_PLAYER, 2000);
- break;
- case EVENT_CHECK_POSITION_OF_PLAYER:
- if (Player* closestPlayer = echo->SelectNearestPlayer(2.0f))
- me->CastSpell(closestPlayer, SPELL_SWOOP);
- else
- me->GetMotionMaster()->MoveCharge(echo->GetPositionX(), echo->GetPositionY(), echo->GetPositionZ());
- events.ScheduleEvent(EVENT_REMOVE_FLAGS, 1000);
- break;
- case EVENT_REMOVE_FLAGS:
- me->SetReactState(REACT_AGGRESSIVE);
- events.ScheduleEvent(EVENT_SONIC_STRIKE, 6000, 0, 0);
- events.ScheduleEvent(EVENT_CONSUME_FLESH, 2000, 0, 0);
- break;
- default:
- break;
- }
- }
- DoMeleeAttackIfReady();
- }
- void MovementInform(uint32 type, uint32 pointId) override
- {
- if (type != POINT_MOTION_TYPE)
- return;
- if (pointId == 1)
- {
- me->SetOrientation(4.496407);
- events.ScheduleEvent(EVENT_SPAWN_CREATURE, 500);
- }
- }
- };
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new boss_groyatAI(creature);
- }
- };
- void AddSC_boss_groyat()
- {
- new boss_groyat();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement