fix(Scripts/IcecrownCitadel): Script Sindragosa's respawn/waypoints (#15792)
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user