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:
Gultask
2026-08-01 20:13:54 -03:00
committed by GitHub
parent ba9f57ab79
commit acdb1b0224
5 changed files with 1058 additions and 808 deletions
@@ -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] << ' ';
}
};
};