From c1ac635bea626c14aac65c8c4a7c4028166898f1 Mon Sep 17 00:00:00 2001 From: Jerom Venneker Date: Fri, 6 Jun 2025 14:42:42 +0200 Subject: [PATCH] Added PostLoadGame hook, so item synching hooks can get fired after they've been subscribed to in hook handlers --- .../Enhancements/game-interactor/GameInteractor_HookTable.h | 1 + soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp | 4 ++++ soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h | 1 + soh/soh/Network/Archipelago/Archipelago.cpp | 2 +- soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c | 1 + 5 files changed, 8 insertions(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h b/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h index d9cbc13b9..416d38d7a 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h @@ -8,6 +8,7 @@ DEFINE_HOOK(OnZTitleInit, (void* gameState)); DEFINE_HOOK(OnZTitleUpdate, (void* gameState)); DEFINE_HOOK(OnLoadGame, (int32_t fileNum)); +DEFINE_HOOK(PostLoadGame, (int32_t fileNum)); DEFINE_HOOK(OnExitGame, (int32_t fileNum)); DEFINE_HOOK(OnGameStateMainStart, ()); DEFINE_HOOK(OnGameFrameUpdate, ()); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp index dcbfb8a18..931906ccf 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp @@ -14,6 +14,10 @@ void GameInteractor_ExecuteOnLoadGame(int32_t fileNum) { GameInteractor::Instance->ExecuteHooks(fileNum); } +void GameInteractor_ExecutePostLoadGame(int32_t fileNum) { + GameInteractor::Instance->ExecuteHooks(fileNum); +} + void GameInteractor_ExecuteOnExitGame(int32_t fileNum) { GameInteractor::Instance->ExecuteHooks(fileNum); } diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h index 99128907f..110fdbc58 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h @@ -11,6 +11,7 @@ extern "C" { void GameInteractor_ExecuteOnZTitleInit(void* gameState); void GameInteractor_ExecuteOnZTitleUpdate(void* gameState); void GameInteractor_ExecuteOnLoadGame(int32_t fileNum); +void GameInteractor_ExecutePostLoadGame(int32_t fileNum); void GameInteractor_ExecuteOnExitGame(int32_t fileNum); void GameInteractor_ExecuteOnGameStateMainStart(); void GameInteractor_ExecuteOnGameFrameUpdate(); diff --git a/soh/soh/Network/Archipelago/Archipelago.cpp b/soh/soh/Network/Archipelago/Archipelago.cpp index 87b101162..656c27670 100644 --- a/soh/soh/Network/Archipelago/Archipelago.cpp +++ b/soh/soh/Network/Archipelago/Archipelago.cpp @@ -530,7 +530,7 @@ void RegisterArchipelago() { CVarSetInteger(CVAR_REMOTE_ARCHIPELAGO("Connected"), 0); COND_HOOK(GameInteractor::OnGameFrameUpdate, true, [](){ArchipelagoClient::GetInstance().Poll();}); - COND_HOOK(GameInteractor::OnLoadGame, true, [](int32_t file_id){ArchipelagoClient::GetInstance().GameLoaded();}); + COND_HOOK(GameInteractor::PostLoadGame, true, [](int32_t file_id){ArchipelagoClient::GetInstance().GameLoaded();}); COND_HOOK(GameInteractor::OnRandomizerItemGivenHooks, IS_ARCHIPELAGO, [](uint32_t rc, GetItemEntry gi, uint8_t isGiSkipped) { if (rc == RC_ARCHIPELAGO_RECEIVED_ITEM) { diff --git a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c index 61c50c48e..8098c552b 100644 --- a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c +++ b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c @@ -3417,6 +3417,7 @@ void FileChoose_LoadGame(GameState* thisx) { gSaveContext.naviTimer = 0; GameInteractor_ExecuteOnLoadGame(gSaveContext.fileNum); + GameInteractor_ExecutePostLoadGame(gSaveContext.fileNum); } static void (*gSelectModeUpdateFuncs[])(GameState*) = {