fix(Scripts/HallsOfStone): Rewrite Tribunal of Ages (#24646)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Ludwig <sudlud@users.noreply.github.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Co-authored-by: Xepic90 <13806466+Chinoske@users.noreply.github.com> Co-authored-by: Claude <claude@users.noreply.github.com>
This commit is contained in:
@@ -107,17 +107,19 @@ public:
|
||||
SlugeCount = 0;
|
||||
instance->SetData(DATA_SJONNIR_ACHIEVEMENT, false);
|
||||
|
||||
if (instance->GetData(BOSS_TRIBUNAL_OF_AGES) == DONE)
|
||||
if (instance && instance->GetBossState(BOSS_TRIBUNAL_OF_AGES) == DONE)
|
||||
{
|
||||
if (GameObject* console = me->GetMap()->GetGameObject(instance->GetGuidData(GO_SJONNIR_CONSOLE)))
|
||||
console->SetGoState(GO_STATE_READY);
|
||||
|
||||
if (Creature* brann = ObjectAccessor::GetCreature(*me, instance->GetGuidData(NPC_BRANN)))
|
||||
{
|
||||
brann->setDeathState(DeathState::JustDied);
|
||||
brann->Respawn();
|
||||
brann->AI()->DoAction(ACTION_SJONNIR_WIPE_START);
|
||||
}
|
||||
}
|
||||
|
||||
if (instance && instance->GetBossState(BRANN_DOOR) == DONE)
|
||||
{
|
||||
if (GameObject* doors = me->GetMap()->GetGameObject(instance->GetGuidData(GO_SJONNIR_DOOR)))
|
||||
doors->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
|
||||
ScheduleHealthCheckEvent(75, [&] {
|
||||
@@ -220,7 +222,7 @@ public:
|
||||
if (GameObject* doors = me->GetMap()->GetGameObject(instance->GetGuidData(GO_SJONNIR_DOOR)))
|
||||
doors->SetGoState(GO_STATE_READY);
|
||||
|
||||
if (instance->GetData(BOSS_TRIBUNAL_OF_AGES) == DONE)
|
||||
if (instance && instance->GetBossState(BOSS_TRIBUNAL_OF_AGES) == DONE)
|
||||
if (Creature* brann = ObjectAccessor::GetCreature(*me, instance->GetGuidData(NPC_BRANN)))
|
||||
brann->AI()->DoAction(ACTION_START_SJONNIR_FIGHT);
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -36,6 +36,26 @@ enum Texts
|
||||
SAY_BRANN_SPAWN_OOZE = 7,
|
||||
SAY_BRANN_SPAWN_EARTHEN = 8,
|
||||
SAY_BRANN_EVENT_INTRO_1 = 9,
|
||||
SAY_BRANN_EVENT_INTRO_2 = 10,
|
||||
SAY_BRANN_EVENT_A_1 = 11,
|
||||
SAY_BRANN_EVENT_A_3 = 12,
|
||||
SAY_BRANN_EVENT_B_1 = 13,
|
||||
SAY_BRANN_EVENT_B_3 = 14,
|
||||
SAY_BRANN_EVENT_C_1 = 15,
|
||||
SAY_BRANN_EVENT_C_3 = 16,
|
||||
SAY_BRANN_EVENT_D_1 = 17,
|
||||
SAY_BRANN_EVENT_D_3 = 18,
|
||||
SAY_BRANN_EVENT_END_01 = 19,
|
||||
SAY_BRANN_EVENT_END_02 = 20,
|
||||
SAY_BRANN_EVENT_END_04 = 21,
|
||||
SAY_BRANN_EVENT_END_06 = 22,
|
||||
SAY_BRANN_EVENT_END_08 = 23,
|
||||
SAY_BRANN_EVENT_END_10 = 24,
|
||||
SAY_BRANN_EVENT_END_12 = 25,
|
||||
SAY_BRANN_EVENT_END_14 = 26,
|
||||
SAY_BRANN_EVENT_END_16 = 27,
|
||||
SAY_BRANN_EVENT_END_18 = 28,
|
||||
SAY_BRANN_EVENT_END_20 = 29,
|
||||
SAY_BRANN_VICTORY_SJONNIR_1 = 30,
|
||||
SAY_BRANN_VICTORY_SJONNIR_2 = 31,
|
||||
SAY_BRANN_ENTRANCE_MEET = 32,
|
||||
@@ -47,8 +67,8 @@ enum Encounter
|
||||
BOSS_MAIDEN_OF_GRIEF = 1,
|
||||
BOSS_TRIBUNAL_OF_AGES = 2,
|
||||
BOSS_SJONNIR = 3,
|
||||
BRANN_BRONZEBEARD = 4,
|
||||
BRANN_DOOR = 5,
|
||||
BRANN_BRONZEBEARD = 4, // Escort Event
|
||||
BRANN_DOOR = 5, // Sjonnir's Door
|
||||
MAX_ENCOUNTER = 6,
|
||||
|
||||
DATA_BRANN_ACHIEVEMENT,
|
||||
@@ -82,12 +102,13 @@ enum npcs
|
||||
|
||||
ACTION_START_ESCORT_EVENT = 0,
|
||||
ACTION_START_TRIBUNAL = 1,
|
||||
ACTION_TRIBUNAL_WIPE_START = 2,
|
||||
ACTION_GO_TO_SJONNIR = 3,
|
||||
ACTION_OPEN_DOOR = 4,
|
||||
ACTION_START_SJONNIR_FIGHT = 5,
|
||||
ACTION_SJONNIR_DEAD = 6,
|
||||
ACTION_SJONNIR_WIPE_START = 7,
|
||||
ACTION_GO_TO_SJONNIR = 2,
|
||||
ACTION_OPEN_DOOR = 3,
|
||||
ACTION_START_SJONNIR_FIGHT = 4,
|
||||
ACTION_SJONNIR_DEAD = 5,
|
||||
ACTION_SJONNIR_WIPE_START = 6,
|
||||
ACTION_PLAYER_DEATH_IN_TRIBUNAL = 7,
|
||||
ACTION_SKIP_PHASE = 8,
|
||||
};
|
||||
|
||||
template <class AI, class T>
|
||||
|
||||
@@ -90,7 +90,14 @@ public:
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
{
|
||||
if (Encounter[i] == IN_PROGRESS && i != BRANN_BRONZEBEARD)
|
||||
// The escort is not an encounter, it must not keep the instance locked
|
||||
if (i == BRANN_BRONZEBEARD)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// Krystallus and the Maiden of Grief are tracked through SetData, the rest through boss states
|
||||
if (Encounter[i] == IN_PROGRESS || GetBossState(i) == IN_PROGRESS)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
@@ -98,6 +105,15 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
void OnUnitDeath(Unit* unit) override
|
||||
{
|
||||
if (unit->IsPlayer() && GetBossState(BOSS_TRIBUNAL_OF_AGES) == IN_PROGRESS)
|
||||
{
|
||||
if (Creature* brann = instance->GetCreature(GetGuidData(NPC_BRANN)))
|
||||
brann->AI()->DoAction(ACTION_PLAYER_DEATH_IN_TRIBUNAL);
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go) override
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
@@ -107,7 +123,8 @@ public:
|
||||
break;
|
||||
case GO_ABEDNEUM:
|
||||
goAbedneumGUID = go->GetGUID();
|
||||
if (Encounter[BOSS_TRIBUNAL_OF_AGES] == DONE)
|
||||
// Encounter[] is toggled back and forth by the post event lore, the boss state is the reliable one
|
||||
if (GetBossState(BOSS_TRIBUNAL_OF_AGES) == DONE)
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case GO_MARNAK:
|
||||
@@ -118,7 +135,7 @@ public:
|
||||
break;
|
||||
case GO_SKY_FLOOR:
|
||||
goSkyRoomFloorGUID = go->GetGUID();
|
||||
if (Encounter[BOSS_TRIBUNAL_OF_AGES] == DONE)
|
||||
if (GetBossState(BOSS_TRIBUNAL_OF_AGES) == DONE)
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case GO_SJONNIR_CONSOLE:
|
||||
@@ -126,7 +143,7 @@ public:
|
||||
break;
|
||||
case GO_SJONNIR_DOOR:
|
||||
goSjonnirDoorGUID = go->GetGUID();
|
||||
if (Encounter[BOSS_TRIBUNAL_OF_AGES] == DONE)
|
||||
if (GetBossState(BRANN_DOOR) == DONE)
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
break;
|
||||
case GO_LEFT_PIPE:
|
||||
@@ -146,7 +163,6 @@ public:
|
||||
BrannGUID = creature->GetGUID();
|
||||
break;
|
||||
}
|
||||
|
||||
InstanceScript::OnCreatureCreate(creature);
|
||||
}
|
||||
|
||||
@@ -191,6 +207,7 @@ public:
|
||||
case BOSS_TRIBUNAL_OF_AGES:
|
||||
case BOSS_SJONNIR:
|
||||
case BRANN_BRONZEBEARD:
|
||||
case BRANN_DOOR:
|
||||
return Encounter[id];
|
||||
}
|
||||
|
||||
@@ -308,6 +325,12 @@ public:
|
||||
pSkyRoomFloor->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
|
||||
if (type == BRANN_DOOR && data == DONE)
|
||||
{
|
||||
if (GameObject* pSjonnirDoor = instance->GetGameObject(goSjonnirDoorGUID))
|
||||
pSjonnirDoor->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
|
||||
if (type == DATA_BRANN_ACHIEVEMENT)
|
||||
{
|
||||
brannAchievement = (bool)data;
|
||||
@@ -330,6 +353,7 @@ public:
|
||||
data >> Encounter[2];
|
||||
data >> Encounter[3];
|
||||
data >> Encounter[4];
|
||||
data >> Encounter[5];
|
||||
}
|
||||
|
||||
void WriteSaveDataMore(std::ostringstream& data) override
|
||||
@@ -338,7 +362,8 @@ public:
|
||||
<< Encounter[1] << ' '
|
||||
<< Encounter[2] << ' '
|
||||
<< Encounter[3] << ' '
|
||||
<< Encounter[4] << ' ';
|
||||
<< Encounter[4] << ' '
|
||||
<< Encounter[5] << ' ';
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user