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
This commit is contained in:
Pondaveia
2019-05-02 10:40:47 +01:00
committed by GitHub
parent 820a6ba07a
commit 37682632fe
2 changed files with 54 additions and 28 deletions
@@ -88,6 +88,7 @@ enum KologarnEvents
EVENT_RESTORE_ARM_RIGHT = 5, EVENT_RESTORE_ARM_RIGHT = 5,
EVENT_FOCUSED_EYEBEAM = 6, EVENT_FOCUSED_EYEBEAM = 6,
EVENT_STONE_SHOUT = 7, EVENT_STONE_SHOUT = 7,
EVENT_PREPARE_BREATH = 8, // Kologarn can't cast breath on pull
}; };
enum KologarnNPCs enum KologarnNPCs
@@ -136,7 +137,7 @@ public:
struct boss_kologarnAI : public ScriptedAI struct boss_kologarnAI : public ScriptedAI
{ {
boss_kologarnAI(Creature* pCreature) : ScriptedAI(pCreature), vehicle(me->GetVehicleKit()), 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(); m_pInstance = me->GetInstanceScript();
assert(vehicle); assert(vehicle);
@@ -150,10 +151,10 @@ public:
EventMap events; EventMap events;
SummonList summons; SummonList summons;
bool _looksAchievement; bool _looksAchievement, breathReady;
uint8 _rubbleAchievement; 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) if (who->GetTypeId() == TYPEID_PLAYER && me->GetExactDist2d(who) < 45.0f && me->getStandState() == UNIT_STAND_STATE_SUBMERGED)
{ {
@@ -168,7 +169,7 @@ public:
ScriptedAI::MoveInLineOfSight(who); ScriptedAI::MoveInLineOfSight(who);
} }
void EnterEvadeMode() void EnterEvadeMode() override
{ {
if (!_EnterEvadeMode()) if (!_EnterEvadeMode())
return; return;
@@ -212,7 +213,7 @@ public:
} }
} }
void Reset() void Reset() override
{ {
_rubbleAchievement = 0; _rubbleAchievement = 0;
_looksAchievement = true; _looksAchievement = true;
@@ -229,9 +230,16 @@ public:
AttachLeftArm(); AttachLeftArm();
AttachRightArm(); 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) if (param == DATA_KOLOGARN_LOOKS_ACHIEV)
_looksAchievement = false; _looksAchievement = false;
@@ -245,7 +253,7 @@ public:
} }
} }
uint32 GetData(uint32 param) const uint32 GetData(uint32 param) const override
{ {
if (param == DATA_KOLOGARN_LOOKS_ACHIEV) if (param == DATA_KOLOGARN_LOOKS_ACHIEV)
return _looksAchievement; return _looksAchievement;
@@ -257,18 +265,18 @@ public:
return 0; return 0;
} }
void AttackStart(Unit* who) void AttackStart(Unit* who) override
{ {
me->Attack(who, true); me->Attack(who, true);
} }
void JustSummoned(Creature* cr) void JustSummoned(Creature* cr) override
{ {
if (cr->GetEntry() != NPC_LEFT_ARM && cr->GetEntry() != NPC_RIGHT_ARM) if (cr->GetEntry() != NPC_LEFT_ARM && cr->GetEntry() != NPC_RIGHT_ARM)
summons.Summon(cr); summons.Summon(cr);
} }
void JustDied(Unit*) void JustDied(Unit*) override
{ {
summons.DespawnAll(); summons.DespawnAll();
me->StopMoving(); me->StopMoving();
@@ -293,7 +301,7 @@ public:
arm->DespawnOrUnsummon(3000); // visual arm->DespawnOrUnsummon(3000); // visual
} }
void KilledUnit(Unit*) void KilledUnit(Unit*) override
{ {
if (!urand(0,2)) if (!urand(0,2))
return; return;
@@ -301,7 +309,7 @@ public:
Talk(SAY_SLAY); Talk(SAY_SLAY);
} }
void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply) void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply) override
{ {
if (!me->IsAlive()) if (!me->IsAlive())
return; 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()) 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) if (m_pInstance)
m_pInstance->SetData(TYPE_KOLOGARN, IN_PROGRESS); m_pInstance->SetData(TYPE_KOLOGARN, IN_PROGRESS);
events.RescheduleEvent(EVENT_SMASH, 8000); events.ScheduleEvent(EVENT_SMASH, 8000);
events.RescheduleEvent(EVENT_SWEEP, 17000); events.ScheduleEvent(EVENT_SWEEP, 17000);
events.RescheduleEvent(EVENT_GRIP, 15000); events.ScheduleEvent(EVENT_GRIP, 15000);
events.RescheduleEvent(EVENT_FOCUSED_EYEBEAM, 25000); events.ScheduleEvent(EVENT_FOCUSED_EYEBEAM, 25000);
events.ScheduleEvent(EVENT_PREPARE_BREATH, 3000);
//events.ScheduleEvent(EVENT_ENRAGE, x); no info //events.ScheduleEvent(EVENT_ENRAGE, x); no info
Talk(SAY_AGGRO); Talk(SAY_AGGRO);
me->setActive(true); 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()) if (!UpdateVictim())
{ {
@@ -370,8 +383,11 @@ public:
if (me->HasUnitState(UNIT_STATE_CASTING)) if (me->HasUnitState(UNIT_STATE_CASTING))
return; return;
switch (events.GetEvent()) switch (events.ExecuteEvent())
{ {
case EVENT_PREPARE_BREATH:
breathReady = true;
break;
case EVENT_STONE_SHOUT: case EVENT_STONE_SHOUT:
if (_left || _right) if (_left || _right)
{ {
@@ -380,7 +396,7 @@ public:
} }
me->CastSpell(me->GetVictim(), SPELL_STONE_SHOUT, false); me->CastSpell(me->GetVictim(), SPELL_STONE_SHOUT, false);
events.RepeatEvent(2000); events.ScheduleEvent(EVENT_STONE_SHOUT, 2000);
break; break;
case EVENT_SMASH: case EVENT_SMASH:
if (_left && _right) if (_left && _right)
@@ -389,7 +405,7 @@ public:
me->CastSpell(me->GetVictim(), SPELL_ONEARMED_OVERHEAD_SMASH, false); me->CastSpell(me->GetVictim(), SPELL_ONEARMED_OVERHEAD_SMASH, false);
events.DelayEvents(1000); events.DelayEvents(1000);
events.RepeatEvent(14000); events.ScheduleEvent(EVENT_SMASH, 14000);
return; return;
case EVENT_SWEEP: case EVENT_SWEEP:
if (_left) if (_left)
@@ -402,10 +418,10 @@ public:
} }
events.DelayEvents(1000); events.DelayEvents(1000);
events.RepeatEvent(17000); events.ScheduleEvent(EVENT_SWEEP, 17000);
return; return;
case EVENT_GRIP: case EVENT_GRIP:
events.RepeatEvent(25000); events.ScheduleEvent(EVENT_GRIP, 25000);
if (!_right) if (!_right)
break; break;
@@ -415,10 +431,10 @@ public:
return; return;
case EVENT_FOCUSED_EYEBEAM: case EVENT_FOCUSED_EYEBEAM:
{ {
events.RepeatEvent(13000+rand()%5000); events.ScheduleEvent(EVENT_FOCUSED_EYEBEAM, 13000+rand()%5000);
Unit* target = NULL; Unit* target = NULL;
Map::PlayerList const& pList = me->GetMap()->GetPlayers(); 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) if (itr->GetSource()->GetPositionZ() < 420)
continue; continue;
@@ -474,6 +490,7 @@ public:
return; return;
} }
if (breathReady)
me->CastSpell(me->GetVictim(), SPELL_PETRIFYING_BREATH, false); me->CastSpell(me->GetVictim(), SPELL_PETRIFYING_BREATH, false);
me->resetAttackTimer(); me->resetAttackTimer();
} }
@@ -59,6 +59,9 @@ public:
// XT-002 // XT-002
uint64 m_xt002DoorsGUID; uint64 m_xt002DoorsGUID;
// Kologarn
uint64 KologarnDoorGUID;
// Assembly of Iron // Assembly of Iron
uint64 m_assemblyDoorsGUID; uint64 m_assemblyDoorsGUID;
uint64 m_archivumDoorsGUID; uint64 m_archivumDoorsGUID;
@@ -132,6 +135,7 @@ public:
// XT-002 // XT-002
m_xt002DoorsGUID = 0; m_xt002DoorsGUID = 0;
// Kologarn Door
// Assembly of Iron // Assembly of Iron
m_assemblyDoorsGUID = 0; m_assemblyDoorsGUID = 0;
m_archivumDoorsGUID = 0; m_archivumDoorsGUID = 0;
@@ -440,6 +444,9 @@ public:
case GO_XT002_DOORS: case GO_XT002_DOORS:
m_xt002DoorsGUID = gameObject->GetGUID(); m_xt002DoorsGUID = gameObject->GetGUID();
break; break;
case GO_KOLOGARN_DOORS:
KologarnDoorGUID = gameObject->GetGUID();
break;
case GO_KOLOGARN_BRIDGE: case GO_KOLOGARN_BRIDGE:
OpenIfDone(TYPE_KOLOGARN, gameObject, GO_STATE_READY); OpenIfDone(TYPE_KOLOGARN, gameObject, GO_STATE_READY);
break; break;
@@ -781,7 +788,9 @@ public:
// XT-002 // XT-002
case GO_XT002_DOORS: case GO_XT002_DOORS:
return m_xt002DoorsGUID; return m_xt002DoorsGUID;
// XT-002
case GO_KOLOGARN_DOORS:
return KologarnDoorGUID;
// Thorim // Thorim
case DATA_THORIM_LEVER_GATE: case DATA_THORIM_LEVER_GATE:
case DATA_THORIM_LEVER: case DATA_THORIM_LEVER: