diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp index 1aaa4af48..ed3024c2d 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp @@ -118,7 +118,7 @@ enum Events EVENT_INTRO_2 = 7, EVENT_INTRO_3 = 8, EVENT_INTRO_FINISH = 9, - EVENT_START_COMBAT = 10, + EVENT_SAY_ALGALON_AGGRO = 10, EVENT_INTRO_TIMER_DONE = 11, EVENT_QUANTUM_STRIKE = 12, EVENT_PHASE_PUNCH = 13, @@ -143,7 +143,7 @@ enum Events EVENT_OUTRO_11 = 32, EVENT_ACTIVATE_LIVING_CONSTELLATION = 33, EVENT_CHECK_HERALD_ITEMS = 34, - EVENT_REMOVE_UNNATTACKABLE = 35, + EVENT_ALGALON_IN_PROGRESS = 35, EVENT_DESPAWN_ALGALON_1 = 36, EVENT_DESPAWN_ALGALON_2 = 37, EVENT_DESPAWN_ALGALON_3 = 38, @@ -264,10 +264,13 @@ struct boss_algalon_the_observer : public ScriptedAI { boss_algalon_the_observer(Creature* creature) : ScriptedAI(creature), summons(me) { - _fedOnTears = true; - _firstPull = true; - _fightWon = false; _instance = me->GetInstanceScript(); + _fedOnTears = true; + _fightWon = false; + if (_instance) + _firstPull = !_instance->GetPersistentData(PERSISTENT_DATA_ALGALON_FIRST_PULL); + else + _firstPull = true; } EventMap events; @@ -381,17 +384,17 @@ struct boss_algalon_the_observer : public ScriptedAI me->SetSheath(SHEATH_STATE_UNARMED); me->SetFaction(190); me->CastSpell(me, SPELL_DUAL_WIELD, true); - _phaseTwo = false; _heraldOfTheTitans = true; - - if (_instance->GetBossState(BOSS_ALGALON) == FAIL) - { - _firstPull = false; - } - if (_instance) + { + if (_instance->GetBossState(BOSS_ALGALON) == FAIL) + { + _firstPull = false; + _instance->StorePersistentData(PERSISTENT_DATA_ALGALON_FIRST_PULL, 1); + } _instance->SetBossState(BOSS_ALGALON, NOT_STARTED); + } } void KilledUnit(Unit* victim) override @@ -452,6 +455,8 @@ struct boss_algalon_the_observer : public ScriptedAI _firstPull = false; _fedOnTears = false; me->SetImmuneToPC(false); + if (_instance) + _instance->StorePersistentData(PERSISTENT_DATA_ALGALON_FIRST_PULL, 1); break; case ACTION_ASCEND: summons.DespawnAll(); @@ -486,32 +491,28 @@ struct boss_algalon_the_observer : public ScriptedAI me->SetImmuneToNPC(true); events.Reset(); events.SetPhase(PHASE_ROLE_PLAY); + events.ScheduleEvent(EVENT_ALGALON_IN_PROGRESS, _firstPull ? 14s : 1500ms); + Talk(SAY_ALGALON_START_TIMER); + summons.DespawnEntry(NPC_AZEROTH); - if (!_firstPull) + if (_firstPull) { - events.ScheduleEvent(EVENT_START_COMBAT, 0ms); - introDelay = 8s; + _firstPull = false; + _instance->SetData(DATA_DESPAWN_ALGALON, 0); + events.ScheduleEvent(EVENT_SAY_ALGALON_AGGRO, 16s); + introDelay = 26s; } else - { - summons.DespawnEntry(NPC_AZEROTH); - _firstPull = false; - Talk(SAY_ALGALON_START_TIMER); - introDelay = 22s; - events.ScheduleEvent(EVENT_START_COMBAT, 14s); - _instance->SetData(DATA_DESPAWN_ALGALON, 0); - } + introDelay = 8500ms; - events.ScheduleEvent(EVENT_REMOVE_UNNATTACKABLE, introDelay - 500ms); events.ScheduleEvent(EVENT_INTRO_TIMER_DONE, introDelay); events.ScheduleEvent(EVENT_QUANTUM_STRIKE, 3500ms + introDelay); events.ScheduleEvent(EVENT_PHASE_PUNCH, 15500ms + introDelay); events.ScheduleEvent(EVENT_SUMMON_COLLAPSING_STAR, 16500ms + introDelay); - events.ScheduleEvent(EVENT_COSMIC_SMASH, 25s + introDelay); + events.ScheduleEvent(EVENT_COSMIC_SMASH, 26s + introDelay); events.ScheduleEvent(EVENT_ACTIVATE_LIVING_CONSTELLATION, 60s + introDelay); events.ScheduleEvent(EVENT_BIG_BANG, 90s + introDelay); events.ScheduleEvent(EVENT_ASCEND_TO_THE_HEAVENS, 360s + introDelay); - events.ScheduleEvent(EVENT_CHECK_HERALD_ITEMS, 5s); DoCheckHeraldOfTheTitans(); } @@ -533,7 +534,7 @@ struct boss_algalon_the_observer : public ScriptedAI events.ScheduleEvent(EVENT_OUTRO_7, 55s + 500ms); events.ScheduleEvent(EVENT_OUTRO_8, 73s + 500ms); events.ScheduleEvent(EVENT_OUTRO_9, 85s + 500ms); - events.ScheduleEvent(EVENT_OUTRO_10, 101s + 500ms); + events.ScheduleEvent(EVENT_OUTRO_10, 111s); events.ScheduleEvent(EVENT_OUTRO_11, 117s + 500ms); } } @@ -659,16 +660,17 @@ struct boss_algalon_the_observer : public ScriptedAI if (Creature* brann = _instance->GetCreature(DATA_BRANN_BRONZEBEARD_ALG)) brann->AI()->DoAction(ACTION_FINISH_INTRO); break; - case EVENT_START_COMBAT: - _instance->SetBossState(BOSS_ALGALON, IN_PROGRESS); + case EVENT_SAY_ALGALON_AGGRO: Talk(SAY_ALGALON_AGGRO); break; - case EVENT_REMOVE_UNNATTACKABLE: + case EVENT_ALGALON_IN_PROGRESS: + if (_instance) + _instance->SetBossState(BOSS_ALGALON, IN_PROGRESS); + break; + case EVENT_INTRO_TIMER_DONE: me->SetSheath(SHEATH_STATE_MELEE); me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); me->SetImmuneToNPC(false); - break; - case EVENT_INTRO_TIMER_DONE: events.SetPhase(PHASE_NORMAL); me->CastSpell((Unit*)nullptr, SPELL_SUPERMASSIVE_FAIL, true); // Hack: _IsValidTarget failed earlier due to flags, call AttackStart again @@ -677,7 +679,6 @@ struct boss_algalon_the_observer : public ScriptedAI if (Player* target = SelectTargetFromPlayerList(150.0f)) AttackStart(target); me->SetInCombatWithZone(); - for (uint32 i = 0; i < LIVING_CONSTELLATION_COUNT; ++i) me->SummonCreature(NPC_LIVING_CONSTELLATION, ConstellationPos[i], TEMPSUMMON_DEAD_DESPAWN); break; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h index faaf83d21..8d0fca9d8 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h @@ -317,6 +317,7 @@ enum UlduarPersistentData PERSISTENT_DATA_ALGALON_TIMER, PERSISTENT_DATA_C_OF_ULDUAR_MASK, PERSISTENT_DATA_MAGE_BARRIER, + PERSISTENT_DATA_ALGALON_FIRST_PULL, MAX_PERSISTENT_DATA };