Use exact decorated symbol names verified against Minecraft.Client.pdb

Verified all hook targets exist in the compiled game's PDB:
- ?MinecraftWorld_RunStaticCtors@@YAXXZ
- ?tick@Minecraft@@QEAAX_N0@Z
- ?init@Minecraft@@QEAAXXZ
- ?ExitGame@CConsoleMinecraftApp@@UEAAXXZ (replaces destroy which is inlined)

Minecraft::destroy/run_end/stop are not public symbols (likely inlined),
so the shutdown hook now targets CConsoleMinecraftApp::ExitGame instead.
This commit is contained in:
Jacobwasbeast
2026-03-06 15:16:06 -06:00
parent de22a24100
commit 65ef99fc11
6 changed files with 67 additions and 95 deletions

View File

@@ -5,18 +5,18 @@
namespace GameHooks
{
RunStaticCtors_fn Original_RunStaticCtors = nullptr;
MinecraftTick_fn Original_MinecraftTick = nullptr;
MinecraftInit_fn Original_MinecraftInit = nullptr;
MinecraftDestroy_fn Original_MinecraftDestroy = nullptr;
MinecraftTick_fn Original_MinecraftTick = nullptr;
MinecraftInit_fn Original_MinecraftInit = nullptr;
ExitGame_fn Original_ExitGame = nullptr;
void Hooked_RunStaticCtors()
{
printf("[LegacyForge] RunStaticCtors hook fired -- calling PreInit\n");
printf("[LegacyForge] Hook: RunStaticCtors -- calling PreInit\n");
DotNetHost::CallPreInit();
Original_RunStaticCtors();
printf("[LegacyForge] RunStaticCtors complete -- calling Init\n");
printf("[LegacyForge] Hook: RunStaticCtors complete -- calling Init\n");
DotNetHost::CallInit();
}
@@ -34,15 +34,15 @@ namespace GameHooks
{
Original_MinecraftInit(thisPtr);
printf("[LegacyForge] Minecraft::init complete -- calling PostInit\n");
printf("[LegacyForge] Hook: Minecraft::init complete -- calling PostInit\n");
DotNetHost::CallPostInit();
}
void __fastcall Hooked_MinecraftDestroy(void* thisPtr)
void __fastcall Hooked_ExitGame(void* thisPtr)
{
printf("[LegacyForge] Minecraft::destroy -- calling Shutdown\n");
printf("[LegacyForge] Hook: ExitGame -- calling Shutdown\n");
DotNetHost::CallShutdown();
Original_MinecraftDestroy(thisPtr);
Original_ExitGame(thisPtr);
}
}