From 37682632fe115b3a4d08b42c54255379fac13b9b Mon Sep 17 00:00:00 2001 From: Pondaveia <43385840+Pondaveia@users.noreply.github.com> Date: Thu, 2 May 2019 10:40:47 +0100 Subject: [PATCH] fix(Core/Raid): Ulduar - Kologarn (#1785) * Kologarn bugfixes - Doors not closing or opening during and after encounter - Petrifying gaze should have a start window so the raid doesn't wipe on pull * Update src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp * override canceled the repeats --- .../Northrend/Ulduar/Ulduar/boss_kologarn.cpp | 71 ++++++++++++------- .../Ulduar/Ulduar/instance_ulduar.cpp | 11 ++- 2 files changed, 54 insertions(+), 28 deletions(-) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp index d5e8f2c21..87089dccd 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp @@ -88,6 +88,7 @@ enum KologarnEvents EVENT_RESTORE_ARM_RIGHT = 5, EVENT_FOCUSED_EYEBEAM = 6, EVENT_STONE_SHOUT = 7, + EVENT_PREPARE_BREATH = 8, // Kologarn can't cast breath on pull }; enum KologarnNPCs @@ -136,7 +137,7 @@ public: struct boss_kologarnAI : public ScriptedAI { boss_kologarnAI(Creature* pCreature) : ScriptedAI(pCreature), vehicle(me->GetVehicleKit()), - _left(0), _right(0), summons(me) + _left(0), _right(0), summons(me), breathReady(false) { m_pInstance = me->GetInstanceScript(); assert(vehicle); @@ -150,10 +151,10 @@ public: EventMap events; SummonList summons; - bool _looksAchievement; + bool _looksAchievement, breathReady; uint8 _rubbleAchievement; - void MoveInLineOfSight(Unit* who) + void MoveInLineOfSight(Unit* who) override { if (who->GetTypeId() == TYPEID_PLAYER && me->GetExactDist2d(who) < 45.0f && me->getStandState() == UNIT_STAND_STATE_SUBMERGED) { @@ -168,7 +169,7 @@ public: ScriptedAI::MoveInLineOfSight(who); } - void EnterEvadeMode() + void EnterEvadeMode() override { if (!_EnterEvadeMode()) return; @@ -212,7 +213,7 @@ public: } } - void Reset() + void Reset() override { _rubbleAchievement = 0; _looksAchievement = true; @@ -229,9 +230,16 @@ public: AttachLeftArm(); AttachRightArm(); + + // Reset breath on pull + breathReady = false; + + // Open the door inside Kologarn chamber + if (GameObject* door = me->FindNearestGameObject(GO_KOLOGARN_DOORS, 100.0f)) + door->SetGoState(GO_STATE_ACTIVE); } - void DoAction(int32 param) + void DoAction(int32 param) override { if (param == DATA_KOLOGARN_LOOKS_ACHIEV) _looksAchievement = false; @@ -245,7 +253,7 @@ public: } } - uint32 GetData(uint32 param) const + uint32 GetData(uint32 param) const override { if (param == DATA_KOLOGARN_LOOKS_ACHIEV) return _looksAchievement; @@ -257,18 +265,18 @@ public: return 0; } - void AttackStart(Unit* who) + void AttackStart(Unit* who) override { me->Attack(who, true); } - void JustSummoned(Creature* cr) + void JustSummoned(Creature* cr) override { if (cr->GetEntry() != NPC_LEFT_ARM && cr->GetEntry() != NPC_RIGHT_ARM) summons.Summon(cr); } - void JustDied(Unit*) + void JustDied(Unit*) override { summons.DespawnAll(); me->StopMoving(); @@ -293,7 +301,7 @@ public: arm->DespawnOrUnsummon(3000); // visual } - void KilledUnit(Unit*) + void KilledUnit(Unit*) override { if (!urand(0,2)) return; @@ -301,7 +309,7 @@ public: Talk(SAY_SLAY); } - void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply) + void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply) override { if (!me->IsAlive()) return; @@ -334,7 +342,7 @@ public: } } - void DamageTaken(Unit* who, uint32& damage, DamageEffectType, SpellSchoolMask) + void DamageTaken(Unit* who, uint32& damage, DamageEffectType, SpellSchoolMask) override { if (who && who->GetEntry() == me->GetEntry() && me->GetHealth()) { @@ -343,22 +351,27 @@ public: } } - void EnterCombat(Unit* /*who*/) + void EnterCombat(Unit* /*who*/) override { if (m_pInstance) m_pInstance->SetData(TYPE_KOLOGARN, IN_PROGRESS); - events.RescheduleEvent(EVENT_SMASH, 8000); - events.RescheduleEvent(EVENT_SWEEP, 17000); - events.RescheduleEvent(EVENT_GRIP, 15000); - events.RescheduleEvent(EVENT_FOCUSED_EYEBEAM, 25000); + events.ScheduleEvent(EVENT_SMASH, 8000); + events.ScheduleEvent(EVENT_SWEEP, 17000); + events.ScheduleEvent(EVENT_GRIP, 15000); + events.ScheduleEvent(EVENT_FOCUSED_EYEBEAM, 25000); + events.ScheduleEvent(EVENT_PREPARE_BREATH, 3000); //events.ScheduleEvent(EVENT_ENRAGE, x); no info Talk(SAY_AGGRO); me->setActive(true); + + // Close the door inside Kologarn chamber + if (GameObject* door = me->FindNearestGameObject(GO_KOLOGARN_DOORS, 100.0f)) + door->SetGoState(GO_STATE_READY); } - void UpdateAI(uint32 diff) + void UpdateAI(uint32 diff) override { if (!UpdateVictim()) { @@ -370,8 +383,11 @@ public: if (me->HasUnitState(UNIT_STATE_CASTING)) return; - switch (events.GetEvent()) + switch (events.ExecuteEvent()) { + case EVENT_PREPARE_BREATH: + breathReady = true; + break; case EVENT_STONE_SHOUT: if (_left || _right) { @@ -380,7 +396,7 @@ public: } me->CastSpell(me->GetVictim(), SPELL_STONE_SHOUT, false); - events.RepeatEvent(2000); + events.ScheduleEvent(EVENT_STONE_SHOUT, 2000); break; case EVENT_SMASH: if (_left && _right) @@ -389,7 +405,7 @@ public: me->CastSpell(me->GetVictim(), SPELL_ONEARMED_OVERHEAD_SMASH, false); events.DelayEvents(1000); - events.RepeatEvent(14000); + events.ScheduleEvent(EVENT_SMASH, 14000); return; case EVENT_SWEEP: if (_left) @@ -402,10 +418,10 @@ public: } events.DelayEvents(1000); - events.RepeatEvent(17000); + events.ScheduleEvent(EVENT_SWEEP, 17000); return; case EVENT_GRIP: - events.RepeatEvent(25000); + events.ScheduleEvent(EVENT_GRIP, 25000); if (!_right) break; @@ -415,10 +431,10 @@ public: return; case EVENT_FOCUSED_EYEBEAM: { - events.RepeatEvent(13000+rand()%5000); + events.ScheduleEvent(EVENT_FOCUSED_EYEBEAM, 13000+rand()%5000); Unit* target = NULL; Map::PlayerList const& pList = me->GetMap()->GetPlayers(); - for(Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr) + for(auto itr = pList.begin(); itr != pList.end(); ++itr) { if (itr->GetSource()->GetPositionZ() < 420) continue; @@ -474,7 +490,8 @@ public: return; } - me->CastSpell(me->GetVictim(), SPELL_PETRIFYING_BREATH, false); + if (breathReady) + me->CastSpell(me->GetVictim(), SPELL_PETRIFYING_BREATH, false); me->resetAttackTimer(); } } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp index a7312583b..e23aef7eb 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp @@ -59,6 +59,9 @@ public: // XT-002 uint64 m_xt002DoorsGUID; + // Kologarn + uint64 KologarnDoorGUID; + // Assembly of Iron uint64 m_assemblyDoorsGUID; uint64 m_archivumDoorsGUID; @@ -132,6 +135,7 @@ public: // XT-002 m_xt002DoorsGUID = 0; + // Kologarn Door // Assembly of Iron m_assemblyDoorsGUID = 0; m_archivumDoorsGUID = 0; @@ -440,6 +444,9 @@ public: case GO_XT002_DOORS: m_xt002DoorsGUID = gameObject->GetGUID(); break; + case GO_KOLOGARN_DOORS: + KologarnDoorGUID = gameObject->GetGUID(); + break; case GO_KOLOGARN_BRIDGE: OpenIfDone(TYPE_KOLOGARN, gameObject, GO_STATE_READY); break; @@ -781,7 +788,9 @@ public: // XT-002 case GO_XT002_DOORS: return m_xt002DoorsGUID; - + // XT-002 + case GO_KOLOGARN_DOORS: + return KologarnDoorGUID; // Thorim case DATA_THORIM_LEVER_GATE: case DATA_THORIM_LEVER: