fix(Scripts/IcecrownCitadel): Script Sindragosa's respawn/waypoints (#15792)

This commit is contained in:
Skjalf
2023-04-03 00:07:10 -03:00
committed by GitHub
parent b8a0105ca9
commit ea1eed7362
4 changed files with 67 additions and 35 deletions
@@ -0,0 +1,12 @@
--
SET @PATH = 36853 * 10;
DELETE FROM `waypoint_data` WHERE `id`=@PATH;
INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
(@PATH, 1, 4551.7847, 2444.7153, 228.58171,0,0,0,0,100,0),
(@PATH, 2, 4555.238, 2370.889, 229.2206,0,0,0,0,100,0),
(@PATH, 3, 4617.6616, 2352.2952, 214.60947,0,0,0,0,100,0),
(@PATH, 4, 4673.6704, 2437.1182, 218.91505,0,0,0,0,100,0),
(@PATH, 5, 4659.0747, 2579.3906, 229.49834,0,0,0,0,100,0),
(@PATH, 6, 4591.4316, 2598.192, 229.97064,0,0,0,0,100,0),
(@PATH, 7, 4564.4287, 2562.0461, 230.72063,0,0,0,0,100,0),
(@PATH, 8, 4555.6953, 2487.9895, 229.9706,0,0,0,0,100,0);
@@ -163,7 +163,6 @@ Position const RimefangFlyPos = {4413.309f, 2456.421f, 233.3795f, 2.890186f
Position const RimefangLandPos = {4413.309f, 2456.421f, 203.3848f, 2.890186f}; Position const RimefangLandPos = {4413.309f, 2456.421f, 203.3848f, 2.890186f};
Position const SpinestalkerFlyPos = {4418.895f, 2514.233f, 230.4864f, 3.396045f}; Position const SpinestalkerFlyPos = {4418.895f, 2514.233f, 230.4864f, 3.396045f};
Position const SpinestalkerLandPos = {4418.895f, 2514.233f, 203.3848f, 3.396045f}; Position const SpinestalkerLandPos = {4418.895f, 2514.233f, 203.3848f, 3.396045f};
Position const SindragosaSpawnPos = {4818.700f, 2483.710f, 287.0650f, 3.089233f};
Position const SindragosaFlyInPos = {4420.190f, 2484.360f, 232.5150f, 3.141593f}; Position const SindragosaFlyInPos = {4420.190f, 2484.360f, 232.5150f, 3.141593f};
Position const SindragosaLandPos = {4419.190f, 2484.570f, 203.3848f, 3.141593f}; Position const SindragosaLandPos = {4419.190f, 2484.570f, 203.3848f, 3.141593f};
Position const SindragosaAirPos = {4475.990f, 2484.430f, 247.9340f, 3.141593f}; Position const SindragosaAirPos = {4475.990f, 2484.430f, 247.9340f, 3.141593f};
@@ -273,7 +272,7 @@ public:
struct boss_sindragosaAI : public BossAI struct boss_sindragosaAI : public BossAI
{ {
boss_sindragosaAI(Creature* creature) : BossAI(creature, DATA_SINDRAGOSA), _summoned(false) boss_sindragosaAI(Creature* creature) : BossAI(creature, DATA_SINDRAGOSA)
{ {
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_HASTE_SPELLS, true); me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_HASTE_SPELLS, true);
} }
@@ -286,16 +285,9 @@ public:
_bombCount = 0; _bombCount = 0;
_mysticBuffetStack = 0; _mysticBuffetStack = 0;
_Reset(); _Reset();
me->DisableRotate(false);
me->SetControlled(false, UNIT_STATE_ROOT);
me->SetSpeed(MOVE_RUN, me->GetCreatureTemplate()->speed_run); me->SetSpeed(MOVE_RUN, me->GetCreatureTemplate()->speed_run);
me->SetReactState(REACT_AGGRESSIVE); me->SetReactState(REACT_AGGRESSIVE);
me->CastSpell(me, SPELL_TANK_MARKER, true); me->CastSpell(me, SPELL_TANK_MARKER, true);
if (!_summoned)
{
me->SetDisableGravity(true);
}
} }
void MoveInLineOfSight(Unit* who) override void MoveInLineOfSight(Unit* who) override
@@ -359,20 +351,9 @@ public:
return me->IsVisible() && target->GetEntry() != NPC_CROK_SCOURGEBANE; return me->IsVisible() && target->GetEntry() != NPC_CROK_SCOURGEBANE;
} }
void JustReachedHome() override
{
_JustReachedHome();
instance->SetBossState(DATA_SINDRAGOSA, FAIL);
if (_summoned)
{
me->SetDisableGravity(false);
}
}
void EnterEvadeMode(EvadeReason why) override void EnterEvadeMode(EvadeReason why) override
{ {
me->DisableRotate(false); instance->SetBossState(DATA_SINDRAGOSA, FAIL);
me->SetControlled(false, UNIT_STATE_ROOT);
BossAI::EnterEvadeMode(why); BossAI::EnterEvadeMode(why);
} }
@@ -386,10 +367,6 @@ public:
{ {
if (action == ACTION_START_FROSTWYRM) if (action == ACTION_START_FROSTWYRM)
{ {
if (_summoned)
return;
_summoned = true;
if (TempSummon* summon = me->ToTempSummon()) if (TempSummon* summon = me->ToTempSummon())
summon->SetTempSummonType(TEMPSUMMON_DEAD_DESPAWN); summon->SetTempSummonType(TEMPSUMMON_DEAD_DESPAWN);
@@ -403,7 +380,11 @@ public:
float moveTime = me->GetExactDist(&SindragosaFlyInPos) / (me->GetSpeed(MOVE_RUN) * 0.001f); float moveTime = me->GetExactDist(&SindragosaFlyInPos) / (me->GetSpeed(MOVE_RUN) * 0.001f);
me->m_Events.AddEvent(new FrostwyrmLandEvent(*me, SindragosaLandPos), me->m_Events.CalculateTime(uint64(moveTime) + 250)); me->m_Events.AddEvent(new FrostwyrmLandEvent(*me, SindragosaLandPos), me->m_Events.CalculateTime(uint64(moveTime) + 250));
me->GetMotionMaster()->MovePoint(POINT_FROSTWYRM_FLY_IN, SindragosaFlyInPos); me->GetMotionMaster()->MovePoint(POINT_FROSTWYRM_FLY_IN, SindragosaFlyInPos);
me->CastSpell(me, SPELL_SINDRAGOSA_S_FURY, true);
if (!instance->GetData(DATA_SINDRAGOSA_INTRO))
{
DoCastAOE(SPELL_SINDRAGOSA_S_FURY);
}
} }
} }
@@ -685,7 +666,6 @@ public:
} }
private: private:
bool _summoned;
uint8 _bombCount; uint8 _bombCount;
uint8 _mysticBuffetStack; uint8 _mysticBuffetStack;
bool _didFirstFlyPhase; bool _didFirstFlyPhase;
@@ -1724,13 +1704,10 @@ public:
if (Creature* rimefang = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_RIMEFANG))) if (Creature* rimefang = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_RIMEFANG)))
rimefang->AI()->DoAction(ACTION_START_FROSTWYRM); rimefang->AI()->DoAction(ACTION_START_FROSTWYRM);
if (!instance->GetData(DATA_SINDRAGOSA_FROSTWYRMS) && !instance->GetGuidData(DATA_SINDRAGOSA) && instance->GetBossState(DATA_SINDRAGOSA) != DONE) if (!instance->GetData(DATA_SINDRAGOSA_FROSTWYRMS))
{ {
if (instance->GetData(DATA_HAS_LIMITED_ATTEMPTS) && !instance->GetData(DATA_HEROIC_ATTEMPTS))
return true;
player->GetMap()->LoadGrid(SindragosaSpawnPos.GetPositionX(), SindragosaSpawnPos.GetPositionY()); player->GetMap()->LoadGrid(SindragosaSpawnPos.GetPositionX(), SindragosaSpawnPos.GetPositionY());
if (Creature* sindragosa = player->GetMap()->SummonCreature(NPC_SINDRAGOSA, SindragosaSpawnPos)) if (Creature* sindragosa = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_SINDRAGOSA)))
sindragosa->AI()->DoAction(ACTION_START_FROSTWYRM); sindragosa->AI()->DoAction(ACTION_START_FROSTWYRM);
} }
} }
@@ -144,6 +144,7 @@ enum DataTypes
DATA_PUTRICIDE_TRAP_STATE = 254, DATA_PUTRICIDE_TRAP_STATE = 254,
DATA_HAS_LIMITED_ATTEMPTS = 255, DATA_HAS_LIMITED_ATTEMPTS = 255,
DATA_LK_HC_AVAILABLE = 256, DATA_LK_HC_AVAILABLE = 256,
DATA_SINDRAGOSA_INTRO = 257,
DATA_BPC_TRASH_DIED = 300, DATA_BPC_TRASH_DIED = 300,
}; };
@@ -49,7 +49,8 @@ enum TimedEvents
EVENT_UPDATE_EXECUTION_TIME = 1, EVENT_UPDATE_EXECUTION_TIME = 1,
EVENT_QUAKE_SHATTER = 2, EVENT_QUAKE_SHATTER = 2,
EVENT_REBUILD_PLATFORM = 3, EVENT_REBUILD_PLATFORM = 3,
EVENT_RESPAWN_GUNSHIP = 4 EVENT_RESPAWN_GUNSHIP = 4,
EVENT_RESPAWN_SINDRAGOSA = 5
}; };
enum Spells enum Spells
@@ -140,6 +141,7 @@ Position const JainaSpawnPos = { -48.65278f, 2211.026f, 27.98586f, 3.124139f
Position const MuradinSpawnPos = { -47.34549f, 2208.087f, 27.98586f, 3.106686f }; Position const MuradinSpawnPos = { -47.34549f, 2208.087f, 27.98586f, 3.106686f };
Position const UtherSpawnPos = { -26.58507f, 2211.524f, 30.19898f, 3.124139f }; Position const UtherSpawnPos = { -26.58507f, 2211.524f, 30.19898f, 3.124139f };
Position const SylvanasSpawnPos = { -41.45833f, 2222.891f, 27.98586f, 3.647738f }; Position const SylvanasSpawnPos = { -41.45833f, 2222.891f, 27.98586f, 3.647738f };
Position const SindragosaSpawnPos = { 4818.6997f, 2483.7102f, 287.06497f, 3.286661f };
// Set position traps Spirit Alarm // Set position traps Spirit Alarm
std::vector<Position> GoSpiritAlarm_1 = { { -160.96f, 2210.46f, 35.24f, 0.0f }, { -176.27f, 2201.93f, 35.24f, 0.0f}, { -207.83f, 2207.38f, 35.24f, 0.0f } }; std::vector<Position> GoSpiritAlarm_1 = { { -160.96f, 2210.46f, 35.24f, 0.0f }, { -176.27f, 2201.93f, 35.24f, 0.0f}, { -207.83f, 2207.38f, 35.24f, 0.0f } };
@@ -212,6 +214,7 @@ public:
BloodQuickeningState = NOT_STARTED; BloodQuickeningState = NOT_STARTED;
BloodQuickeningMinutes = 0; BloodQuickeningMinutes = 0;
BloodPrinceTrashCount = 0; BloodPrinceTrashCount = 0;
IsSindragosaIntroDone = false;
} }
void FillInitialWorldStates(WorldPacket& data) override void FillInitialWorldStates(WorldPacket& data) override
@@ -254,6 +257,11 @@ public:
if (GetBossState(DATA_LADY_DEATHWHISPER) == DONE && GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != DONE) if (GetBossState(DATA_LADY_DEATHWHISPER) == DONE && GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != DONE)
SpawnGunship(); SpawnGunship();
if (GetBossState(DATA_SINDRAGOSA) != DONE && IsSindragosaIntroDone && SindragosaGUID.IsEmpty() && Events.GetTimeUntilEvent(EVENT_RESPAWN_SINDRAGOSA) == Milliseconds::max())
{
Events.ScheduleEvent(EVENT_RESPAWN_SINDRAGOSA, 30s);
}
if (IsBuffAvailable) if (IsBuffAvailable)
{ {
SpellAreaForAreaMapBounds saBounds = sSpellMgr->GetSpellAreaForAreaMapBounds(4812); SpellAreaForAreaMapBounds saBounds = sSpellMgr->GetSpellAreaForAreaMapBounds(4812);
@@ -937,6 +945,8 @@ public:
return BloodQuickeningState; return BloodQuickeningState;
case DATA_HEROIC_ATTEMPTS: case DATA_HEROIC_ATTEMPTS:
return HeroicAttempts; return HeroicAttempts;
case DATA_SINDRAGOSA_INTRO:
return (IsSindragosaIntroDone ? 1 : 0);
default: default:
break; break;
} }
@@ -1161,7 +1171,21 @@ public:
if (state == DONE) if (state == DONE)
CheckLichKingAvailability(); CheckLichKingAvailability();
else if (state == FAIL) else if (state == FAIL)
{
IsSindragosaIntroDone = true;
HandleDropAttempt(); HandleDropAttempt();
if (instance->IsHeroic())
{
if (HeroicAttempts)
{
Events.ScheduleEvent(EVENT_RESPAWN_SINDRAGOSA, 30s);
}
}
else
{
Events.ScheduleEvent(EVENT_RESPAWN_SINDRAGOSA, 30s);
}
}
if (state == DONE && !instance->IsHeroic() && LichKingHeroicAvailable) if (state == DONE && !instance->IsHeroic() && LichKingHeroicAvailable)
{ {
LichKingHeroicAvailable = false; LichKingHeroicAvailable = false;
@@ -1626,6 +1650,7 @@ public:
data >> BloodPrinceTrashCount; data >> BloodPrinceTrashCount;
data >> IsBuffAvailable; data >> IsBuffAvailable;
SetData(DATA_BUFF_AVAILABLE, IsBuffAvailable); SetData(DATA_BUFF_AVAILABLE, IsBuffAvailable);
data >> IsSindragosaIntroDone;
} }
void WriteSaveDataMore(std::ostringstream& data) override void WriteSaveDataMore(std::ostringstream& data) override
@@ -1638,7 +1663,8 @@ public:
<< PutricideEventProgress << ' ' << PutricideEventProgress << ' '
<< uint32(LichKingHeroicAvailable ? 1 : 0) << ' ' << uint32(LichKingHeroicAvailable ? 1 : 0) << ' '
<< BloodPrinceTrashCount << ' ' << BloodPrinceTrashCount << ' '
<< uint32(IsBuffAvailable ? 1 : 0); << uint32(IsBuffAvailable ? 1 : 0) << ' '
<< uint32(IsSindragosaIntroDone ? 1 : 0);
} }
void Update(uint32 diff) override void Update(uint32 diff) override
@@ -1679,7 +1705,7 @@ public:
else else
DarkwhisperElevatorTimer -= diff; DarkwhisperElevatorTimer -= diff;
if (BloodQuickeningState != IN_PROGRESS && GetBossState(DATA_THE_LICH_KING) != IN_PROGRESS && GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != FAIL) if (Events.Empty())
return; return;
Events.Update(diff); Events.Update(diff);
@@ -1732,6 +1758,21 @@ public:
case EVENT_RESPAWN_GUNSHIP: case EVENT_RESPAWN_GUNSHIP:
SpawnGunship(); SpawnGunship();
break; break;
case EVENT_RESPAWN_SINDRAGOSA:
if (Creature* sindragosa = instance->SummonCreature(NPC_SINDRAGOSA, SindragosaSpawnPos))
{
sindragosa->setActive(true);
sindragosa->SetDisableGravity(true);
sindragosa->GetMotionMaster()->MovePath(NPC_SINDRAGOSA * 10, true);
if (TempSummon* summon = sindragosa->ToTempSummon())
{
summon->SetTempSummonType(TEMPSUMMON_DEAD_DESPAWN);
}
}
// Could happen more than once if more than one player enters before she respawns.
Events.CancelEvent(EVENT_RESPAWN_SINDRAGOSA);
break;
default: default:
break; break;
} }
@@ -1944,6 +1985,7 @@ public:
bool IsOozeDanceEligible; bool IsOozeDanceEligible;
bool IsNauseaEligible; bool IsNauseaEligible;
bool IsOrbWhispererEligible; bool IsOrbWhispererEligible;
bool IsSindragosaIntroDone;
}; };
InstanceScript* GetInstanceScript(InstanceMap* map) const override InstanceScript* GetInstanceScript(InstanceMap* map) const override