mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-18 19:35:42 +00:00
fix(Scripts/IcecrownCitadel): Script Sindragosa's respawn/waypoints (#15792)
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user