fix(Scripts/HoR): fix HoR escape event outro and refactor tracking (#25287)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
+17
-33
@@ -1499,7 +1499,6 @@ enum eFightEvents
|
|||||||
EVENT_LK_SUMMON_LA,
|
EVENT_LK_SUMMON_LA,
|
||||||
EVENT_LK_SUMMON_NEXT_ICE_WALL,
|
EVENT_LK_SUMMON_NEXT_ICE_WALL,
|
||||||
EVENT_SAY_OPENING,
|
EVENT_SAY_OPENING,
|
||||||
EVENT_DECREASE_REQ_COUNT_BY_100,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct npc_hor_lich_king : public NullCreatureAI
|
struct npc_hor_lich_king : public NullCreatureAI
|
||||||
@@ -1515,13 +1514,14 @@ struct npc_hor_lich_king : public NullCreatureAI
|
|||||||
EventMap events;
|
EventMap events;
|
||||||
SummonList summons;
|
SummonList summons;
|
||||||
uint8 currentWall;
|
uint8 currentWall;
|
||||||
uint8 reqKillCount;
|
uint8 summonsCount;
|
||||||
uint8 div2;
|
uint8 div2;
|
||||||
|
|
||||||
void Reset() override
|
void Reset() override
|
||||||
{
|
{
|
||||||
currentWall = 0;
|
currentWall = 0;
|
||||||
reqKillCount = 0;
|
summonsCount = 0;
|
||||||
|
div2 = 0;
|
||||||
events.Reset();
|
events.Reset();
|
||||||
events.RescheduleEvent(EVENT_LK_CHECK_COMBAT, 1s);
|
events.RescheduleEvent(EVENT_LK_CHECK_COMBAT, 1s);
|
||||||
}
|
}
|
||||||
@@ -1529,11 +1529,10 @@ struct npc_hor_lich_king : public NullCreatureAI
|
|||||||
{
|
{
|
||||||
if (action == ACTION_START_LK_FIGHT_REAL)
|
if (action == ACTION_START_LK_FIGHT_REAL)
|
||||||
events.ScheduleEvent(EVENT_LK_START_FOLLOWING, 1500ms);
|
events.ScheduleEvent(EVENT_LK_START_FOLLOWING, 1500ms);
|
||||||
else if ((action == ACTION_INFORM_TRASH_DIED && reqKillCount) || action == ACTION_CHECK_TRASH_DIED)
|
}
|
||||||
|
|
||||||
|
void WallCompleted()
|
||||||
{
|
{
|
||||||
if ((action == ACTION_CHECK_TRASH_DIED && reqKillCount == 0) || (action == ACTION_INFORM_TRASH_DIED && (--reqKillCount) == 0))
|
|
||||||
{
|
|
||||||
events.CancelEvent(EVENT_DECREASE_REQ_COUNT_BY_100); // just in case, magic happens sometimes
|
|
||||||
++currentWall;
|
++currentWall;
|
||||||
instance->SetData(ACTION_DELETE_ICE_WALL, 1);
|
instance->SetData(ACTION_DELETE_ICE_WALL, 1);
|
||||||
if (currentWall <= 3)
|
if (currentWall <= 3)
|
||||||
@@ -1546,8 +1545,6 @@ struct npc_hor_lich_king : public NullCreatureAI
|
|||||||
if (Creature* c = instance->GetCreature(NPC_SYLVANAS_PART2))
|
if (Creature* c = instance->GetCreature(NPC_SYLVANAS_PART2))
|
||||||
c->AI()->DoAction(ACTION_INFORM_WALL_DESTROYED);
|
c->AI()->DoAction(ACTION_INFORM_WALL_DESTROYED);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MovementInform(uint32 type, uint32 /*id*/) override
|
void MovementInform(uint32 type, uint32 /*id*/) override
|
||||||
{
|
{
|
||||||
@@ -1569,17 +1566,14 @@ struct npc_hor_lich_king : public NullCreatureAI
|
|||||||
else if (currentWall == 4)
|
else if (currentWall == 4)
|
||||||
{
|
{
|
||||||
Talk(SAY_LK_NOWHERE_TO_RUN);
|
Talk(SAY_LK_NOWHERE_TO_RUN);
|
||||||
instance->SetData(DATA_LICH_KING, DONE);
|
instance->SetBossState(DATA_LICH_KING, DONE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void JustSummoned(Creature* s) override
|
void JustSummoned(Creature* s) override
|
||||||
{
|
{
|
||||||
|
++summonsCount;
|
||||||
++reqKillCount;
|
|
||||||
if (events.HasTimeUntilEvent(EVENT_DECREASE_REQ_COUNT_BY_100))
|
|
||||||
events.RescheduleEvent(EVENT_DECREASE_REQ_COUNT_BY_100, 10s);
|
|
||||||
summons.Summon(s);
|
summons.Summon(s);
|
||||||
s->SetHomePosition(PathWaypoints[WP_STOP[currentWall + 1]]);
|
s->SetHomePosition(PathWaypoints[WP_STOP[currentWall + 1]]);
|
||||||
s->GetMotionMaster()->MovePoint(0, PathWaypoints[WP_STOP[currentWall + 1]]);
|
s->GetMotionMaster()->MovePoint(0, PathWaypoints[WP_STOP[currentWall + 1]]);
|
||||||
@@ -1592,6 +1586,14 @@ struct npc_hor_lich_king : public NullCreatureAI
|
|||||||
s->SetHomePosition(PathWaypoints[WP_STOP[currentWall + 1]]);
|
s->SetHomePosition(PathWaypoints[WP_STOP[currentWall + 1]]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) override
|
||||||
|
{
|
||||||
|
if (!summonsCount)
|
||||||
|
return;
|
||||||
|
if (--summonsCount == 0)
|
||||||
|
WallCompleted();
|
||||||
|
}
|
||||||
|
|
||||||
void SummonedCreatureDespawn(Creature* s) override
|
void SummonedCreatureDespawn(Creature* s) override
|
||||||
{
|
{
|
||||||
summons.Despawn(s);
|
summons.Despawn(s);
|
||||||
@@ -1623,7 +1625,7 @@ struct npc_hor_lich_king : public NullCreatureAI
|
|||||||
{
|
{
|
||||||
me->GetMotionMaster()->MovementExpired();
|
me->GetMotionMaster()->MovementExpired();
|
||||||
me->StopMoving();
|
me->StopMoving();
|
||||||
reqKillCount = 255;
|
summonsCount = 255;
|
||||||
leader->InterruptNonMeleeSpells(true);
|
leader->InterruptNonMeleeSpells(true);
|
||||||
me->CastSpell(leader, SPELL_HARVEST_SOUL);
|
me->CastSpell(leader, SPELL_HARVEST_SOUL);
|
||||||
events.ScheduleEvent(EVENT_LK_KILL_LEADER, 3s);
|
events.ScheduleEvent(EVENT_LK_KILL_LEADER, 3s);
|
||||||
@@ -1720,15 +1722,6 @@ struct npc_hor_lich_king : public NullCreatureAI
|
|||||||
events.ScheduleEvent(EVENT_LK_SUMMON_LA, 17s + 700ms);
|
events.ScheduleEvent(EVENT_LK_SUMMON_LA, 17s + 700ms);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (currentWall <= 3)
|
|
||||||
{
|
|
||||||
reqKillCount = 100;
|
|
||||||
events.RescheduleEvent(EVENT_DECREASE_REQ_COUNT_BY_100, 10s);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case EVENT_DECREASE_REQ_COUNT_BY_100:
|
|
||||||
reqKillCount = (reqKillCount <= 100 ? 0 : reqKillCount - 100);
|
|
||||||
DoAction(ACTION_CHECK_TRASH_DIED);
|
|
||||||
break;
|
break;
|
||||||
case EVENT_LK_SUMMON_GHOULS:
|
case EVENT_LK_SUMMON_GHOULS:
|
||||||
DoCastAOE(SPELL_SUMMON_RAGING_GHOULS);
|
DoCastAOE(SPELL_SUMMON_RAGING_GHOULS);
|
||||||
@@ -2003,9 +1996,6 @@ struct npc_hor_raging_ghoul : public ScriptedAI
|
|||||||
void JustDied(Unit* /*killer*/) override
|
void JustDied(Unit* /*killer*/) override
|
||||||
{
|
{
|
||||||
me->SetCorpseDelay(10);
|
me->SetCorpseDelay(10);
|
||||||
if (InstanceScript* instance = me->GetInstanceScript())
|
|
||||||
if (Creature* lichKing = instance->GetCreature(NPC_LICH_KING_BOSS))
|
|
||||||
lichKing->AI()->DoAction(ACTION_INFORM_TRASH_DIED);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2059,9 +2049,6 @@ struct npc_hor_risen_witch_doctor : public ScriptedAI
|
|||||||
void JustDied(Unit* /*killer*/) override
|
void JustDied(Unit* /*killer*/) override
|
||||||
{
|
{
|
||||||
me->SetCorpseDelay(10);
|
me->SetCorpseDelay(10);
|
||||||
if (InstanceScript* instance = me->GetInstanceScript())
|
|
||||||
if (Creature* lichKing = instance->GetCreature(NPC_LICH_KING_BOSS))
|
|
||||||
lichKing->AI()->DoAction(ACTION_INFORM_TRASH_DIED);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2110,9 +2097,6 @@ struct npc_hor_lumbering_abomination : public ScriptedAI
|
|||||||
void JustDied(Unit* /*killer*/) override
|
void JustDied(Unit* /*killer*/) override
|
||||||
{
|
{
|
||||||
me->SetCorpseDelay(10);
|
me->SetCorpseDelay(10);
|
||||||
if (InstanceScript* instance = me->GetInstanceScript())
|
|
||||||
if (Creature* lichKing = instance->GetCreature(NPC_LICH_KING_BOSS))
|
|
||||||
lichKing->AI()->DoAction(ACTION_INFORM_TRASH_DIED);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -27,14 +27,22 @@
|
|||||||
|
|
||||||
enum Data
|
enum Data
|
||||||
{
|
{
|
||||||
DATA_INTRO,
|
// Boss encounters (indices for SetBossState)
|
||||||
DATA_FALRIC,
|
DATA_FALRIC,
|
||||||
DATA_MARWYN,
|
DATA_MARWYN,
|
||||||
|
DATA_LICH_KING,
|
||||||
|
MAX_ENCOUNTER,
|
||||||
|
|
||||||
|
// Non-boss data (SetData/GetData only)
|
||||||
|
DATA_INTRO,
|
||||||
DATA_FROSTSWORN_GENERAL,
|
DATA_FROSTSWORN_GENERAL,
|
||||||
DATA_LK_INTRO,
|
DATA_LK_INTRO,
|
||||||
DATA_LICH_KING,
|
|
||||||
DATA_BATTERED_HILT,
|
DATA_BATTERED_HILT,
|
||||||
MAX_ENCOUNTER,
|
DATA_WAVE_NUMBER,
|
||||||
|
DATA_LK_BATTLE,
|
||||||
|
DATA_SHIP_CAPTAIN,
|
||||||
|
|
||||||
|
// Actions
|
||||||
ACTION_SHOW_TRASH,
|
ACTION_SHOW_TRASH,
|
||||||
ACTION_SPIRITUAL_REFLECTIONS_COPY,
|
ACTION_SPIRITUAL_REFLECTIONS_COPY,
|
||||||
ACTION_SPIRITUAL_REFLECTIONS_ACTIVATE,
|
ACTION_SPIRITUAL_REFLECTIONS_ACTIVATE,
|
||||||
@@ -42,9 +50,6 @@ enum Data
|
|||||||
ACTION_START_LK_FIGHT,
|
ACTION_START_LK_FIGHT,
|
||||||
ACTION_STOP_LK_FIGHT,
|
ACTION_STOP_LK_FIGHT,
|
||||||
ACTION_DELETE_ICE_WALL,
|
ACTION_DELETE_ICE_WALL,
|
||||||
DATA_WAVE_NUMBER,
|
|
||||||
DATA_LK_BATTLE,// in progress
|
|
||||||
DATA_SHIP_CAPTAIN,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum Creatures
|
enum Creatures
|
||||||
@@ -249,8 +254,6 @@ enum hMisc
|
|||||||
ACTION_START_INTRO,
|
ACTION_START_INTRO,
|
||||||
ACTION_SKIP_INTRO,
|
ACTION_SKIP_INTRO,
|
||||||
ACTION_START_LK_FIGHT_REAL,
|
ACTION_START_LK_FIGHT_REAL,
|
||||||
ACTION_INFORM_TRASH_DIED,
|
|
||||||
ACTION_CHECK_TRASH_DIED,
|
|
||||||
ACTION_INFORM_WALL_DESTROYED,
|
ACTION_INFORM_WALL_DESTROYED,
|
||||||
|
|
||||||
QUEST_DELIVRANCE_FROM_THE_PIT_A2 = 24710,
|
QUEST_DELIVRANCE_FROM_THE_PIT_A2 = 24710,
|
||||||
|
|||||||
+2
-3
@@ -468,6 +468,7 @@ public:
|
|||||||
leader->AI()->DoAction(ACTION_START_INTRO);
|
leader->AI()->DoAction(ACTION_START_INTRO);
|
||||||
break;
|
break;
|
||||||
case ACTION_START_LK_FIGHT:
|
case ACTION_START_LK_FIGHT:
|
||||||
|
SetBossState(DATA_LICH_KING, IN_PROGRESS);
|
||||||
_isLichKingFightActive = true;
|
_isLichKingFightActive = true;
|
||||||
DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_RETREATING_TIMED_EVENT);
|
DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_RETREATING_TIMED_EVENT);
|
||||||
DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_RETREATING_TIMED_EVENT);
|
DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_RETREATING_TIMED_EVENT);
|
||||||
@@ -516,15 +517,13 @@ public:
|
|||||||
lichKing->SetSpeed(MOVE_RUN, lichKing->GetCreatureTemplate()->speed_run);
|
lichKing->SetSpeed(MOVE_RUN, lichKing->GetCreatureTemplate()->speed_run);
|
||||||
}
|
}
|
||||||
_isLichKingFightActive = false;
|
_isLichKingFightActive = false;
|
||||||
|
SetBossState(DATA_LICH_KING, FAIL);
|
||||||
_outroTimer = 0;
|
_outroTimer = 0;
|
||||||
_outroStep = 0;
|
_outroStep = 0;
|
||||||
[[fallthrough]];
|
[[fallthrough]];
|
||||||
case ACTION_DELETE_ICE_WALL:
|
case ACTION_DELETE_ICE_WALL:
|
||||||
HandleGameObject(GO_ICE_WALL, true);
|
HandleGameObject(GO_ICE_WALL, true);
|
||||||
break;
|
break;
|
||||||
case DATA_LICH_KING:
|
|
||||||
SetBossState(DATA_LICH_KING, static_cast<EncounterState>(data));
|
|
||||||
break;
|
|
||||||
case DATA_BATTERED_HILT:
|
case DATA_BATTERED_HILT:
|
||||||
{
|
{
|
||||||
if (GetPersistentData(PERSISTENT_DATA_BATTERED_HILT))
|
if (GetPersistentData(PERSISTENT_DATA_BATTERED_HILT))
|
||||||
|
|||||||
Reference in New Issue
Block a user