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:
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user