Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "ScriptMgr.h"
- #include "CellImpl.h"
- #include "GridNotifiersImpl.h"
- #include "InstanceScript.h"
- #include "MotionMaster.h"
- #include "ObjectAccessor.h"
- #include "CHALLENGEMODE_LORD_KRAZU.h"
- #include "ScriptedCreature.h"
- #include "TemporarySummon.h"
- enum Yells
- {
- SAY_AGGRO = 0,
- SAY_KILL = 1,
- SAY_PHASE_2_TRANS = 2,
- SAY_PHASE_3_TRANS = 3,
- EMOTE_BREATH = 4
- };
- enum Events
- {
- EVENT_ADDS = 1,
- EVENT_VOID = 2,
- EVENT_AOE = 3,
- EVENT_SPAWNPOINT_ADDS = 4,
- EVENT_SPAWN_AZALOTH = 5,
- EVENT_SPAWN_GALVANOTH = 6,
- EVENT_CHECK_IF_AZALOTH_IS_DEAD = 7,
- EVENT_CHECK_IF_GALVANOTH_IS_DEAD = 8,
- EVENT_RETURN_TO_NORMAL_PHASE = 9,
- EVENT_SLOWDOWN = 10,
- EVENT_SHADOWNOVA = 11,
- EVENT_PAIN = 12,
- EVENT_KNOCKBACK = 13,
- EVENT_SHADOWHEAL = 14
- };
- Position const InfrontOfPortalFacingPortal = { 16248.70f, 16057.20f, 0.00f, 1.56f };
- Position const SpawnLocations[2] =
- {
- {16286.58f, 16066.45f, -0.00f, 2.68f},
- {16209.977f, 16067.896f, 0.00f, 0.54f},
- };
- class boss_krazu : public CreatureScript
- {
- public:
- boss_krazu() : CreatureScript("boss_krazu") { }
- struct boss_krazuAI : public BossAI
- {
- boss_krazuAI(Creature* creature) : BossAI(creature, DATA_KRAZU)
- {
- Initialize();
- }
- void Initialize()
- {
- Phase = PHASE_START;
- ParasitOnTheWay = false;
- }
- void Reset() override
- {
- Initialize();
- if (!IsCombatMovementAllowed())
- SetCombatMovement(true);
- _Reset();
- me->SetReactState(REACT_AGGRESSIVE);
- me->SetObjectScale(1);
- }
- void JustEngagedWith(Unit* /*who*/) override
- {
- events.ScheduleEvent(EVENT_ADDS, 10s, 20s, PHASE_START);
- events.ScheduleEvent(EVENT_AOE, 30s, 0, PHASE_START);
- events.ScheduleEvent(EVENT_SPAWNPOINT_ADDS, 40s, 0, PHASE_START);
- events.ScheduleEvent(EVENT_VOID, 45s, 0, PHASE_START);
- events.ScheduleEvent(EVENT_SLOWDOWN, 20s, 0, PHASE_START);
- me->Yell("YOU FOOLISH MORTALS HAHAHA!", LANG_UNIVERSAL);
- }
- void KilledUnit(Unit* /*victim*/) override
- {
- me->Say("YOU FOOL!", LANG_UNIVERSAL);
- }
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
- events.Update(diff);
- me->Attack(target, true);
- DoMeleeAttackIfReady();
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
- if (Phase == PHASE_START || Phase == PHASE_END) {
- while (ParasitOnTheWay) {
- me->SetReactState(REACT_PASSIVE);
- if (Parasit->GetDistance(me) < 10) {
- ParasitOnTheWay = false;
- Parasit->KillSelf();
- Parasit->DespawnOrUnsummon();
- me->SetHealth(me->GetHealthPct() + 5);
- me->SetReactState(REACT_AGGRESSIVE);
- return;
- }
- }
- if (Phase == PHASE_START) {
- if (HealthBelowPct(70)) {
- Phase = PHASE_MIDDLE;
- me->AttackStop();
- me->GetMotionMaster()->MovePoint(1, InfrontOfPortalFacingPortal, true);
- me->SetReactState(REACT_PASSIVE);
- me->AddAura(50161, me);
- events.ScheduleEvent(EVENT_SPAWN_AZALOTH, 5s, 0);
- return;
- }
- }
- if (Phase == PHASE_END) {
- if (HealthBelowPct(30)) {
- Phase = PHASE_CRITICAL;
- me->SetObjectScale(1.5);
- DoCastAOE(568);
- me->AddAura(2148, me);
- me->Yell("I WILL NOT DIE SO EASILY MORTALS!", LANG_UNIVERSAL);
- events.ScheduleEvent(EVENT_SHADOWHEAL, 5s, 0);
- events.ScheduleEvent(EVENT_SHADOWNOVA, 10s, 0);
- events.ScheduleEvent(EVENT_PAIN, 15s, 0);
- events.ScheduleEvent(EVENT_KNOCKBACK, 1s, 0);
- return;
- }
- }
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_ADDS: // Phase SUMMON
- me->Yell("RISE UP!", LANG_UNIVERSAL);
- me->SummonCreature(19427, me->GetVictim()->GetPosition(), TEMPSUMMON_TIMED_DESPAWN, 15s, 0, 0, true);
- events.ScheduleEvent(EVENT_ADDS, 25s, 0, Phase == PHASE_START || Phase == PHASE_END);
- break;
- case EVENT_VOID:
- me->Yell("FEL, HEAL ME!", LANG_UNIVERSAL);
- me->CastSpell(me, 40671);
- events.ScheduleEvent(EVENT_VOID, 35s, 0, Phase == PHASE_START || Phase == PHASE_END);
- break;
- case EVENT_AOE:
- me->Yell("FEEL MY WRATH!", LANG_UNIVERSAL);
- me->SetReactState(REACT_PASSIVE);
- DoCastAOE(43383);
- me->SetReactState(REACT_AGGRESSIVE);
- events.ScheduleEvent(EVENT_AOE, 30s, 0, Phase == PHASE_START || Phase == PHASE_END);
- break;
- case EVENT_SPAWNPOINT_ADDS:
- me->Yell("HELP ME DEMONS!", LANG_UNIVERSAL);
- me->SummonCreature(56594, SpawnLocations[0], TEMPSUMMON_CORPSE_DESPAWN, 999h, 0, 0, false);
- me->SummonCreature(56594, SpawnLocations[1], TEMPSUMMON_CORPSE_DESPAWN, 999h, 0, 0, false);
- events.ScheduleEvent(EVENT_SPAWNPOINT_ADDS, 30s, 0, Phase == PHASE_START || Phase == PHASE_END);
- break;
- case EVENT_SLOWDOWN:
- me->CastSpell(me->GetVictim(), 36518);
- events.ScheduleEvent(EVENT_SLOWDOWN, 20s, 0, Phase == PHASE_START || Phase == PHASE_END);
- break;
- default:
- break;
- }
- }
- }
- else if (Phase == PHASE_MIDDLE) {
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_SPAWN_AZALOTH:
- me->Yell("COME AZALOTH!", LANG_DEMONIC);
- me->SummonCreature(80002, SpawnLocations[0], TEMPSUMMON_CORPSE_DESPAWN, 999h, 0, 0, false);
- break;
- case EVENT_SPAWN_GALVANOTH:
- me->Yell("COME GALVANOTH!", LANG_DEMONIC);
- me->SummonCreature(80003, SpawnLocations[1], TEMPSUMMON_CORPSE_DESPAWN, 999h, 0, 0, false);
- break;
- case EVENT_CHECK_IF_AZALOTH_IS_DEAD:
- if (AZALOTH->IsAlive()) {
- events.ScheduleEvent(EVENT_CHECK_IF_AZALOTH_IS_DEAD, 2s, 0, PHASE_MIDDLE);
- return;
- }
- else {
- events.ScheduleEvent(EVENT_SPAWN_GALVANOTH, 2s, 0, PHASE_MIDDLE);
- }
- break;
- case EVENT_CHECK_IF_GALVANOTH_IS_DEAD:
- if (GALVANOTH->IsAlive()) {
- events.ScheduleEvent(EVENT_CHECK_IF_GALVANOTH_IS_DEAD, 2s, 0, PHASE_MIDDLE);
- return;
- }
- else {
- events.ScheduleEvent(EVENT_RETURN_TO_NORMAL_PHASE, 2s, 0, PHASE_MIDDLE);
- }
- break;
- case EVENT_RETURN_TO_NORMAL_PHASE:
- Phase = PHASE_END;
- me->SetReactState(REACT_AGGRESSIVE);
- me->GetMotionMaster()->MoveChase(me->SelectNearestTarget(100000, true));
- summons.DespawnAll();
- me->RemoveAura(50161);
- events.ScheduleEvent(EVENT_ADDS, 10s, 20s, Phase == PHASE_START || Phase == PHASE_END);
- events.ScheduleEvent(EVENT_AOE, 30s, 0, Phase == PHASE_START || Phase == PHASE_END);
- events.ScheduleEvent(EVENT_SPAWNPOINT_ADDS, 30s, 0, Phase == PHASE_START || Phase == PHASE_END);
- events.ScheduleEvent(EVENT_VOID, 30s, 0, Phase == PHASE_START || Phase == PHASE_END);
- break;
- default:
- break;
- }
- }
- }
- else if (Phase == PHASE_CRITICAL) {
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_SHADOWNOVA:
- me->CastSpell(me->GetVictim(), 69355);
- events.ScheduleEvent(EVENT_SHADOWNOVA, 20s, 0);
- break;
- case EVENT_PAIN:
- me->CastSpell(me->GetVictim(), 69404);
- events.ScheduleEvent(EVENT_PAIN, 35s, 0);
- break;
- case EVENT_KNOCKBACK:
- DoCastAOE(568);
- events.ScheduleEvent(EVENT_KNOCKBACK, 15s, 0);
- break;
- case EVENT_SHADOWHEAL:
- me->Yell("THE VOID SHOULD HEAL MY WOUNDS!", LANG_DEMONIC);
- DoCastSelf(71131);
- events.ScheduleEvent(EVENT_SHADOWHEAL, 35s, 0);
- break;
- default:
- break;
- }
- }
- }
- }
- void JustSummoned(Creature* summon) override
- {
- DoZoneInCombat(summon);
- summons.Summon(summon);
- switch (summon->GetEntry())
- {
- case 19427:
- summon->CastSpell(me, 57757);
- summon->SetReactState(REACT_AGGRESSIVE);
- break;
- case 56594:
- summon->Attack(me->GetVictim(), true);
- summon->CastSpell(summon, 47893);
- summon->SetReactState(REACT_AGGRESSIVE);
- summon->GetMotionMaster()->MoveChase(me->GetVictim());
- summon->setActive(true);
- summon->SetFarVisible(true);
- break;
- case 80002:
- AZALOTH = summon->ToCreature();
- AZALOTH->GetMotionMaster()->MoveChase(AZALOTH->SelectNearestTarget(100000, true));
- if (AZALOTH->IsAlive()) {
- events.ScheduleEvent(EVENT_CHECK_IF_AZALOTH_IS_DEAD, 2s, 0, PHASE_MIDDLE);
- return;
- }
- else {
- events.ScheduleEvent(EVENT_SPAWN_GALVANOTH, 2s, 0, PHASE_MIDDLE);
- }
- break;
- case 80003:
- GALVANOTH = summon->ToCreature();
- GALVANOTH->GetMotionMaster()->MoveChase(GALVANOTH->SelectNearestTarget(100000, true));
- if (GALVANOTH->IsAlive()) {
- events.ScheduleEvent(EVENT_CHECK_IF_GALVANOTH_IS_DEAD, 2s, 0, PHASE_MIDDLE);
- return;
- }
- else {
- events.ScheduleEvent(EVENT_RETURN_TO_NORMAL_PHASE, 2s, 0, PHASE_MIDDLE);
- }
- break;
- }
- }
- private:
- uint8 Phase;
- std::string Nachricht;
- std::string Nachricht2;
- Unit* target;
- Creature* AZALOTH;
- Creature* GALVANOTH;
- Creature* Parasit;
- bool ParasitOnTheWay;
- };
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetKrazuAI<boss_krazuAI>(creature);
- }
- };
- void AddSC_boss_krazu()
- {
- new boss_krazu();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement