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

View File

@@ -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);
}
}

View File

@@ -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,
};

View File

@@ -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<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;
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