Advertisement
Emulation

Untitled

May 28th, 2015
308
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.80 KB | None | 0 0
  1. #include "ScriptPCH.h"
  2.  
  3. enum Spells
  4. {
  5.     SPELL_SONIC_STRIKE = 41168,
  6.     SPELL_CONSUME_FLESH = 4280,
  7.     SPELL_SWOOP = 51919
  8. };
  9.  
  10. enum Events
  11. {
  12.     EVENT_CHANGE_FLAGS = 1,
  13.     EVENT_FLY_TO_POS = 2,
  14.     EVENT_SPAWN_CREATURE = 3,
  15.     EVENT_CHECK_POSITION_OF_PLAYER = 4,
  16.     EVENT_REMOVE_FLAGS = 5,
  17.     EVENT_SONIC_STRIKE = 6,
  18.     EVENT_CONSUME_FLESH = 7
  19. };
  20.  
  21. enum Phases
  22. {
  23.     PHASE_ZERO = 0,
  24.     PHASE_ONE = 1,
  25.     PHASE_TWO = 2,
  26.     PHASE_THREE = 3,
  27. };
  28.  
  29. class boss_groyat : public CreatureScript
  30. {
  31. public:
  32.     boss_groyat() : CreatureScript("boss_groyat") { }
  33.  
  34.     struct boss_groyatAI : public BossAI
  35.     {
  36.         boss_groyatAI(Creature* creature) : BossAI(creature, 0) { }
  37.  
  38.         Creature* echo;
  39.  
  40.         void Reset() override
  41.         {
  42.             _Reset();
  43.         }
  44.  
  45.         void EnterCombat(Unit* /*who*/) override
  46.         {
  47.             me->setActive(true);
  48.             DoZoneInCombat(me);
  49.             events.SetPhase(PHASE_ONE);
  50.             events.ScheduleEvent(EVENT_SONIC_STRIKE, 6000, 0, 0);
  51.             events.ScheduleEvent(EVENT_CONSUME_FLESH, 2000, 0, 0);
  52.         }
  53.  
  54.         void UpdateAI(uint32 diff) override
  55.         {
  56.             if (!UpdateVictim())
  57.                 return;
  58.  
  59.             events.Update(diff);
  60.  
  61.             if (me->HasUnitState(UNIT_STATE_CASTING))
  62.                 return;
  63.  
  64.             if (HealthBelowPct(75) && events.IsInPhase(PHASE_ONE))
  65.             {
  66.                 events.SetPhase(PHASE_TWO);
  67.                 events.ScheduleEvent(EVENT_CHANGE_FLAGS, 1000);
  68.                 events.CancelEvent(EVENT_SONIC_STRIKE);
  69.                 events.CancelEvent(EVENT_CONSUME_FLESH);
  70.             }
  71.  
  72.             else if (HealthBelowPct(25) && events.IsInPhase(PHASE_TWO))
  73.             {
  74.                 events.SetPhase(PHASE_THREE);
  75.                 events.ScheduleEvent(EVENT_CHANGE_FLAGS, 1000);
  76.                 events.CancelEvent(EVENT_SONIC_STRIKE);
  77.                 events.CancelEvent(EVENT_CONSUME_FLESH);
  78.             }
  79.  
  80.             while (uint32 eventId = events.ExecuteEvent())
  81.             {
  82.                 switch (eventId)
  83.                 {
  84.                 case EVENT_SONIC_STRIKE:
  85.                     if (Unit* target = SelectTarget(SELECT_TARGET_BOTTOMAGGRO))
  86.                     {
  87.                         me->CastSpell(target, SPELL_SONIC_STRIKE);
  88.                         events.ScheduleEvent(SPELL_SONIC_STRIKE, 6000, 0, 0);
  89.                     }
  90.                     break;
  91.                 case EVENT_CONSUME_FLESH:
  92.                     me->CastSpell(me->GetVictim(), SPELL_CONSUME_FLESH);
  93.                     events.ScheduleEvent(SPELL_CONSUME_FLESH, 2000, 0, 0);
  94.                     break;
  95.                 case EVENT_CHANGE_FLAGS:
  96.                     me->AttackStop();
  97.                     me->SetReactState(REACT_PASSIVE);
  98.                     events.ScheduleEvent(EVENT_FLY_TO_POS, 1000);
  99.                     break;
  100.                 case EVENT_FLY_TO_POS:
  101.                     me->GetMotionMaster()->MovePoint(1, 2089.227539f, 2006.428223f, 68.773973f);
  102.                     break;
  103.                 case EVENT_SPAWN_CREATURE:
  104.                     if (Unit* target = SelectTarget(SELECT_TARGET_BOTTOMAGGRO))
  105.                     {
  106.                         echo = me->SummonCreature(46041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), target->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
  107.                         echo->SetReactState(REACT_PASSIVE);
  108.                     }
  109.                     events.ScheduleEvent(EVENT_CHECK_POSITION_OF_PLAYER, 2000);
  110.                     break;
  111.                 case EVENT_CHECK_POSITION_OF_PLAYER:
  112.                     if (Player* closestPlayer = echo->SelectNearestPlayer(2.0f))
  113.                         me->CastSpell(closestPlayer, SPELL_SWOOP);
  114.                     else
  115.                         me->GetMotionMaster()->MoveCharge(echo->GetPositionX(), echo->GetPositionY(), echo->GetPositionZ());
  116.  
  117.                     events.ScheduleEvent(EVENT_REMOVE_FLAGS, 1000);
  118.                     break;
  119.                 case EVENT_REMOVE_FLAGS:
  120.                     me->SetReactState(REACT_AGGRESSIVE);
  121.                     events.ScheduleEvent(EVENT_SONIC_STRIKE, 6000, 0, 0);
  122.                     events.ScheduleEvent(EVENT_CONSUME_FLESH, 2000, 0, 0);
  123.                     break;
  124.                 default:
  125.                     break;
  126.                 }
  127.             }
  128.  
  129.             DoMeleeAttackIfReady();
  130.         }
  131.  
  132.         void MovementInform(uint32 type, uint32 pointId) override
  133.         {
  134.             if (type != POINT_MOTION_TYPE)
  135.                 return;
  136.  
  137.             if (pointId == 1)
  138.             {
  139.                 me->SetOrientation(4.496407);
  140.                 events.ScheduleEvent(EVENT_SPAWN_CREATURE, 500);
  141.             }
  142.         }
  143.     };
  144.  
  145.     CreatureAI* GetAI(Creature* creature) const override
  146.     {
  147.         return new boss_groyatAI(creature);
  148.     }
  149. };
  150.  
  151. void AddSC_boss_groyat()
  152. {
  153.     new boss_groyat();
  154. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement