Advertisement
Lenzork

Lord Krazu C++ Script

Jun 27th, 2021
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.47 KB | None | 0 0
  1. #include "ScriptMgr.h"
  2. #include "CellImpl.h"
  3. #include "GridNotifiersImpl.h"
  4. #include "InstanceScript.h"
  5. #include "MotionMaster.h"
  6. #include "ObjectAccessor.h"
  7. #include "CHALLENGEMODE_LORD_KRAZU.h"
  8. #include "ScriptedCreature.h"
  9. #include "TemporarySummon.h"
  10.  
  11. enum Yells
  12. {
  13.     SAY_AGGRO = 0,
  14.     SAY_KILL = 1,
  15.     SAY_PHASE_2_TRANS = 2,
  16.     SAY_PHASE_3_TRANS = 3,
  17.     EMOTE_BREATH = 4
  18. };
  19.  
  20. enum Events
  21. {
  22.     EVENT_ADDS = 1,
  23.     EVENT_VOID = 2,
  24.     EVENT_AOE = 3,
  25.     EVENT_SPAWNPOINT_ADDS = 4,
  26.     EVENT_SPAWN_AZALOTH = 5,
  27.     EVENT_SPAWN_GALVANOTH = 6,
  28.     EVENT_CHECK_IF_AZALOTH_IS_DEAD = 7,
  29.     EVENT_CHECK_IF_GALVANOTH_IS_DEAD = 8,
  30.     EVENT_RETURN_TO_NORMAL_PHASE = 9,
  31.     EVENT_SLOWDOWN = 10,
  32.     EVENT_SHADOWNOVA = 11,
  33.     EVENT_PAIN = 12,
  34.     EVENT_KNOCKBACK = 13,
  35.     EVENT_SHADOWHEAL = 14
  36. };
  37.  
  38. Position const InfrontOfPortalFacingPortal = { 16248.70f, 16057.20f, 0.00f, 1.56f };
  39.  
  40. Position const SpawnLocations[2] =
  41. {
  42.     {16286.58f, 16066.45f, -0.00f, 2.68f},
  43.     {16209.977f, 16067.896f, 0.00f, 0.54f},
  44. };
  45.  
  46. class boss_krazu : public CreatureScript
  47. {
  48. public:
  49.     boss_krazu() : CreatureScript("boss_krazu") { }
  50.  
  51.     struct boss_krazuAI : public BossAI
  52.     {
  53.         boss_krazuAI(Creature* creature) : BossAI(creature, DATA_KRAZU)
  54.         {
  55.             Initialize();
  56.         }
  57.  
  58.         void Initialize()
  59.         {
  60.             Phase = PHASE_START;
  61.             ParasitOnTheWay = false;
  62.         }
  63.  
  64.         void Reset() override
  65.         {
  66.             Initialize();
  67.  
  68.             if (!IsCombatMovementAllowed())
  69.                 SetCombatMovement(true);
  70.  
  71.             _Reset();
  72.             me->SetReactState(REACT_AGGRESSIVE);
  73.             me->SetObjectScale(1);
  74.         }
  75.  
  76.         void JustEngagedWith(Unit* /*who*/) override
  77.         {
  78.             events.ScheduleEvent(EVENT_ADDS, 10s, 20s, PHASE_START);
  79.             events.ScheduleEvent(EVENT_AOE, 30s, 0, PHASE_START);
  80.             events.ScheduleEvent(EVENT_SPAWNPOINT_ADDS, 40s, 0, PHASE_START);
  81.             events.ScheduleEvent(EVENT_VOID, 45s, 0, PHASE_START);
  82.             events.ScheduleEvent(EVENT_SLOWDOWN, 20s, 0, PHASE_START);
  83.             me->Yell("YOU FOOLISH MORTALS HAHAHA!", LANG_UNIVERSAL);
  84.         }
  85.  
  86.         void KilledUnit(Unit* /*victim*/) override
  87.         {
  88.             me->Say("YOU FOOL!", LANG_UNIVERSAL);
  89.         }
  90.  
  91.         void UpdateAI(uint32 diff) override
  92.         {
  93.             if (!UpdateVictim())
  94.                 return;
  95.             events.Update(diff);
  96.             me->Attack(target, true);
  97.             DoMeleeAttackIfReady();
  98.  
  99.             if (me->HasUnitState(UNIT_STATE_CASTING))
  100.                 return;
  101.  
  102.             if (Phase == PHASE_START || Phase == PHASE_END) {
  103.  
  104.                 while (ParasitOnTheWay) {
  105.                     me->SetReactState(REACT_PASSIVE);
  106.                     if (Parasit->GetDistance(me) < 10) {
  107.                         ParasitOnTheWay = false;
  108.                         Parasit->KillSelf();
  109.                         Parasit->DespawnOrUnsummon();
  110.                         me->SetHealth(me->GetHealthPct() + 5);
  111.                         me->SetReactState(REACT_AGGRESSIVE);
  112.                         return;
  113.                     }
  114.                 }
  115.  
  116.                 if (Phase == PHASE_START) {
  117.  
  118.                     if (HealthBelowPct(70)) {
  119.                         Phase = PHASE_MIDDLE;
  120.                         me->AttackStop();
  121.                         me->GetMotionMaster()->MovePoint(1, InfrontOfPortalFacingPortal, true);
  122.                         me->SetReactState(REACT_PASSIVE);
  123.                         me->AddAura(50161, me);
  124.                         events.ScheduleEvent(EVENT_SPAWN_AZALOTH, 5s, 0);
  125.                         return;
  126.                     }
  127.                 }
  128.  
  129.                 if (Phase == PHASE_END) {
  130.                     if (HealthBelowPct(30)) {
  131.                         Phase = PHASE_CRITICAL;
  132.                         me->SetObjectScale(1.5);
  133.                         DoCastAOE(568);
  134.                         me->AddAura(2148, me);
  135.                         me->Yell("I WILL NOT DIE SO EASILY MORTALS!", LANG_UNIVERSAL);
  136.                         events.ScheduleEvent(EVENT_SHADOWHEAL, 5s, 0);
  137.                         events.ScheduleEvent(EVENT_SHADOWNOVA, 10s, 0);
  138.                         events.ScheduleEvent(EVENT_PAIN, 15s, 0);
  139.                         events.ScheduleEvent(EVENT_KNOCKBACK, 1s, 0);
  140.                         return;
  141.                     }
  142.                 }
  143.  
  144.                 while (uint32 eventId = events.ExecuteEvent())
  145.                 {
  146.                     switch (eventId)
  147.                     {
  148.                     case EVENT_ADDS: // Phase SUMMON
  149.                         me->Yell("RISE UP!", LANG_UNIVERSAL);
  150.                         me->SummonCreature(19427, me->GetVictim()->GetPosition(), TEMPSUMMON_TIMED_DESPAWN, 15s, 0, 0, true);
  151.                         events.ScheduleEvent(EVENT_ADDS, 25s, 0, Phase == PHASE_START || Phase == PHASE_END);
  152.                         break;
  153.                     case EVENT_VOID:
  154.                         me->Yell("FEL, HEAL ME!", LANG_UNIVERSAL);
  155.                         me->CastSpell(me, 40671);
  156.                         events.ScheduleEvent(EVENT_VOID, 35s, 0, Phase == PHASE_START || Phase == PHASE_END);
  157.                        
  158.                         break;
  159.                     case EVENT_AOE:
  160.                         me->Yell("FEEL MY WRATH!", LANG_UNIVERSAL);
  161.                         me->SetReactState(REACT_PASSIVE);
  162.                         DoCastAOE(43383);
  163.                         me->SetReactState(REACT_AGGRESSIVE);
  164.                         events.ScheduleEvent(EVENT_AOE, 30s, 0, Phase == PHASE_START || Phase == PHASE_END);
  165.                         break;
  166.                     case EVENT_SPAWNPOINT_ADDS:
  167.                         me->Yell("HELP ME DEMONS!", LANG_UNIVERSAL);
  168.                         me->SummonCreature(56594, SpawnLocations[0], TEMPSUMMON_CORPSE_DESPAWN, 999h, 0, 0, false);
  169.                         me->SummonCreature(56594, SpawnLocations[1], TEMPSUMMON_CORPSE_DESPAWN, 999h, 0, 0, false);
  170.                         events.ScheduleEvent(EVENT_SPAWNPOINT_ADDS, 30s, 0, Phase == PHASE_START || Phase == PHASE_END);
  171.                         break;
  172.                     case EVENT_SLOWDOWN:
  173.                         me->CastSpell(me->GetVictim(), 36518);
  174.                         events.ScheduleEvent(EVENT_SLOWDOWN, 20s, 0, Phase == PHASE_START || Phase == PHASE_END);
  175.                         break;
  176.                     default:
  177.                         break;
  178.                     }
  179.                 }
  180.             }
  181.             else if (Phase == PHASE_MIDDLE) {
  182.                 while (uint32 eventId = events.ExecuteEvent())
  183.                 {
  184.                     switch (eventId)
  185.                     {
  186.                     case EVENT_SPAWN_AZALOTH:
  187.                         me->Yell("COME AZALOTH!", LANG_DEMONIC);
  188.                         me->SummonCreature(80002, SpawnLocations[0], TEMPSUMMON_CORPSE_DESPAWN, 999h, 0, 0, false);
  189.                         break;
  190.                     case EVENT_SPAWN_GALVANOTH:
  191.                         me->Yell("COME GALVANOTH!", LANG_DEMONIC);
  192.                         me->SummonCreature(80003, SpawnLocations[1], TEMPSUMMON_CORPSE_DESPAWN, 999h, 0, 0, false);
  193.                         break;
  194.                     case EVENT_CHECK_IF_AZALOTH_IS_DEAD:
  195.                         if (AZALOTH->IsAlive()) {
  196.                             events.ScheduleEvent(EVENT_CHECK_IF_AZALOTH_IS_DEAD, 2s, 0, PHASE_MIDDLE);
  197.                             return;
  198.                         }
  199.                         else {
  200.                             events.ScheduleEvent(EVENT_SPAWN_GALVANOTH, 2s, 0, PHASE_MIDDLE);
  201.                         }
  202.                         break;
  203.                     case EVENT_CHECK_IF_GALVANOTH_IS_DEAD:
  204.                         if (GALVANOTH->IsAlive()) {
  205.                             events.ScheduleEvent(EVENT_CHECK_IF_GALVANOTH_IS_DEAD, 2s, 0, PHASE_MIDDLE);
  206.                             return;
  207.                         }
  208.                         else {
  209.                             events.ScheduleEvent(EVENT_RETURN_TO_NORMAL_PHASE, 2s, 0, PHASE_MIDDLE);
  210.                         }
  211.                         break;
  212.                     case EVENT_RETURN_TO_NORMAL_PHASE:
  213.                         Phase = PHASE_END;
  214.                         me->SetReactState(REACT_AGGRESSIVE);
  215.                         me->GetMotionMaster()->MoveChase(me->SelectNearestTarget(100000, true));
  216.                         summons.DespawnAll();
  217.                         me->RemoveAura(50161);
  218.                         events.ScheduleEvent(EVENT_ADDS, 10s, 20s, Phase == PHASE_START || Phase == PHASE_END);
  219.                         events.ScheduleEvent(EVENT_AOE, 30s, 0, Phase == PHASE_START || Phase == PHASE_END);
  220.                         events.ScheduleEvent(EVENT_SPAWNPOINT_ADDS, 30s, 0, Phase == PHASE_START || Phase == PHASE_END);
  221.                         events.ScheduleEvent(EVENT_VOID, 30s, 0, Phase == PHASE_START || Phase == PHASE_END);
  222.                         break;
  223.                     default:
  224.                         break;
  225.                     }
  226.                 }
  227.  
  228.             }
  229.             else if (Phase == PHASE_CRITICAL) {
  230.                 while (uint32 eventId = events.ExecuteEvent())
  231.                 {
  232.                     switch (eventId)
  233.                     {
  234.                     case EVENT_SHADOWNOVA:
  235.                         me->CastSpell(me->GetVictim(), 69355);
  236.                         events.ScheduleEvent(EVENT_SHADOWNOVA, 20s, 0);
  237.                         break;
  238.                     case EVENT_PAIN:
  239.                         me->CastSpell(me->GetVictim(), 69404);
  240.                         events.ScheduleEvent(EVENT_PAIN, 35s, 0);
  241.                         break;
  242.                     case EVENT_KNOCKBACK:
  243.                         DoCastAOE(568);
  244.                         events.ScheduleEvent(EVENT_KNOCKBACK, 15s, 0);
  245.                         break;
  246.                     case EVENT_SHADOWHEAL:
  247.                         me->Yell("THE VOID SHOULD HEAL MY WOUNDS!", LANG_DEMONIC);
  248.                         DoCastSelf(71131);
  249.                         events.ScheduleEvent(EVENT_SHADOWHEAL, 35s, 0);
  250.                         break;
  251.                     default:
  252.                         break;
  253.                     }
  254.                 }
  255.             }
  256.         }
  257.  
  258.         void JustSummoned(Creature* summon) override
  259.         {
  260.             DoZoneInCombat(summon);
  261.             summons.Summon(summon);
  262.             switch (summon->GetEntry())
  263.             {
  264.             case 19427:
  265.                 summon->CastSpell(me, 57757);
  266.                 summon->SetReactState(REACT_AGGRESSIVE);
  267.                 break;
  268.             case 56594:
  269.                 summon->Attack(me->GetVictim(), true);
  270.                 summon->CastSpell(summon, 47893);
  271.                 summon->SetReactState(REACT_AGGRESSIVE);
  272.                 summon->GetMotionMaster()->MoveChase(me->GetVictim());
  273.                 summon->setActive(true);
  274.                 summon->SetFarVisible(true);
  275.                 break;
  276.             case 80002:
  277.                 AZALOTH = summon->ToCreature();
  278.                 AZALOTH->GetMotionMaster()->MoveChase(AZALOTH->SelectNearestTarget(100000, true));
  279.                 if (AZALOTH->IsAlive()) {
  280.                     events.ScheduleEvent(EVENT_CHECK_IF_AZALOTH_IS_DEAD, 2s, 0, PHASE_MIDDLE);
  281.                     return;
  282.                 }
  283.                 else {
  284.                     events.ScheduleEvent(EVENT_SPAWN_GALVANOTH, 2s, 0, PHASE_MIDDLE);
  285.                 }
  286.                 break;
  287.             case 80003:
  288.                 GALVANOTH = summon->ToCreature();
  289.                 GALVANOTH->GetMotionMaster()->MoveChase(GALVANOTH->SelectNearestTarget(100000, true));
  290.                 if (GALVANOTH->IsAlive()) {
  291.                     events.ScheduleEvent(EVENT_CHECK_IF_GALVANOTH_IS_DEAD, 2s, 0, PHASE_MIDDLE);
  292.                     return;
  293.                 }
  294.                 else {
  295.                     events.ScheduleEvent(EVENT_RETURN_TO_NORMAL_PHASE, 2s, 0, PHASE_MIDDLE);
  296.                 }
  297.                 break;
  298.             }
  299.         }
  300.  
  301.     private:
  302.         uint8 Phase;
  303.         std::string Nachricht;
  304.         std::string Nachricht2;
  305.         Unit* target;
  306.         Creature* AZALOTH;
  307.         Creature* GALVANOTH;
  308.         Creature* Parasit;
  309.         bool ParasitOnTheWay;
  310.     };
  311.  
  312.     CreatureAI* GetAI(Creature* creature) const override
  313.     {
  314.         return GetKrazuAI<boss_krazuAI>(creature);
  315.     }
  316. };
  317.  
  318. void AddSC_boss_krazu()
  319. {
  320.     new boss_krazu();
  321. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement