From ea1eed736217069b927087b260578db2ecb7ab13 Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Mon, 3 Apr 2023 00:07:10 -0300 Subject: [PATCH] fix(Scripts/IcecrownCitadel): Script Sindragosa's respawn/waypoints (#15792) --- .../rev_1680488339567265100.sql | 12 +++++ .../IcecrownCitadel/boss_sindragosa.cpp | 41 ++++------------ .../IcecrownCitadel/icecrown_citadel.h | 1 + .../instance_icecrown_citadel.cpp | 48 +++++++++++++++++-- 4 files changed, 67 insertions(+), 35 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1680488339567265100.sql diff --git a/data/sql/updates/pending_db_world/rev_1680488339567265100.sql b/data/sql/updates/pending_db_world/rev_1680488339567265100.sql new file mode 100644 index 000000000..b99893b21 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1680488339567265100.sql @@ -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); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp index bce65ffa0..a507df8ca 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp @@ -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 SpinestalkerFlyPos = {4418.895f, 2514.233f, 230.4864f, 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 SindragosaLandPos = {4419.190f, 2484.570f, 203.3848f, 3.141593f}; Position const SindragosaAirPos = {4475.990f, 2484.430f, 247.9340f, 3.141593f}; @@ -273,7 +272,7 @@ public: 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); } @@ -286,16 +285,9 @@ public: _bombCount = 0; _mysticBuffetStack = 0; _Reset(); - me->DisableRotate(false); - me->SetControlled(false, UNIT_STATE_ROOT); me->SetSpeed(MOVE_RUN, me->GetCreatureTemplate()->speed_run); me->SetReactState(REACT_AGGRESSIVE); me->CastSpell(me, SPELL_TANK_MARKER, true); - - if (!_summoned) - { - me->SetDisableGravity(true); - } } void MoveInLineOfSight(Unit* who) override @@ -359,20 +351,9 @@ public: 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 { - me->DisableRotate(false); - me->SetControlled(false, UNIT_STATE_ROOT); + instance->SetBossState(DATA_SINDRAGOSA, FAIL); BossAI::EnterEvadeMode(why); } @@ -386,10 +367,6 @@ public: { if (action == ACTION_START_FROSTWYRM) { - if (_summoned) - return; - - _summoned = true; if (TempSummon* summon = me->ToTempSummon()) summon->SetTempSummonType(TEMPSUMMON_DEAD_DESPAWN); @@ -403,7 +380,11 @@ public: 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->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: - bool _summoned; uint8 _bombCount; uint8 _mysticBuffetStack; bool _didFirstFlyPhase; @@ -1724,13 +1704,10 @@ public: if (Creature* rimefang = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_RIMEFANG))) 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()); - 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); } } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h index a76c44478..7b52e6ee4 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h @@ -144,6 +144,7 @@ enum DataTypes DATA_PUTRICIDE_TRAP_STATE = 254, DATA_HAS_LIMITED_ATTEMPTS = 255, DATA_LK_HC_AVAILABLE = 256, + DATA_SINDRAGOSA_INTRO = 257, DATA_BPC_TRASH_DIED = 300, }; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp index 7337551a2..458847e0a 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp @@ -49,7 +49,8 @@ enum TimedEvents EVENT_UPDATE_EXECUTION_TIME = 1, EVENT_QUAKE_SHATTER = 2, EVENT_REBUILD_PLATFORM = 3, - EVENT_RESPAWN_GUNSHIP = 4 + EVENT_RESPAWN_GUNSHIP = 4, + EVENT_RESPAWN_SINDRAGOSA = 5 }; 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 UtherSpawnPos = { -26.58507f, 2211.524f, 30.19898f, 3.124139f }; 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 std::vector 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; BloodQuickeningMinutes = 0; BloodPrinceTrashCount = 0; + IsSindragosaIntroDone = false; } void FillInitialWorldStates(WorldPacket& data) override @@ -254,6 +257,11 @@ public: if (GetBossState(DATA_LADY_DEATHWHISPER) == DONE && GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != DONE) SpawnGunship(); + if (GetBossState(DATA_SINDRAGOSA) != DONE && IsSindragosaIntroDone && SindragosaGUID.IsEmpty() && Events.GetTimeUntilEvent(EVENT_RESPAWN_SINDRAGOSA) == Milliseconds::max()) + { + Events.ScheduleEvent(EVENT_RESPAWN_SINDRAGOSA, 30s); + } + if (IsBuffAvailable) { SpellAreaForAreaMapBounds saBounds = sSpellMgr->GetSpellAreaForAreaMapBounds(4812); @@ -937,6 +945,8 @@ public: return BloodQuickeningState; case DATA_HEROIC_ATTEMPTS: return HeroicAttempts; + case DATA_SINDRAGOSA_INTRO: + return (IsSindragosaIntroDone ? 1 : 0); default: break; } @@ -1161,7 +1171,21 @@ public: if (state == DONE) CheckLichKingAvailability(); else if (state == FAIL) + { + IsSindragosaIntroDone = true; 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) { LichKingHeroicAvailable = false; @@ -1626,6 +1650,7 @@ public: data >> BloodPrinceTrashCount; data >> IsBuffAvailable; SetData(DATA_BUFF_AVAILABLE, IsBuffAvailable); + data >> IsSindragosaIntroDone; } void WriteSaveDataMore(std::ostringstream& data) override @@ -1638,7 +1663,8 @@ public: << PutricideEventProgress << ' ' << uint32(LichKingHeroicAvailable ? 1 : 0) << ' ' << BloodPrinceTrashCount << ' ' - << uint32(IsBuffAvailable ? 1 : 0); + << uint32(IsBuffAvailable ? 1 : 0) << ' ' + << uint32(IsSindragosaIntroDone ? 1 : 0); } void Update(uint32 diff) override @@ -1679,7 +1705,7 @@ public: else DarkwhisperElevatorTimer -= diff; - if (BloodQuickeningState != IN_PROGRESS && GetBossState(DATA_THE_LICH_KING) != IN_PROGRESS && GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != FAIL) + if (Events.Empty()) return; Events.Update(diff); @@ -1732,6 +1758,21 @@ public: case EVENT_RESPAWN_GUNSHIP: SpawnGunship(); 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: break; } @@ -1944,6 +1985,7 @@ public: bool IsOozeDanceEligible; bool IsNauseaEligible; bool IsOrbWhispererEligible; + bool IsSindragosaIntroDone; }; InstanceScript* GetInstanceScript(InstanceMap* map) const override