diff --git a/WeaveLoaderRuntime/CMakeLists.txt b/WeaveLoaderRuntime/CMakeLists.txt index 2a570db..c0c8aa8 100644 --- a/WeaveLoaderRuntime/CMakeLists.txt +++ b/WeaveLoaderRuntime/CMakeLists.txt @@ -83,6 +83,7 @@ add_library(WeaveLoaderRuntime SHARED src/PdbParser.cpp src/SymbolRegistry.cpp src/SymbolResolver.cpp + src/Symbols/SymbolGroups.cpp src/HookManager.cpp src/HookRegistry.cpp src/GameHooks.cpp @@ -106,6 +107,7 @@ add_library(WeaveLoaderRuntime SHARED target_include_directories(WeaveLoaderRuntime PRIVATE "${NETHOST_INCLUDE_DIR}" "${STB_DIR}" + "${CMAKE_CURRENT_SOURCE_DIR}/src" ) target_link_libraries(WeaveLoaderRuntime PRIVATE diff --git a/WeaveLoaderRuntime/src/HookManager.cpp b/WeaveLoaderRuntime/src/HookManager.cpp index af38de4..b05ce1d 100644 --- a/WeaveLoaderRuntime/src/HookManager.cpp +++ b/WeaveLoaderRuntime/src/HookManager.cpp @@ -20,18 +20,18 @@ bool HookManager::Install(const SymbolResolver& symbols) return false; } - WorldIdRemap::SetTagNewTagSymbol(symbols.pTagNewTag); - WorldIdRemap::SetTileArraySymbol(symbols.pTileTiles); + WorldIdRemap::SetTagNewTagSymbol(symbols.Nbt.pTagNewTag); + WorldIdRemap::SetTileArraySymbol(symbols.Tile.pTileTiles); WorldIdRemap::SetLevelChunkTileSymbols( - symbols.pLevelChunkGetTile, - symbols.pLevelChunkSetTile, - symbols.pLevelChunkGetPos, - symbols.pLevelChunkGetHighestNonEmptyY); - WorldIdRemap::SetCompressedTileStorageSetSymbol(symbols.pCompressedTileStorageSet); + symbols.Level.pLevelChunkGetTile, + symbols.Level.pLevelChunkSetTile, + symbols.Level.pLevelChunkGetPos, + symbols.Level.pLevelChunkGetHighestNonEmptyY); + WorldIdRemap::SetCompressedTileStorageSetSymbol(symbols.Level.pCompressedTileStorageSet); - if (symbols.pRunStaticCtors) + if (symbols.Core.pRunStaticCtors) { - if (MH_CreateHook(symbols.pRunStaticCtors, + if (MH_CreateHook(symbols.Core.pRunStaticCtors, reinterpret_cast(&GameHooks::Hooked_RunStaticCtors), reinterpret_cast(&GameHooks::Original_RunStaticCtors)) != MH_OK) { @@ -41,9 +41,9 @@ bool HookManager::Install(const SymbolResolver& symbols) LogUtil::Log("[WeaveLoader] Hooked RunStaticCtors"); } - if (symbols.pMinecraftTick) + if (symbols.Core.pMinecraftTick) { - if (MH_CreateHook(symbols.pMinecraftTick, + if (MH_CreateHook(symbols.Core.pMinecraftTick, reinterpret_cast(&GameHooks::Hooked_MinecraftTick), reinterpret_cast(&GameHooks::Original_MinecraftTick)) != MH_OK) { @@ -53,9 +53,9 @@ bool HookManager::Install(const SymbolResolver& symbols) LogUtil::Log("[WeaveLoader] Hooked Minecraft::tick"); } - if (symbols.pMinecraftInit) + if (symbols.Core.pMinecraftInit) { - if (MH_CreateHook(symbols.pMinecraftInit, + if (MH_CreateHook(symbols.Core.pMinecraftInit, reinterpret_cast(&GameHooks::Hooked_MinecraftInit), reinterpret_cast(&GameHooks::Original_MinecraftInit)) != MH_OK) { @@ -65,9 +65,9 @@ bool HookManager::Install(const SymbolResolver& symbols) LogUtil::Log("[WeaveLoader] Hooked Minecraft::init"); } - if (symbols.pMinecraftSetLevel) + if (symbols.Core.pMinecraftSetLevel) { - if (MH_CreateHook(symbols.pMinecraftSetLevel, + if (MH_CreateHook(symbols.Core.pMinecraftSetLevel, reinterpret_cast(&GameHooks::Hooked_MinecraftSetLevel), reinterpret_cast(&GameHooks::Original_MinecraftSetLevel)) != MH_OK) { @@ -79,9 +79,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pItemInstanceMineBlock) + if (symbols.Item.pItemInstanceMineBlock) { - if (MH_CreateHook(symbols.pItemInstanceMineBlock, + if (MH_CreateHook(symbols.Item.pItemInstanceMineBlock, reinterpret_cast(&GameHooks::Hooked_ItemInstanceMineBlock), reinterpret_cast(&GameHooks::Original_ItemInstanceMineBlock)) != MH_OK) { @@ -93,9 +93,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pItemInstanceSave) + if (symbols.Item.pItemInstanceSave) { - if (MH_CreateHook(symbols.pItemInstanceSave, + if (MH_CreateHook(symbols.Item.pItemInstanceSave, reinterpret_cast(&GameHooks::Hooked_ItemInstanceSave), reinterpret_cast(&GameHooks::Original_ItemInstanceSave)) != MH_OK) { @@ -107,9 +107,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pItemInstanceLoad) + if (symbols.Item.pItemInstanceLoad) { - if (MH_CreateHook(symbols.pItemInstanceLoad, + if (MH_CreateHook(symbols.Item.pItemInstanceLoad, reinterpret_cast(&GameHooks::Hooked_ItemInstanceLoad), reinterpret_cast(&GameHooks::Original_ItemInstanceLoad)) != MH_OK) { @@ -121,9 +121,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pItemInstanceGetIcon) + if (symbols.Item.pItemInstanceGetIcon) { - if (MH_CreateHook(symbols.pItemInstanceGetIcon, + if (MH_CreateHook(symbols.Item.pItemInstanceGetIcon, reinterpret_cast(&GameHooks::Hooked_ItemInstanceGetIcon), reinterpret_cast(&GameHooks::Original_ItemInstanceGetIcon)) != MH_OK) { @@ -135,9 +135,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pEntityRendererBindTextureResource) + if (symbols.Texture.pEntityRendererBindTextureResource) { - if (MH_CreateHook(symbols.pEntityRendererBindTextureResource, + if (MH_CreateHook(symbols.Texture.pEntityRendererBindTextureResource, reinterpret_cast(&GameHooks::Hooked_EntityRendererBindTextureResource), reinterpret_cast(&GameHooks::Original_EntityRendererBindTextureResource)) != MH_OK) { @@ -149,9 +149,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pItemRendererRenderItemBillboard) + if (symbols.Texture.pItemRendererRenderItemBillboard) { - if (MH_CreateHook(symbols.pItemRendererRenderItemBillboard, + if (MH_CreateHook(symbols.Texture.pItemRendererRenderItemBillboard, reinterpret_cast(&GameHooks::Hooked_ItemRendererRenderItemBillboard), reinterpret_cast(&GameHooks::Original_ItemRendererRenderItemBillboard)) != MH_OK) { @@ -163,9 +163,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pCompassTextureCycleFrames) + if (symbols.Texture.pCompassTextureCycleFrames) { - if (MH_CreateHook(symbols.pCompassTextureCycleFrames, + if (MH_CreateHook(symbols.Texture.pCompassTextureCycleFrames, reinterpret_cast(&GameHooks::Hooked_CompassTextureCycleFrames), reinterpret_cast(&GameHooks::Original_CompassTextureCycleFrames)) != MH_OK) { @@ -177,9 +177,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pClockTextureCycleFrames) + if (symbols.Texture.pClockTextureCycleFrames) { - if (MH_CreateHook(symbols.pClockTextureCycleFrames, + if (MH_CreateHook(symbols.Texture.pClockTextureCycleFrames, reinterpret_cast(&GameHooks::Hooked_ClockTextureCycleFrames), reinterpret_cast(&GameHooks::Original_ClockTextureCycleFrames)) != MH_OK) { @@ -191,9 +191,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pCompassTextureGetSourceWidth) + if (symbols.Texture.pCompassTextureGetSourceWidth) { - if (MH_CreateHook(symbols.pCompassTextureGetSourceWidth, + if (MH_CreateHook(symbols.Texture.pCompassTextureGetSourceWidth, reinterpret_cast(&GameHooks::Hooked_CompassTextureGetSourceWidth), reinterpret_cast(&GameHooks::Original_CompassTextureGetSourceWidth)) != MH_OK) { @@ -205,9 +205,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pCompassTextureGetSourceHeight) + if (symbols.Texture.pCompassTextureGetSourceHeight) { - if (MH_CreateHook(symbols.pCompassTextureGetSourceHeight, + if (MH_CreateHook(symbols.Texture.pCompassTextureGetSourceHeight, reinterpret_cast(&GameHooks::Hooked_CompassTextureGetSourceHeight), reinterpret_cast(&GameHooks::Original_CompassTextureGetSourceHeight)) != MH_OK) { @@ -219,9 +219,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pClockTextureGetSourceWidth) + if (symbols.Texture.pClockTextureGetSourceWidth) { - if (MH_CreateHook(symbols.pClockTextureGetSourceWidth, + if (MH_CreateHook(symbols.Texture.pClockTextureGetSourceWidth, reinterpret_cast(&GameHooks::Hooked_ClockTextureGetSourceWidth), reinterpret_cast(&GameHooks::Original_ClockTextureGetSourceWidth)) != MH_OK) { @@ -233,9 +233,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pClockTextureGetSourceHeight) + if (symbols.Texture.pClockTextureGetSourceHeight) { - if (MH_CreateHook(symbols.pClockTextureGetSourceHeight, + if (MH_CreateHook(symbols.Texture.pClockTextureGetSourceHeight, reinterpret_cast(&GameHooks::Hooked_ClockTextureGetSourceHeight), reinterpret_cast(&GameHooks::Original_ClockTextureGetSourceHeight)) != MH_OK) { @@ -247,9 +247,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pItemMineBlock) + if (symbols.Item.pItemMineBlock) { - if (MH_CreateHook(symbols.pItemMineBlock, + if (MH_CreateHook(symbols.Item.pItemMineBlock, reinterpret_cast(&GameHooks::Hooked_ItemMineBlock), reinterpret_cast(&GameHooks::Original_ItemMineBlock)) != MH_OK) { @@ -261,9 +261,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pDiggerItemMineBlock) + if (symbols.Item.pDiggerItemMineBlock) { - if (MH_CreateHook(symbols.pDiggerItemMineBlock, + if (MH_CreateHook(symbols.Item.pDiggerItemMineBlock, reinterpret_cast(&GameHooks::Hooked_DiggerItemMineBlock), reinterpret_cast(&GameHooks::Original_DiggerItemMineBlock)) != MH_OK) { @@ -275,9 +275,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pPickaxeItemGetDestroySpeed) + if (symbols.Item.pPickaxeItemGetDestroySpeed) { - if (MH_CreateHook(symbols.pPickaxeItemGetDestroySpeed, + if (MH_CreateHook(symbols.Item.pPickaxeItemGetDestroySpeed, reinterpret_cast(&GameHooks::Hooked_PickaxeItemGetDestroySpeed), reinterpret_cast(&GameHooks::Original_PickaxeItemGetDestroySpeed)) != MH_OK) { @@ -289,9 +289,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pPickaxeItemCanDestroySpecial) + if (symbols.Item.pPickaxeItemCanDestroySpecial) { - if (MH_CreateHook(symbols.pPickaxeItemCanDestroySpecial, + if (MH_CreateHook(symbols.Item.pPickaxeItemCanDestroySpecial, reinterpret_cast(&GameHooks::Hooked_PickaxeItemCanDestroySpecial), reinterpret_cast(&GameHooks::Original_PickaxeItemCanDestroySpecial)) != MH_OK) { @@ -303,9 +303,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pShovelItemGetDestroySpeed) + if (symbols.Item.pShovelItemGetDestroySpeed) { - if (MH_CreateHook(symbols.pShovelItemGetDestroySpeed, + if (MH_CreateHook(symbols.Item.pShovelItemGetDestroySpeed, reinterpret_cast(&GameHooks::Hooked_ShovelItemGetDestroySpeed), reinterpret_cast(&GameHooks::Original_ShovelItemGetDestroySpeed)) != MH_OK) { @@ -317,9 +317,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pShovelItemCanDestroySpecial) + if (symbols.Item.pShovelItemCanDestroySpecial) { - if (MH_CreateHook(symbols.pShovelItemCanDestroySpecial, + if (MH_CreateHook(symbols.Item.pShovelItemCanDestroySpecial, reinterpret_cast(&GameHooks::Hooked_ShovelItemCanDestroySpecial), reinterpret_cast(&GameHooks::Original_ShovelItemCanDestroySpecial)) != MH_OK) { @@ -331,9 +331,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pLevelSetTileAndData) + if (symbols.Level.pLevelSetTileAndData) { - if (MH_CreateHook(symbols.pLevelSetTileAndData, + if (MH_CreateHook(symbols.Level.pLevelSetTileAndData, reinterpret_cast(&GameHooks::Hooked_LevelSetTileAndData), reinterpret_cast(&GameHooks::Original_LevelSetTileAndData)) != MH_OK) { @@ -345,9 +345,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pLevelSetData) + if (symbols.Level.pLevelSetData) { - if (MH_CreateHook(symbols.pLevelSetData, + if (MH_CreateHook(symbols.Level.pLevelSetData, reinterpret_cast(&GameHooks::Hooked_LevelSetData), reinterpret_cast(&GameHooks::Original_LevelSetData)) != MH_OK) { @@ -359,9 +359,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pLevelUpdateNeighborsAt) + if (symbols.Level.pLevelUpdateNeighborsAt) { - if (MH_CreateHook(symbols.pLevelUpdateNeighborsAt, + if (MH_CreateHook(symbols.Level.pLevelUpdateNeighborsAt, reinterpret_cast(&GameHooks::Hooked_LevelUpdateNeighborsAt), reinterpret_cast(&GameHooks::Original_LevelUpdateNeighborsAt)) != MH_OK) { @@ -373,9 +373,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pServerLevelTickPendingTicks) + if (symbols.Level.pServerLevelTickPendingTicks) { - if (MH_CreateHook(symbols.pServerLevelTickPendingTicks, + if (MH_CreateHook(symbols.Level.pServerLevelTickPendingTicks, reinterpret_cast(&GameHooks::Hooked_ServerLevelTickPendingTicks), reinterpret_cast(&GameHooks::Original_ServerLevelTickPendingTicks)) != MH_OK) { @@ -387,9 +387,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pMcRegionChunkStorageLoad) + if (symbols.Level.pMcRegionChunkStorageLoad) { - if (MH_CreateHook(symbols.pMcRegionChunkStorageLoad, + if (MH_CreateHook(symbols.Level.pMcRegionChunkStorageLoad, reinterpret_cast(&GameHooks::Hooked_McRegionChunkStorageLoad), reinterpret_cast(&GameHooks::Original_McRegionChunkStorageLoad)) != MH_OK) { @@ -401,9 +401,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pMcRegionChunkStorageSave) + if (symbols.Level.pMcRegionChunkStorageSave) { - if (MH_CreateHook(symbols.pMcRegionChunkStorageSave, + if (MH_CreateHook(symbols.Level.pMcRegionChunkStorageSave, reinterpret_cast(&GameHooks::Hooked_McRegionChunkStorageSave), reinterpret_cast(&GameHooks::Original_McRegionChunkStorageSave)) != MH_OK) { @@ -415,9 +415,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pTileGetResource) + if (symbols.Tile.pTileGetResource) { - if (MH_CreateHook(symbols.pTileGetResource, + if (MH_CreateHook(symbols.Tile.pTileGetResource, reinterpret_cast(&GameHooks::Hooked_TileGetResource), reinterpret_cast(&GameHooks::Original_TileGetResource)) != MH_OK) { @@ -429,9 +429,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pTileCloneTileId) + if (symbols.Tile.pTileCloneTileId) { - if (MH_CreateHook(symbols.pTileCloneTileId, + if (MH_CreateHook(symbols.Tile.pTileCloneTileId, reinterpret_cast(&GameHooks::Hooked_TileCloneTileId), reinterpret_cast(&GameHooks::Original_TileCloneTileId)) != MH_OK) { @@ -443,9 +443,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pStoneSlabGetTexture) + if (symbols.Tile.pStoneSlabGetTexture) { - if (MH_CreateHook(symbols.pStoneSlabGetTexture, + if (MH_CreateHook(symbols.Tile.pStoneSlabGetTexture, reinterpret_cast(&GameHooks::Hooked_StoneSlabGetTexture), reinterpret_cast(&GameHooks::Original_StoneSlabGetTexture)) != MH_OK) { @@ -457,9 +457,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pWoodSlabGetTexture) + if (symbols.Tile.pWoodSlabGetTexture) { - if (MH_CreateHook(symbols.pWoodSlabGetTexture, + if (MH_CreateHook(symbols.Tile.pWoodSlabGetTexture, reinterpret_cast(&GameHooks::Hooked_WoodSlabGetTexture), reinterpret_cast(&GameHooks::Original_WoodSlabGetTexture)) != MH_OK) { @@ -471,9 +471,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pStoneSlabGetResource) + if (symbols.Tile.pStoneSlabGetResource) { - if (MH_CreateHook(symbols.pStoneSlabGetResource, + if (MH_CreateHook(symbols.Tile.pStoneSlabGetResource, reinterpret_cast(&GameHooks::Hooked_StoneSlabGetResource), reinterpret_cast(&GameHooks::Original_StoneSlabGetResource)) != MH_OK) { @@ -485,9 +485,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pWoodSlabGetResource) + if (symbols.Tile.pWoodSlabGetResource) { - if (MH_CreateHook(symbols.pWoodSlabGetResource, + if (MH_CreateHook(symbols.Tile.pWoodSlabGetResource, reinterpret_cast(&GameHooks::Hooked_WoodSlabGetResource), reinterpret_cast(&GameHooks::Original_WoodSlabGetResource)) != MH_OK) { @@ -499,9 +499,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pStoneSlabGetDescriptionId) + if (symbols.Tile.pStoneSlabGetDescriptionId) { - if (MH_CreateHook(symbols.pStoneSlabGetDescriptionId, + if (MH_CreateHook(symbols.Tile.pStoneSlabGetDescriptionId, reinterpret_cast(&GameHooks::Hooked_StoneSlabGetDescriptionId), reinterpret_cast(&GameHooks::Original_StoneSlabGetDescriptionId)) != MH_OK) { @@ -513,9 +513,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pWoodSlabGetDescriptionId) + if (symbols.Tile.pWoodSlabGetDescriptionId) { - if (MH_CreateHook(symbols.pWoodSlabGetDescriptionId, + if (MH_CreateHook(symbols.Tile.pWoodSlabGetDescriptionId, reinterpret_cast(&GameHooks::Hooked_WoodSlabGetDescriptionId), reinterpret_cast(&GameHooks::Original_WoodSlabGetDescriptionId)) != MH_OK) { @@ -527,9 +527,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pStoneSlabGetAuxName) + if (symbols.Tile.pStoneSlabGetAuxName) { - if (MH_CreateHook(symbols.pStoneSlabGetAuxName, + if (MH_CreateHook(symbols.Tile.pStoneSlabGetAuxName, reinterpret_cast(&GameHooks::Hooked_StoneSlabGetAuxName), reinterpret_cast(&GameHooks::Original_StoneSlabGetAuxName)) != MH_OK) { @@ -541,9 +541,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pWoodSlabGetAuxName) + if (symbols.Tile.pWoodSlabGetAuxName) { - if (MH_CreateHook(symbols.pWoodSlabGetAuxName, + if (MH_CreateHook(symbols.Tile.pWoodSlabGetAuxName, reinterpret_cast(&GameHooks::Hooked_WoodSlabGetAuxName), reinterpret_cast(&GameHooks::Original_WoodSlabGetAuxName)) != MH_OK) { @@ -555,9 +555,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pStoneSlabRegisterIcons) + if (symbols.Tile.pStoneSlabRegisterIcons) { - if (MH_CreateHook(symbols.pStoneSlabRegisterIcons, + if (MH_CreateHook(symbols.Tile.pStoneSlabRegisterIcons, reinterpret_cast(&GameHooks::Hooked_StoneSlabRegisterIcons), reinterpret_cast(&GameHooks::Original_StoneSlabRegisterIcons)) != MH_OK) { @@ -565,14 +565,14 @@ bool HookManager::Install(const SymbolResolver& symbols) } else { - MH_EnableHook(symbols.pStoneSlabRegisterIcons); + MH_EnableHook(symbols.Tile.pStoneSlabRegisterIcons); LogUtil::Log("[WeaveLoader] Hooked StoneSlabTile::registerIcons (custom slabs)"); } } - if (symbols.pWoodSlabRegisterIcons) + if (symbols.Tile.pWoodSlabRegisterIcons) { - if (MH_CreateHook(symbols.pWoodSlabRegisterIcons, + if (MH_CreateHook(symbols.Tile.pWoodSlabRegisterIcons, reinterpret_cast(&GameHooks::Hooked_WoodSlabRegisterIcons), reinterpret_cast(&GameHooks::Original_WoodSlabRegisterIcons)) != MH_OK) { @@ -580,14 +580,14 @@ bool HookManager::Install(const SymbolResolver& symbols) } else { - MH_EnableHook(symbols.pWoodSlabRegisterIcons); + MH_EnableHook(symbols.Tile.pWoodSlabRegisterIcons); LogUtil::Log("[WeaveLoader] Hooked WoodSlabTile::registerIcons (custom slabs)"); } } - if (symbols.pHalfSlabCloneTileId) + if (symbols.Tile.pHalfSlabCloneTileId) { - if (MH_CreateHook(symbols.pHalfSlabCloneTileId, + if (MH_CreateHook(symbols.Tile.pHalfSlabCloneTileId, reinterpret_cast(&GameHooks::Hooked_HalfSlabCloneTileId), reinterpret_cast(&GameHooks::Original_HalfSlabCloneTileId)) != MH_OK) { @@ -599,9 +599,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pStoneSlabItemGetDescriptionId) + if (symbols.Tile.pStoneSlabItemGetDescriptionId) { - if (MH_CreateHook(symbols.pStoneSlabItemGetDescriptionId, + if (MH_CreateHook(symbols.Tile.pStoneSlabItemGetDescriptionId, reinterpret_cast(&GameHooks::Hooked_StoneSlabItemGetDescriptionId), reinterpret_cast(&GameHooks::Original_StoneSlabItemGetDescriptionId)) != MH_OK) { @@ -613,9 +613,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pStoneSlabItemGetIcon) + if (symbols.Tile.pStoneSlabItemGetIcon) { - if (MH_CreateHook(symbols.pStoneSlabItemGetIcon, + if (MH_CreateHook(symbols.Tile.pStoneSlabItemGetIcon, reinterpret_cast(&GameHooks::Hooked_StoneSlabItemGetIcon), reinterpret_cast(&GameHooks::Original_StoneSlabItemGetIcon)) != MH_OK) { @@ -627,9 +627,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pPlayerCanDestroy) + if (symbols.Entity.pPlayerCanDestroy) { - if (MH_CreateHook(symbols.pPlayerCanDestroy, + if (MH_CreateHook(symbols.Entity.pPlayerCanDestroy, reinterpret_cast(&GameHooks::Hooked_PlayerCanDestroy), reinterpret_cast(&GameHooks::Original_PlayerCanDestroy)) != MH_OK) { @@ -641,9 +641,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pServerPlayerGameModeUseItem) + if (symbols.Entity.pServerPlayerGameModeUseItem) { - if (MH_CreateHook(symbols.pServerPlayerGameModeUseItem, + if (MH_CreateHook(symbols.Entity.pServerPlayerGameModeUseItem, reinterpret_cast(&GameHooks::Hooked_ServerPlayerGameModeUseItem), reinterpret_cast(&GameHooks::Original_ServerPlayerGameModeUseItem)) != MH_OK) { @@ -655,9 +655,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pMultiPlayerGameModeUseItem) + if (symbols.Entity.pMultiPlayerGameModeUseItem) { - if (MH_CreateHook(symbols.pMultiPlayerGameModeUseItem, + if (MH_CreateHook(symbols.Entity.pMultiPlayerGameModeUseItem, reinterpret_cast(&GameHooks::Hooked_MultiPlayerGameModeUseItem), reinterpret_cast(&GameHooks::Original_MultiPlayerGameModeUseItem)) != MH_OK) { @@ -669,24 +669,24 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - GameHooks::SetAtlasLocationPointers(symbols.pTextureAtlasLocationBlocks, symbols.pTextureAtlasLocationItems); - GameHooks::SetTileTilesArray(symbols.pTileTiles); - GameHooks::SetBlockHelperSymbols(symbols.pTileGetTextureFaceData); - GameHooks::SetManagedBlockDispatchSymbols(symbols.pLevelGetTile); + GameHooks::SetAtlasLocationPointers(symbols.Texture.pTextureAtlasLocationBlocks, symbols.Texture.pTextureAtlasLocationItems); + GameHooks::SetTileTilesArray(symbols.Tile.pTileTiles); + GameHooks::SetBlockHelperSymbols(symbols.Tile.pTileGetTextureFaceData); + GameHooks::SetManagedBlockDispatchSymbols(symbols.Level.pLevelGetTile); NativeExports::SetLevelInteropSymbols( - symbols.pLevelHasNeighborSignal, - symbols.pLevelSetTileAndData, - symbols.pServerLevelAddToTickNextTick ? symbols.pServerLevelAddToTickNextTick - : symbols.pLevelAddToTickNextTick, - symbols.pLevelGetTile); + symbols.Level.pLevelHasNeighborSignal, + symbols.Level.pLevelSetTileAndData, + symbols.Level.pServerLevelAddToTickNextTick ? symbols.Level.pServerLevelAddToTickNextTick + : symbols.Level.pLevelAddToTickNextTick, + symbols.Level.pLevelGetTile); NativeExports::SetLocalizationSymbols( - symbols.pMinecraftApp, - symbols.pGetMinecraftLanguage, - symbols.pGetMinecraftLocale); + symbols.Core.pMinecraftApp, + symbols.Core.pGetMinecraftLanguage, + symbols.Core.pGetMinecraftLocale); - if (symbols.pTexturesBindTextureResource) + if (symbols.Texture.pTexturesBindTextureResource) { - if (MH_CreateHook(symbols.pTexturesBindTextureResource, + if (MH_CreateHook(symbols.Texture.pTexturesBindTextureResource, reinterpret_cast(&GameHooks::Hooked_TexturesBindTextureResource), reinterpret_cast(&GameHooks::Original_TexturesBindTextureResource)) != MH_OK) { @@ -698,9 +698,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pTexturesLoadTextureByName) + if (symbols.Texture.pTexturesLoadTextureByName) { - if (MH_CreateHook(symbols.pTexturesLoadTextureByName, + if (MH_CreateHook(symbols.Texture.pTexturesLoadTextureByName, reinterpret_cast(&GameHooks::Hooked_TexturesLoadTextureByName), reinterpret_cast(&GameHooks::Original_TexturesLoadTextureByName)) != MH_OK) { @@ -712,9 +712,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pTexturesLoadTextureByIndex) + if (symbols.Texture.pTexturesLoadTextureByIndex) { - if (MH_CreateHook(symbols.pTexturesLoadTextureByIndex, + if (MH_CreateHook(symbols.Texture.pTexturesLoadTextureByIndex, reinterpret_cast(&GameHooks::Hooked_TexturesLoadTextureByIndex), reinterpret_cast(&GameHooks::Original_TexturesLoadTextureByIndex)) != MH_OK) { @@ -726,9 +726,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pTexturesReadImage) + if (symbols.Texture.pTexturesReadImage) { - if (MH_CreateHook(symbols.pTexturesReadImage, + if (MH_CreateHook(symbols.Texture.pTexturesReadImage, reinterpret_cast(&GameHooks::Hooked_TexturesReadImage), reinterpret_cast(&GameHooks::Original_TexturesReadImage)) != MH_OK) { @@ -740,9 +740,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pTextureManagerCreateTexture) + if (symbols.Texture.pTextureManagerCreateTexture) { - if (MH_CreateHook(symbols.pTextureManagerCreateTexture, + if (MH_CreateHook(symbols.Texture.pTextureManagerCreateTexture, reinterpret_cast(&GameHooks::Hooked_TextureManagerCreateTexture), reinterpret_cast(&GameHooks::Original_TextureManagerCreateTexture)) != MH_OK) { @@ -754,9 +754,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pTextureTransferFromImage) + if (symbols.Texture.pTextureTransferFromImage) { - if (MH_CreateHook(symbols.pTextureTransferFromImage, + if (MH_CreateHook(symbols.Texture.pTextureTransferFromImage, reinterpret_cast(&GameHooks::Hooked_TextureTransferFromImage), reinterpret_cast(&GameHooks::Original_TextureTransferFromImage)) != MH_OK) { @@ -768,9 +768,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pAbstractTexturePackGetImageResource) + if (symbols.Resource.pAbstractTexturePackGetImageResource) { - if (MH_CreateHook(symbols.pAbstractTexturePackGetImageResource, + if (MH_CreateHook(symbols.Resource.pAbstractTexturePackGetImageResource, reinterpret_cast(&GameHooks::Hooked_AbstractTexturePackGetImageResource), reinterpret_cast(&GameHooks::Original_AbstractTexturePackGetImageResource)) != MH_OK) { @@ -782,9 +782,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pDLCTexturePackGetImageResource) + if (symbols.Resource.pDLCTexturePackGetImageResource) { - if (MH_CreateHook(symbols.pDLCTexturePackGetImageResource, + if (MH_CreateHook(symbols.Resource.pDLCTexturePackGetImageResource, reinterpret_cast(&GameHooks::Hooked_DLCTexturePackGetImageResource), reinterpret_cast(&GameHooks::Original_DLCTexturePackGetImageResource)) != MH_OK) { @@ -799,36 +799,36 @@ bool HookManager::Install(const SymbolResolver& symbols) // BufferedImage constructor hooks disabled: the work is now handled in // Textures::readImage for stability during boot. - if (symbols.pStitchedGetU0) + if (symbols.Texture.pStitchedGetU0) { - if (MH_CreateHook(symbols.pStitchedGetU0, + if (MH_CreateHook(symbols.Texture.pStitchedGetU0, reinterpret_cast(&GameHooks::Hooked_StitchedGetU0), reinterpret_cast(&GameHooks::Original_StitchedGetU0)) != MH_OK) { LogUtil::Log("[WeaveLoader] Warning: Failed to hook StitchedTexture::getU0"); } } - if (symbols.pStitchedGetU1) + if (symbols.Texture.pStitchedGetU1) { - if (MH_CreateHook(symbols.pStitchedGetU1, + if (MH_CreateHook(symbols.Texture.pStitchedGetU1, reinterpret_cast(&GameHooks::Hooked_StitchedGetU1), reinterpret_cast(&GameHooks::Original_StitchedGetU1)) != MH_OK) { LogUtil::Log("[WeaveLoader] Warning: Failed to hook StitchedTexture::getU1"); } } - if (symbols.pStitchedGetV0) + if (symbols.Texture.pStitchedGetV0) { - if (MH_CreateHook(symbols.pStitchedGetV0, + if (MH_CreateHook(symbols.Texture.pStitchedGetV0, reinterpret_cast(&GameHooks::Hooked_StitchedGetV0), reinterpret_cast(&GameHooks::Original_StitchedGetV0)) != MH_OK) { LogUtil::Log("[WeaveLoader] Warning: Failed to hook StitchedTexture::getV0"); } } - if (symbols.pStitchedGetV1) + if (symbols.Texture.pStitchedGetV1) { - if (MH_CreateHook(symbols.pStitchedGetV1, + if (MH_CreateHook(symbols.Texture.pStitchedGetV1, reinterpret_cast(&GameHooks::Hooked_StitchedGetV1), reinterpret_cast(&GameHooks::Original_StitchedGetV1)) != MH_OK) { @@ -836,9 +836,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pExitGame) + if (symbols.Core.pExitGame) { - if (MH_CreateHook(symbols.pExitGame, + if (MH_CreateHook(symbols.Core.pExitGame, reinterpret_cast(&GameHooks::Hooked_ExitGame), reinterpret_cast(&GameHooks::Original_ExitGame)) != MH_OK) { @@ -853,23 +853,23 @@ bool HookManager::Install(const SymbolResolver& symbols) GameObjectFactory::ResolveSymbols(const_cast(symbols)); FurnaceRecipeRegistry::ResolveSymbols(const_cast(symbols)); GameHooks::SetSummonSymbols( - symbols.pLevelAddEntity, - symbols.pEntityIONewById, - symbols.pEntityMoveTo, - symbols.pEntitySetPos); + symbols.Entity.pLevelAddEntity, + symbols.Entity.pEntityIONewById, + symbols.Entity.pEntityMoveTo, + symbols.Entity.pEntitySetPos); GameHooks::SetUseActionSymbols( - symbols.pInventoryRemoveResource, - symbols.pInventoryVtable, - symbols.pItemInstanceHurtAndBreak, - symbols.pAbstractContainerMenuBroadcastChanges, - symbols.pEntityGetLookAngle, - symbols.pLivingEntityGetViewVector, - symbols.pEntityLerpMotion, - symbols.pEntitySetPos); + symbols.Inventory.pInventoryRemoveResource, + symbols.Inventory.pInventoryVtable, + symbols.Item.pItemInstanceHurtAndBreak, + symbols.Inventory.pAbstractContainerMenuBroadcastChanges, + symbols.Entity.pEntityGetLookAngle, + symbols.Entity.pLivingEntityGetViewVector, + symbols.Entity.pEntityLerpMotion, + symbols.Entity.pEntitySetPos); - if (symbols.pPreStitchedTextureMapStitch) + if (symbols.Texture.pPreStitchedTextureMapStitch) { - if (MH_CreateHook(symbols.pPreStitchedTextureMapStitch, + if (MH_CreateHook(symbols.Texture.pPreStitchedTextureMapStitch, reinterpret_cast(&GameHooks::Hooked_PreStitchedTextureMapStitch), reinterpret_cast(&GameHooks::Original_PreStitchedTextureMapStitch)) != MH_OK) { @@ -881,10 +881,10 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pLoadUVs && symbols.pSimpleIconCtor && symbols.pOperatorNew) + if (symbols.Texture.pLoadUVs && symbols.Texture.pSimpleIconCtor && symbols.Texture.pOperatorNew) { - ModAtlas::SetInjectSymbols(symbols.pSimpleIconCtor, symbols.pOperatorNew); - if (MH_CreateHook(symbols.pLoadUVs, + ModAtlas::SetInjectSymbols(symbols.Texture.pSimpleIconCtor, symbols.Texture.pOperatorNew); + if (MH_CreateHook(symbols.Texture.pLoadUVs, reinterpret_cast(&GameHooks::Hooked_LoadUVs), reinterpret_cast(&GameHooks::Original_LoadUVs)) != MH_OK) { @@ -895,9 +895,9 @@ bool HookManager::Install(const SymbolResolver& symbols) LogUtil::Log("[WeaveLoader] Hooked PreStitchedTextureMap::loadUVs (mod texture injection)"); } - if (symbols.pRegisterIcon) + if (symbols.Texture.pRegisterIcon) { - if (MH_CreateHook(symbols.pRegisterIcon, + if (MH_CreateHook(symbols.Texture.pRegisterIcon, reinterpret_cast(&GameHooks::Hooked_RegisterIcon), reinterpret_cast(&GameHooks::Original_RegisterIcon)) != MH_OK) { @@ -912,16 +912,16 @@ bool HookManager::Install(const SymbolResolver& symbols) } } } - else if (symbols.pLoadUVs) + else if (symbols.Texture.pLoadUVs) { LogUtil::Log("[WeaveLoader] Mod texture injection unavailable: SimpleIcon/operator new not resolved"); } - if (symbols.pCreativeStaticCtor) + if (symbols.Ui.pCreativeStaticCtor) { CreativeInventory::ResolveSymbols(const_cast(symbols)); - if (MH_CreateHook(symbols.pCreativeStaticCtor, + if (MH_CreateHook(symbols.Ui.pCreativeStaticCtor, reinterpret_cast(&GameHooks::Hooked_CreativeStaticCtor), reinterpret_cast(&GameHooks::Original_CreativeStaticCtor)) != MH_OK) { @@ -933,9 +933,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pMainMenuCustomDraw) + if (symbols.Ui.pMainMenuCustomDraw) { - if (MH_CreateHook(symbols.pMainMenuCustomDraw, + if (MH_CreateHook(symbols.Ui.pMainMenuCustomDraw, reinterpret_cast(&GameHooks::Hooked_MainMenuCustomDraw), reinterpret_cast(&GameHooks::Original_MainMenuCustomDraw)) != MH_OK) { @@ -947,11 +947,11 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pPresent) + if (symbols.Core.pPresent) { MainMenuOverlay::ResolveSymbols(const_cast(symbols)); - if (MH_CreateHook(symbols.pPresent, + if (MH_CreateHook(symbols.Core.pPresent, reinterpret_cast(&GameHooks::Hooked_Present), reinterpret_cast(&GameHooks::Original_Present)) != MH_OK) { @@ -963,12 +963,12 @@ bool HookManager::Install(const SymbolResolver& symbols) } } - if (symbols.pGetString) + if (symbols.Ui.pGetString) { // Read GetString prologue bytes BEFORE MinHook overwrites them. - ModStrings::CaptureStringTableRef(symbols.pGetString); + ModStrings::CaptureStringTableRef(symbols.Ui.pGetString); - if (MH_CreateHook(symbols.pGetString, + if (MH_CreateHook(symbols.Ui.pGetString, reinterpret_cast(&GameHooks::Hooked_GetString), reinterpret_cast(&GameHooks::Original_GetString)) != MH_OK) { @@ -981,9 +981,9 @@ bool HookManager::Install(const SymbolResolver& symbols) } - if (symbols.pGetResourceAsStream) + if (symbols.Resource.pGetResourceAsStream) { - if (MH_CreateHook(symbols.pGetResourceAsStream, + if (MH_CreateHook(symbols.Resource.pGetResourceAsStream, reinterpret_cast(&GameHooks::Hooked_GetResourceAsStream), reinterpret_cast(&GameHooks::Original_GetResourceAsStream)) != MH_OK) { diff --git a/WeaveLoaderRuntime/src/SymbolResolver.cpp b/WeaveLoaderRuntime/src/SymbolResolver.cpp index c874672..967d9c1 100644 --- a/WeaveLoaderRuntime/src/SymbolResolver.cpp +++ b/WeaveLoaderRuntime/src/SymbolResolver.cpp @@ -51,123 +51,6 @@ static void RunQueuedExtensiveSymbolScanAndExit() ExitProcess(0); } -static const char* SYM_RUN_STATIC_CTORS = "?MinecraftWorld_RunStaticCtors@@YAXXZ"; -static const char* SYM_MINECRAFT_TICK = "?tick@Minecraft@@QEAAX_N0@Z"; -static const char* SYM_MINECRAFT_INIT = "?init@Minecraft@@QEAAXXZ"; -static const char* SYM_EXIT_GAME = "?ExitGame@CConsoleMinecraftApp@@UEAAXXZ"; -static const char* SYM_CREATIVE_STATIC_CTOR = "?staticCtor@IUIScene_CreativeMenu@@SAXXZ"; -static const char* SYM_MAINMENU_CUSTOMDRAW = "?customDraw@UIScene_MainMenu@@UEAAXPEAUIggyCustomDrawCallbackRegion@@@Z"; -static const char* SYM_PRESENT = "?Present@C4JRender@@QEAAXXZ"; -static const char* SYM_GET_STRING = "?GetString@CMinecraftApp@@SAPEB_WH@Z"; -static const char* SYM_GET_RESOURCE_AS_STREAM = "?getResourceAsStream@InputStream@@SAPEAV1@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@Z"; -static const char* SYM_LOAD_UVS = "?loadUVs@PreStitchedTextureMap@@AEAAXXZ"; -static const char* SYM_PRESTITCHED_STITCH = "?stitch@PreStitchedTextureMap@@QEAAXXZ"; -static const char* SYM_SIMPLE_ICON_CTOR = "??0SimpleIcon@@QEAA@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@0MMMM@Z"; -static const char* SYM_OPERATOR_NEW = "??2@YAPEAX_K@Z"; -static const char* SYM_REGISTER_ICON = "?registerIcon@PreStitchedTextureMap@@UEAAPEAVIcon@@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@Z"; -static const char* SYM_ITEMINSTANCE_GETICON = "?getIcon@ItemInstance@@QEAAPEAVIcon@@XZ"; -static const char* SYM_ENTITYRENDERER_BINDTEXTURE_RESOURCE = "?bindTexture@EntityRenderer@@MEAAXPEAVResourceLocation@@@Z"; -static const char* SYM_ITEMRENDERER_RENDERITEMBILLBOARD = "?renderItemBillboard@ItemRenderer@@EEAAXV?$shared_ptr@VItemEntity@@@std@@PEAVIcon@@HMMMM@Z"; -static const char* SYM_COMPASS_CYCLEFRAMES = "?cycleFrames@CompassTexture@@UEAAXXZ"; -static const char* SYM_CLOCK_CYCLEFRAMES = "?cycleFrames@ClockTexture@@UEAAXXZ"; -static const char* SYM_COMPASS_GETSOURCEWIDTH = "?getSourceWidth@CompassTexture@@UEBAHXZ"; -static const char* SYM_COMPASS_GETSOURCEHEIGHT = "?getSourceHeight@CompassTexture@@UEBAHXZ"; -static const char* SYM_CLOCK_GETSOURCEWIDTH = "?getSourceWidth@ClockTexture@@UEBAHXZ"; -static const char* SYM_CLOCK_GETSOURCEHEIGHT = "?getSourceHeight@ClockTexture@@UEBAHXZ"; -static const char* SYM_ITEMINSTANCE_MINEBLOCK = "?mineBlock@ItemInstance@@QEAAXPEAVLevel@@HHHHV?$shared_ptr@VPlayer@@@std@@@Z"; -static const char* SYM_ITEMINSTANCE_SAVE = "?save@ItemInstance@@QEAAPEAVCompoundTag@@PEAV2@@Z"; -static const char* SYM_ITEMINSTANCE_LOAD = "?load@ItemInstance@@QEAAXPEAVCompoundTag@@@Z"; -static const char* SYM_TAG_NEWTAG = "?newTag@Tag@@SAPEAV1@EAEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@Z"; -static const char* SYM_ITEM_MINEBLOCK = "?mineBlock@Item@@UEAA_NV?$shared_ptr@VItemInstance@@@std@@PEAVLevel@@HHHHV?$shared_ptr@VLivingEntity@@@3@@Z"; -static const char* SYM_DIGGERITEM_MINEBLOCK = "?mineBlock@DiggerItem@@UEAA_NV?$shared_ptr@VItemInstance@@@std@@PEAVLevel@@HHHHV?$shared_ptr@VLivingEntity@@@3@@Z"; -static const char* SYM_PICKAXEITEM_GETDESTROYSPEED = "?getDestroySpeed@PickaxeItem@@UEAAMV?$shared_ptr@VItemInstance@@@std@@PEAVTile@@@Z"; -static const char* SYM_PICKAXEITEM_CANDESTROYSPECIAL = "?canDestroySpecial@PickaxeItem@@UEAA_NPEAVTile@@@Z"; -static const char* SYM_SHOVELITEM_GETDESTROYSPEED = "?getDestroySpeed@ShovelItem@@UEAAMV?$shared_ptr@VItemInstance@@@std@@PEAVTile@@@Z"; -static const char* SYM_SHOVELITEM_CANDESTROYSPECIAL = "?canDestroySpecial@ShovelItem@@UEAA_NPEAVTile@@@Z"; -static const char* SYM_TILE_ONPLACE = "?onPlace@Tile@@UEAAXPEAVLevel@@HHH@Z"; -static const char* SYM_TILE_NEIGHBORCHANGED = "?neighborChanged@Tile@@UEAAXPEAVLevel@@HHHH@Z"; -static const char* SYM_TILE_TICK = "?tick@Tile@@UEAAXPEAVLevel@@HHHPEAVRandom@@@Z"; -static const char* SYM_LEVEL_UPDATE_NEIGHBORS_AT = "?updateNeighborsAt@Level@@QEAAXHHHH@Z"; -static const char* SYM_SERVERLEVEL_TICKPENDINGTICKS = "?tickPendingTicks@ServerLevel@@UEAA_N_N@Z"; -static const char* SYM_LEVEL_GETTILE = "?getTile@Level@@UEAAHHHH@Z"; -static const char* SYM_LEVEL_SETDATA = "?setData@Level@@UEAA_NHHHHH_N@Z"; -static const char* SYM_MCREGIONCHUNKSTORAGE_LOAD = "?load@McRegionChunkStorage@@UEAAPEAVLevelChunk@@PEAVLevel@@HH@Z"; -static const char* SYM_MCREGIONCHUNKSTORAGE_SAVE = "?save@McRegionChunkStorage@@UEAAXPEAVLevel@@PEAVLevelChunk@@@Z"; -static const char* SYM_TILE_GETRESOURCE = "?getResource@Tile@@UEAAHHPEAVRandom@@H@Z"; -static const char* SYM_TILE_CLONETILEID = "?cloneTileId@Tile@@UEAAHPEAVLevel@@HHH@Z"; -static const char* SYM_TILE_GETTEXTURE_FACEDATA = "?getTexture@Tile@@UEAAPEAVIcon@@HH@Z"; -static const char* SYM_STONESLAB_GETTEXTURE = "?getTexture@StoneSlabTile@@UEAAPEAVIcon@@HH@Z"; -static const char* SYM_WOODSLAB_GETTEXTURE = "?getTexture@WoodSlabTile@@UEAAPEAVIcon@@HH@Z"; -static const char* SYM_STONESLAB_GETRESOURCE = "?getResource@StoneSlabTile@@UEAAHHPEAVRandom@@H@Z"; -static const char* SYM_WOODSLAB_GETRESOURCE = "?getResource@WoodSlabTile@@UEAAHHPEAVRandom@@H@Z"; -static const char* SYM_STONESLAB_GETDESCRIPTIONID = "?getDescriptionId@StoneSlabTile@@UEAAIH@Z"; -static const char* SYM_WOODSLAB_GETDESCRIPTIONID = "?getDescriptionId@WoodSlabTile@@UEAAIH@Z"; -static const char* SYM_STONESLAB_GETAUXNAME = "?getAuxName@StoneSlabTile@@UEAAHH@Z"; -static const char* SYM_WOODSLAB_GETAUXNAME = "?getAuxName@WoodSlabTile@@UEAAHH@Z"; -static const char* SYM_STONESLAB_REGISTERICONS = "?registerIcons@StoneSlabTile@@UEAAXPEAVIconRegister@@@Z"; -static const char* SYM_WOODSLAB_REGISTERICONS = "?registerIcons@WoodSlabTile@@UEAAXPEAVIconRegister@@@Z"; -static const char* SYM_STONESLABITEM_GETICON = "?getIcon@StoneSlabTileItem@@UEAAPEAVIcon@@H@Z"; -static const char* SYM_STONESLABITEM_GETDESCRIPTIONID = "?getDescriptionId@StoneSlabTileItem@@UEAAIV?$shared_ptr@VItemInstance@@@std@@@Z"; -static const char* SYM_HALFSLAB_CLONETILEID = "?cloneTileId@HalfSlabTile@@UEAAHPEAVLevel@@HHH@Z"; -static const char* SYM_PLAYER_CANDESTROY = "?canDestroy@Player@@QEAA_NPEAVTile@@@Z"; -static const char* SYM_SERVER_PLAYER_GAMEMODE_USEITEM = "?useItem@ServerPlayerGameMode@@QEAA_NV?$shared_ptr@VPlayer@@@std@@PEAVLevel@@V?$shared_ptr@VItemInstance@@@3@_N@Z"; -static const char* SYM_MULTI_PLAYER_GAMEMODE_USEITEM = "?useItem@MultiPlayerGameMode@@UEAA_NV?$shared_ptr@VPlayer@@@std@@PEAVLevel@@V?$shared_ptr@VItemInstance@@@3@_N@Z"; -static const char* SYM_TEXTURES_BIND_RESOURCE = "?bindTexture@Textures@@QEAAXPEAVResourceLocation@@@Z"; -static const char* SYM_TEXTURES_LOAD_BY_NAME = "?loadTexture@Textures@@AEAAHW4_TEXTURE_NAME@@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@Z"; -static const char* SYM_TEXTURES_LOAD_BY_INDEX_PUBLIC = "?loadTexture@Textures@@QEAAHH@Z"; -static const char* SYM_TEXTURES_LOAD_BY_INDEX_PRIVATE = "?loadTexture@Textures@@AEAAHH@Z"; -static const char* SYM_TEXTURES_READIMAGE = "?readImage@Textures@@QEAAPEAVBufferedImage@@W4_TEXTURE_NAME@@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@Z"; -static const char* SYM_STITCHED_GETU0 = "?getU0@StitchedTexture@@UEBAM_N@Z"; -static const char* SYM_STITCHED_GETU1 = "?getU1@StitchedTexture@@UEBAM_N@Z"; -static const char* SYM_STITCHED_GETV0 = "?getV0@StitchedTexture@@UEBAM_N@Z"; -static const char* SYM_STITCHED_GETV1 = "?getV1@StitchedTexture@@UEBAM_N@Z"; -static const char* SYM_BUFFEREDIMAGE_CTOR_FILE = "??0BufferedImage@@QEAA@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@_N10@Z"; -static const char* SYM_BUFFEREDIMAGE_CTOR_DLC = "??0BufferedImage@@QEAA@PEAVDLCPack@@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@_N@Z"; -static const char* SYM_TEXTUREMANAGER_CREATETEXTURE = "?createTexture@TextureManager@@QEAAPEAVTexture@@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@HHHHHHH_NPEAVBufferedImage@@@Z"; -static const char* SYM_TEXTURE_TRANSFERFROMIMAGE = "?transferFromImage@Texture@@QEAAXPEAVBufferedImage@@@Z"; -static const char* SYM_GET_MINECRAFT_LANGUAGE = "?GetMinecraftLanguage@CMinecraftApp@@QEAAEH@Z"; -static const char* SYM_GET_MINECRAFT_LOCALE = "?GetMinecraftLocale@CMinecraftApp@@QEAAEH@Z"; -static const char* SYM_ABSTRACT_TEXPACK_GETIMAGE = "?getImageResource@AbstractTexturePack@@UEAAPEAVBufferedImage@@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@_N10@Z"; -static const char* SYM_DLC_TEXPACK_GETIMAGE = "?getImageResource@DLCTexturePack@@UEAAPEAVBufferedImage@@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@_N10@Z"; -static const char* SYM_MINECRAFT_SETLEVEL = "?setLevel@Minecraft@@QEAAXPEAVMultiPlayerLevel@@HV?$shared_ptr@VPlayer@@@std@@_N2@Z"; -static const char* SYM_LEVEL_ADDENTITY = "?addEntity@Level@@UEAA_NV?$shared_ptr@VEntity@@@std@@@Z"; -static const char* SYM_ENTITYIO_NEWBYID = "?newById@EntityIO@@SA?AV?$shared_ptr@VEntity@@@std@@HPEAVLevel@@@Z"; -static const char* SYM_ENTITY_MOVETO = "?moveTo@Entity@@QEAAXNNNMM@Z"; -static const char* SYM_ENTITY_SETPOS = "?setPos@Entity@@QEAAXNNN@Z"; -static const char* SYM_LIVINGENTITY_GETLOOKANGLE = "?getLookAngle@LivingEntity@@UEAAPEAVVec3@@XZ"; -static const char* SYM_LIVINGENTITY_GETVIEWVECTOR = "?getViewVector@LivingEntity@@UEAAPEAVVec3@@M@Z"; -static const char* SYM_ENTITY_GETLOOKANGLE = "?getLookAngle@Entity@@UEAAPEAVVec3@@XZ"; -static const char* SYM_ENTITY_LERPMOTION = "?lerpMotion@Entity@@UEAAXNNN@Z"; -static const char* SYM_INVENTORY_REMOVERESOURCE = "?removeResource@Inventory@@QEAA_NH@Z"; -static const char* SYM_INVENTORY_VFTABLE = "??_7Inventory@@6B@"; -static const char* SYM_ITEMINSTANCE_HURTANDBREAK = "?hurtAndBreak@ItemInstance@@QEAAXHV?$shared_ptr@VLivingEntity@@@std@@@Z"; -static const char* SYM_ABSTRACTCONTAINERMENU_BROADCASTCHANGES = "?broadcastChanges@AbstractContainerMenu@@UEAAXXZ"; -static const char* SYM_TEXATLAS_BLOCKS = "?LOCATION_BLOCKS@TextureAtlas@@2VResourceLocation@@A"; -static const char* SYM_TEXATLAS_ITEMS = "?LOCATION_ITEMS@TextureAtlas@@2VResourceLocation@@A"; -static const char* SYM_TILE_TILES = "?tiles@Tile@@2PEAPEAV1@EA"; -static const char* SYM_LEVEL_HASNEIGHBORSIGNAL = "?hasNeighborSignal@Level@@QEAA_NHHH@Z"; -static const char* SYM_LEVEL_SETTILEANDDATA = "?setTileAndData@Level@@UEAA_NHHHHHH@Z"; -static const char* SYM_LEVEL_ADDTOTICKNEXTTICK = "?addToTickNextTick@Level@@UEAAXHHHHH@Z"; -static const char* SYM_SERVERLEVEL_ADDTOTICKNEXTTICK = "?addToTickNextTick@ServerLevel@@UEAAXHHHHH@Z"; - -static void* ResolveExactProcName(uintptr_t moduleBase, const char* exactName) -{ - uint32_t rva = PdbParser::FindSymbolRVAByName(exactName); - if (rva == 0) - { - LogUtil::Log("[WeaveLoader] Exact symbol not found in PDB: '%s'", exactName); - QueueExtensiveSymbolScan(exactName); - PdbParser::DumpSimilar(exactName); - return nullptr; - } - return reinterpret_cast(moduleBase + rva); -} - -static bool IsStub31000(uintptr_t moduleBase, void* ptr) -{ - return ptr == reinterpret_cast(moduleBase + 0x31000u); -} - bool SymbolResolver::Initialize() { m_moduleBase = reinterpret_cast(GetModuleHandleA(nullptr)); @@ -216,277 +99,63 @@ void* SymbolResolver::Resolve(const char* decoratedName) return reinterpret_cast(m_moduleBase + rva); } +void* SymbolResolver::ResolveExact(const char* exactName) +{ + if (!m_initialized) return nullptr; + + uint32_t rva = PdbParser::FindSymbolRVAByName(exactName); + if (rva == 0) + { + LogUtil::Log("[WeaveLoader] Exact symbol not found in PDB: '%s'", exactName); + QueueExtensiveSymbolScan(exactName); + PdbParser::DumpSimilar(exactName); + return nullptr; + } + + return reinterpret_cast(m_moduleBase + rva); +} + +bool SymbolResolver::IsStub(void* ptr) const +{ + return ptr == reinterpret_cast(m_moduleBase + 0x31000u); +} + bool SymbolResolver::ResolveGameFunctions() { LogUtil::Log("[WeaveLoader] Resolving game functions via raw PDB parser..."); - pRunStaticCtors = Resolve(SYM_RUN_STATIC_CTORS); - pMinecraftTick = Resolve(SYM_MINECRAFT_TICK); - pMinecraftInit = Resolve(SYM_MINECRAFT_INIT); - pExitGame = Resolve(SYM_EXIT_GAME); - pCreativeStaticCtor = Resolve(SYM_CREATIVE_STATIC_CTOR); - pMainMenuCustomDraw = Resolve(SYM_MAINMENU_CUSTOMDRAW); - pPresent = Resolve(SYM_PRESENT); - pGetString = Resolve(SYM_GET_STRING); - if (!pGetString) - { - pGetString = Resolve("?GetString@CConsoleMinecraftApp@@SAPEB_WH@Z"); - if (!pGetString) - PdbParser::DumpMatching("GetString"); - } - pGetResourceAsStream = Resolve(SYM_GET_RESOURCE_AS_STREAM); - pLoadUVs = Resolve(SYM_LOAD_UVS); - pPreStitchedTextureMapStitch = Resolve(SYM_PRESTITCHED_STITCH); - if (!pPreStitchedTextureMapStitch) - pPreStitchedTextureMapStitch = ResolveExactProcName(m_moduleBase, "PreStitchedTextureMap::stitch"); - pSimpleIconCtor = Resolve(SYM_SIMPLE_ICON_CTOR); - pOperatorNew = Resolve(SYM_OPERATOR_NEW); - pRegisterIcon = Resolve(SYM_REGISTER_ICON); - pItemInstanceGetIcon = Resolve(SYM_ITEMINSTANCE_GETICON); - pEntityRendererBindTextureResource = Resolve(SYM_ENTITYRENDERER_BINDTEXTURE_RESOURCE); - pItemRendererRenderItemBillboard = Resolve(SYM_ITEMRENDERER_RENDERITEMBILLBOARD); - pCompassTextureCycleFrames = Resolve(SYM_COMPASS_CYCLEFRAMES); - pClockTextureCycleFrames = Resolve(SYM_CLOCK_CYCLEFRAMES); - pCompassTextureGetSourceWidth = Resolve(SYM_COMPASS_GETSOURCEWIDTH); - pCompassTextureGetSourceHeight = Resolve(SYM_COMPASS_GETSOURCEHEIGHT); - pClockTextureGetSourceWidth = Resolve(SYM_CLOCK_GETSOURCEWIDTH); - pClockTextureGetSourceHeight = Resolve(SYM_CLOCK_GETSOURCEHEIGHT); - pItemInstanceMineBlock = Resolve(SYM_ITEMINSTANCE_MINEBLOCK); - pItemInstanceSave = Resolve(SYM_ITEMINSTANCE_SAVE); - pItemInstanceLoad = Resolve(SYM_ITEMINSTANCE_LOAD); - pTagNewTag = Resolve(SYM_TAG_NEWTAG); - if (!pTagNewTag) - pTagNewTag = ResolveExactProcName(m_moduleBase, "Tag::newTag"); - pItemMineBlock = Resolve(SYM_ITEM_MINEBLOCK); - pDiggerItemMineBlock = Resolve(SYM_DIGGERITEM_MINEBLOCK); - pPickaxeItemGetDestroySpeed = Resolve(SYM_PICKAXEITEM_GETDESTROYSPEED); - pPickaxeItemCanDestroySpecial = Resolve(SYM_PICKAXEITEM_CANDESTROYSPECIAL); - pShovelItemGetDestroySpeed = Resolve(SYM_SHOVELITEM_GETDESTROYSPEED); - pShovelItemCanDestroySpecial = Resolve(SYM_SHOVELITEM_CANDESTROYSPECIAL); - pTileOnPlace = Resolve(SYM_TILE_ONPLACE); - pTileNeighborChanged = Resolve(SYM_TILE_NEIGHBORCHANGED); - pTileTick = Resolve(SYM_TILE_TICK); - pLevelUpdateNeighborsAt = Resolve(SYM_LEVEL_UPDATE_NEIGHBORS_AT); - pServerLevelTickPendingTicks = Resolve(SYM_SERVERLEVEL_TICKPENDINGTICKS); - pLevelGetTile = Resolve(SYM_LEVEL_GETTILE); - pLevelSetData = Resolve(SYM_LEVEL_SETDATA); - pMcRegionChunkStorageLoad = Resolve(SYM_MCREGIONCHUNKSTORAGE_LOAD); - if (!pMcRegionChunkStorageLoad) - pMcRegionChunkStorageLoad = ResolveExactProcName(m_moduleBase, "McRegionChunkStorage::load"); - pMcRegionChunkStorageSave = Resolve(SYM_MCREGIONCHUNKSTORAGE_SAVE); - if (!pMcRegionChunkStorageSave) - pMcRegionChunkStorageSave = ResolveExactProcName(m_moduleBase, "McRegionChunkStorage::save"); - pTileGetResource = Resolve(SYM_TILE_GETRESOURCE); - pTileCloneTileId = Resolve(SYM_TILE_CLONETILEID); - pTileGetTextureFaceData = Resolve(SYM_TILE_GETTEXTURE_FACEDATA); - pStoneSlabGetTexture = Resolve(SYM_STONESLAB_GETTEXTURE); - pWoodSlabGetTexture = Resolve(SYM_WOODSLAB_GETTEXTURE); - pStoneSlabGetResource = Resolve(SYM_STONESLAB_GETRESOURCE); - pWoodSlabGetResource = Resolve(SYM_WOODSLAB_GETRESOURCE); - pStoneSlabGetDescriptionId = Resolve(SYM_STONESLAB_GETDESCRIPTIONID); - pWoodSlabGetDescriptionId = Resolve(SYM_WOODSLAB_GETDESCRIPTIONID); - pStoneSlabGetAuxName = Resolve(SYM_STONESLAB_GETAUXNAME); - pWoodSlabGetAuxName = Resolve(SYM_WOODSLAB_GETAUXNAME); - pStoneSlabRegisterIcons = Resolve(SYM_STONESLAB_REGISTERICONS); - pWoodSlabRegisterIcons = Resolve(SYM_WOODSLAB_REGISTERICONS); - pStoneSlabItemGetIcon = Resolve(SYM_STONESLABITEM_GETICON); - pStoneSlabItemGetDescriptionId = Resolve(SYM_STONESLABITEM_GETDESCRIPTIONID); - pHalfSlabCloneTileId = Resolve(SYM_HALFSLAB_CLONETILEID); - pPlayerCanDestroy = Resolve(SYM_PLAYER_CANDESTROY); - pServerPlayerGameModeUseItem = Resolve(SYM_SERVER_PLAYER_GAMEMODE_USEITEM); - pMultiPlayerGameModeUseItem = Resolve(SYM_MULTI_PLAYER_GAMEMODE_USEITEM); - pTexturesBindTextureResource = Resolve(SYM_TEXTURES_BIND_RESOURCE); - pTexturesLoadTextureByName = Resolve(SYM_TEXTURES_LOAD_BY_NAME); - pTexturesLoadTextureByIndex = Resolve(SYM_TEXTURES_LOAD_BY_INDEX_PUBLIC); - if (!pTexturesLoadTextureByIndex) - pTexturesLoadTextureByIndex = Resolve(SYM_TEXTURES_LOAD_BY_INDEX_PRIVATE); - pTexturesReadImage = Resolve(SYM_TEXTURES_READIMAGE); - pStitchedGetU0 = Resolve(SYM_STITCHED_GETU0); - pStitchedGetU1 = Resolve(SYM_STITCHED_GETU1); - pStitchedGetV0 = Resolve(SYM_STITCHED_GETV0); - pStitchedGetV1 = Resolve(SYM_STITCHED_GETV1); - pBufferedImageCtorFile = Resolve(SYM_BUFFEREDIMAGE_CTOR_FILE); - pBufferedImageCtorDLCPack = Resolve(SYM_BUFFEREDIMAGE_CTOR_DLC); - pTextureManagerCreateTexture = Resolve(SYM_TEXTUREMANAGER_CREATETEXTURE); - pTextureTransferFromImage = Resolve(SYM_TEXTURE_TRANSFERFROMIMAGE); - pAbstractTexturePackGetImageResource = Resolve(SYM_ABSTRACT_TEXPACK_GETIMAGE); - if (!pAbstractTexturePackGetImageResource) - pAbstractTexturePackGetImageResource = ResolveExactProcName(m_moduleBase, "AbstractTexturePack::getImageResource"); - pDLCTexturePackGetImageResource = Resolve(SYM_DLC_TEXPACK_GETIMAGE); - if (!pDLCTexturePackGetImageResource) - pDLCTexturePackGetImageResource = ResolveExactProcName(m_moduleBase, "DLCTexturePack::getImageResource"); - pMinecraftSetLevel = Resolve(SYM_MINECRAFT_SETLEVEL); - pLevelAddEntity = Resolve(SYM_LEVEL_ADDENTITY); - pEntityIONewById = Resolve(SYM_ENTITYIO_NEWBYID); - pEntityMoveTo = Resolve(SYM_ENTITY_MOVETO); - pEntitySetPos = Resolve(SYM_ENTITY_SETPOS); - pEntityGetLookAngle = Resolve(SYM_LIVINGENTITY_GETLOOKANGLE); - pLivingEntityGetViewVector = Resolve(SYM_LIVINGENTITY_GETVIEWVECTOR); - if (!pEntityGetLookAngle) - pEntityGetLookAngle = Resolve(SYM_ENTITY_GETLOOKANGLE); - pEntityLerpMotion = Resolve(SYM_ENTITY_LERPMOTION); - pInventoryRemoveResource = Resolve(SYM_INVENTORY_REMOVERESOURCE); - pInventoryVtable = Resolve(SYM_INVENTORY_VFTABLE); - pItemInstanceHurtAndBreak = Resolve(SYM_ITEMINSTANCE_HURTANDBREAK); - pAbstractContainerMenuBroadcastChanges = Resolve(SYM_ABSTRACTCONTAINERMENU_BROADCASTCHANGES); - pTextureAtlasLocationBlocks = Resolve(SYM_TEXATLAS_BLOCKS); - pTextureAtlasLocationItems = Resolve(SYM_TEXATLAS_ITEMS); - pTileTiles = Resolve(SYM_TILE_TILES); - pMinecraftApp = Resolve("?app@@3VCMinecraftApp@@A"); - if (!pMinecraftApp) - pMinecraftApp = ResolveExactProcName(m_moduleBase, "app"); - pGetMinecraftLanguage = Resolve(SYM_GET_MINECRAFT_LANGUAGE); - if (!pGetMinecraftLanguage) - pGetMinecraftLanguage = ResolveExactProcName(m_moduleBase, "CMinecraftApp::GetMinecraftLanguage"); - pGetMinecraftLocale = Resolve(SYM_GET_MINECRAFT_LOCALE); - if (!pGetMinecraftLocale) - pGetMinecraftLocale = ResolveExactProcName(m_moduleBase, "CMinecraftApp::GetMinecraftLocale"); - pLevelHasNeighborSignal = Resolve(SYM_LEVEL_HASNEIGHBORSIGNAL); - pLevelSetTileAndData = Resolve(SYM_LEVEL_SETTILEANDDATA); - pLevelAddToTickNextTick = Resolve(SYM_LEVEL_ADDTOTICKNEXTTICK); - pServerLevelAddToTickNextTick = Resolve(SYM_SERVERLEVEL_ADDTOTICKNEXTTICK); - pLevelChunkGetTile = ResolveExactProcName(m_moduleBase, "LevelChunk::getTile"); - pLevelChunkSetTile = ResolveExactProcName(m_moduleBase, "LevelChunk::setTile"); - pLevelChunkGetPos = ResolveExactProcName(m_moduleBase, "LevelChunk::getPos"); - pLevelChunkGetHighestNonEmptyY = ResolveExactProcName(m_moduleBase, "LevelChunk::getHighestNonEmptyY"); - pCompressedTileStorageSet = ResolveExactProcName(m_moduleBase, "CompressedTileStorage::set"); + Core.Resolve(*this); + Ui.Resolve(*this); + Resource.Resolve(*this); + Texture.Resolve(*this); + Item.Resolve(*this); + Tile.Resolve(*this); + Level.Resolve(*this); + Entity.Resolve(*this); + Inventory.Resolve(*this); + Nbt.Resolve(*this); - // Some public symbols in this build resolve to stub bodies. Prefer exact - // module procedure names from the PDB where those exist. - if (pShovelItemGetDestroySpeed == nullptr) - pShovelItemGetDestroySpeed = ResolveExactProcName(m_moduleBase, "DiggerItem::getDestroySpeed"); - if (IsStub31000(m_moduleBase, pTileOnPlace)) - pTileOnPlace = ResolveExactProcName(m_moduleBase, "Tile::onPlace"); - if (IsStub31000(m_moduleBase, pTileNeighborChanged)) - pTileNeighborChanged = ResolveExactProcName(m_moduleBase, "Tile::neighborChanged"); - if (IsStub31000(m_moduleBase, pTileTick)) - pTileTick = ResolveExactProcName(m_moduleBase, "Tile::tick"); - if (IsStub31000(m_moduleBase, pWoodSlabRegisterIcons)) - pWoodSlabRegisterIcons = ResolveExactProcName(m_moduleBase, "WoodSlabTile::registerIcons"); + if (!Texture.pSimpleIconCtor) PdbParser::DumpMatching("??0SimpleIcon@@"); + if (!Texture.pBufferedImageCtorFile && !Texture.pBufferedImageCtorDLCPack) PdbParser::DumpMatching("??0BufferedImage@@"); + if (!Texture.pTextureManagerCreateTexture) PdbParser::DumpMatching("createTexture@TextureManager"); + if (!Texture.pTextureTransferFromImage) PdbParser::DumpMatching("transferFromImage@Texture"); + if (!Resource.pAbstractTexturePackGetImageResource) PdbParser::DumpMatching("getImageResource@AbstractTexturePack"); + if (!Resource.pDLCTexturePackGetImageResource) PdbParser::DumpMatching("getImageResource@DLCTexturePack"); + if (!Texture.pLoadUVs) PdbParser::DumpMatching("loadUVs@PreStitchedTextureMap"); + if (!Texture.pPreStitchedTextureMapStitch) PdbParser::DumpMatching("stitch@PreStitchedTextureMap"); - if (!pOperatorNew) pOperatorNew = GetProcAddress(GetModuleHandleA("vcruntime140.dll"), SYM_OPERATOR_NEW); - if (!pOperatorNew) pOperatorNew = GetProcAddress(GetModuleHandleA("vcruntime140d.dll"), SYM_OPERATOR_NEW); - if (!pOperatorNew) pOperatorNew = GetProcAddress(GetModuleHandle(nullptr), SYM_OPERATOR_NEW); - if (!pSimpleIconCtor) PdbParser::DumpMatching("??0SimpleIcon@@"); - if (!pBufferedImageCtorFile && !pBufferedImageCtorDLCPack) PdbParser::DumpMatching("??0BufferedImage@@"); - if (!pTextureManagerCreateTexture) PdbParser::DumpMatching("createTexture@TextureManager"); - if (!pTextureTransferFromImage) PdbParser::DumpMatching("transferFromImage@Texture"); - if (!pAbstractTexturePackGetImageResource) PdbParser::DumpMatching("getImageResource@AbstractTexturePack"); - if (!pDLCTexturePackGetImageResource) PdbParser::DumpMatching("getImageResource@DLCTexturePack"); - if (!pLoadUVs) PdbParser::DumpMatching("loadUVs@PreStitchedTextureMap"); - if (!pPreStitchedTextureMapStitch) PdbParser::DumpMatching("stitch@PreStitchedTextureMap"); + Core.Log(); + Ui.Log(); + Resource.Log(); + Texture.Log(); + Item.Log(); + Tile.Log(); + Level.Log(); + Entity.Log(); + Inventory.Log(); + Nbt.Log(); - auto logSym = [](const char* name, void* ptr) { - if (ptr) - LogUtil::Log("[WeaveLoader] %-25s @ %p", name, ptr); - else - LogUtil::Log("[WeaveLoader] MISSING: %s", name); - }; - - logSym("RunStaticCtors", pRunStaticCtors); - logSym("Minecraft::tick", pMinecraftTick); - logSym("Minecraft::init", pMinecraftInit); - logSym("ExitGame", pExitGame); - logSym("CreativeStaticCtor", pCreativeStaticCtor); - logSym("MainMenuCustomDraw", pMainMenuCustomDraw); - logSym("C4JRender::Present", pPresent); - logSym("CMinecraftApp::GetString", pGetString); - logSym("InputStream::getResourceAsStream", pGetResourceAsStream); - logSym("PreStitchedTextureMap::loadUVs", pLoadUVs); - logSym("PreStitchedTextureMap::stitch", pPreStitchedTextureMapStitch); - logSym("SimpleIcon::SimpleIcon", pSimpleIconCtor); - logSym("operator new", pOperatorNew); - logSym("registerIcon", pRegisterIcon); - logSym("ItemInstance::getIcon", pItemInstanceGetIcon); - logSym("EntityRenderer::bindTexture(ResourceLocation)", pEntityRendererBindTextureResource); - logSym("ItemRenderer::renderItemBillboard", pItemRendererRenderItemBillboard); - logSym("CompassTexture::cycleFrames", pCompassTextureCycleFrames); - logSym("ClockTexture::cycleFrames", pClockTextureCycleFrames); - logSym("CompassTexture::getSourceWidth", pCompassTextureGetSourceWidth); - logSym("CompassTexture::getSourceHeight", pCompassTextureGetSourceHeight); - logSym("ClockTexture::getSourceWidth", pClockTextureGetSourceWidth); - logSym("ClockTexture::getSourceHeight", pClockTextureGetSourceHeight); - logSym("ItemInstance::mineBlock", pItemInstanceMineBlock); - logSym("ItemInstance::save", pItemInstanceSave); - logSym("ItemInstance::load", pItemInstanceLoad); - logSym("Tag::newTag", pTagNewTag); - logSym("Item::mineBlock", pItemMineBlock); - logSym("DiggerItem::mineBlock", pDiggerItemMineBlock); - logSym("PickaxeItem::getDestroySpeed", pPickaxeItemGetDestroySpeed); - logSym("PickaxeItem::canDestroySpecial", pPickaxeItemCanDestroySpecial); - logSym("ShovelItem::getDestroySpeed", pShovelItemGetDestroySpeed); - logSym("ShovelItem::canDestroySpecial", pShovelItemCanDestroySpecial); - logSym("Tile::onPlace", pTileOnPlace); - logSym("Tile::neighborChanged", pTileNeighborChanged); - logSym("Tile::tick", pTileTick); - logSym("Level::updateNeighborsAt", pLevelUpdateNeighborsAt); - logSym("ServerLevel::tickPendingTicks", pServerLevelTickPendingTicks); - logSym("Level::getTile", pLevelGetTile); - logSym("Level::setData", pLevelSetData); - logSym("McRegionChunkStorage::load", pMcRegionChunkStorageLoad); - logSym("McRegionChunkStorage::save", pMcRegionChunkStorageSave); - logSym("Tile::getResource", pTileGetResource); - logSym("Tile::cloneTileId", pTileCloneTileId); - logSym("Tile::getTexture(face,data)", pTileGetTextureFaceData); - logSym("StoneSlabTile::getTexture", pStoneSlabGetTexture); - logSym("WoodSlabTile::getTexture", pWoodSlabGetTexture); - logSym("StoneSlabTile::getResource", pStoneSlabGetResource); - logSym("WoodSlabTile::getResource", pWoodSlabGetResource); - logSym("StoneSlabTile::getDescriptionId", pStoneSlabGetDescriptionId); - logSym("WoodSlabTile::getDescriptionId", pWoodSlabGetDescriptionId); - logSym("StoneSlabTile::getAuxName", pStoneSlabGetAuxName); - logSym("WoodSlabTile::getAuxName", pWoodSlabGetAuxName); - logSym("StoneSlabTile::registerIcons", pStoneSlabRegisterIcons); - logSym("WoodSlabTile::registerIcons", pWoodSlabRegisterIcons); - logSym("StoneSlabTileItem::getIcon", pStoneSlabItemGetIcon); - logSym("StoneSlabTileItem::getDescriptionId", pStoneSlabItemGetDescriptionId); - logSym("HalfSlabTile::cloneTileId", pHalfSlabCloneTileId); - logSym("Player::canDestroy", pPlayerCanDestroy); - logSym("ServerPlayerGameMode::useItem", pServerPlayerGameModeUseItem); - logSym("MultiPlayerGameMode::useItem", pMultiPlayerGameModeUseItem); - logSym("Textures::bindTexture(ResourceLocation)", pTexturesBindTextureResource); - logSym("Textures::loadTexture(TEXTURE_NAME,wstring)", pTexturesLoadTextureByName); - logSym("Textures::loadTexture(int)", pTexturesLoadTextureByIndex); - logSym("Textures::readImage(TEXTURE_NAME,wstring)", pTexturesReadImage); - logSym("StitchedTexture::getU0", pStitchedGetU0); - logSym("StitchedTexture::getU1", pStitchedGetU1); - logSym("StitchedTexture::getV0", pStitchedGetV0); - logSym("StitchedTexture::getV1", pStitchedGetV1); - logSym("BufferedImage::BufferedImage(file)", pBufferedImageCtorFile); - logSym("BufferedImage::BufferedImage(DLCPack)", pBufferedImageCtorDLCPack); - logSym("TextureManager::createTexture", pTextureManagerCreateTexture); - logSym("Texture::transferFromImage", pTextureTransferFromImage); - logSym("AbstractTexturePack::getImageResource", pAbstractTexturePackGetImageResource); - logSym("DLCTexturePack::getImageResource", pDLCTexturePackGetImageResource); - logSym("Minecraft::setLevel", pMinecraftSetLevel); - logSym("Level::addEntity", pLevelAddEntity); - logSym("EntityIO::newById", pEntityIONewById); - logSym("Entity::moveTo", pEntityMoveTo); - logSym("Entity::setPos", pEntitySetPos); - logSym("LivingEntity/Entity::getLookAngle", pEntityGetLookAngle); - logSym("LivingEntity::getViewVector", pLivingEntityGetViewVector); - logSym("Entity::lerpMotion", pEntityLerpMotion); - logSym("Inventory::removeResource", pInventoryRemoveResource); - logSym("Inventory::vftable", pInventoryVtable); - logSym("ItemInstance::hurtAndBreak", pItemInstanceHurtAndBreak); - logSym("AbstractContainerMenu::broadcastChanges", pAbstractContainerMenuBroadcastChanges); - logSym("TextureAtlas::LOCATION_BLOCKS", pTextureAtlasLocationBlocks); - logSym("TextureAtlas::LOCATION_ITEMS", pTextureAtlasLocationItems); - logSym("Tile::tiles", pTileTiles); - logSym("app (CMinecraftApp)", pMinecraftApp); - logSym("CMinecraftApp::GetMinecraftLanguage", pGetMinecraftLanguage); - logSym("CMinecraftApp::GetMinecraftLocale", pGetMinecraftLocale); - logSym("Level::hasNeighborSignal", pLevelHasNeighborSignal); - logSym("Level::setTileAndData", pLevelSetTileAndData); - logSym("Level::addToTickNextTick", pLevelAddToTickNextTick); - logSym("ServerLevel::addToTickNextTick", pServerLevelAddToTickNextTick); - logSym("LevelChunk::getTile", pLevelChunkGetTile); - logSym("LevelChunk::setTile", pLevelChunkSetTile); - logSym("LevelChunk::getPos", pLevelChunkGetPos); - logSym("LevelChunk::getHighestNonEmptyY", pLevelChunkGetHighestNonEmptyY); - logSym("CompressedTileStorage::set", pCompressedTileStorageSet); - - bool ok = pRunStaticCtors && pMinecraftTick && pMinecraftInit; + bool ok = Core.HasCritical(); if (ok) LogUtil::Log("[WeaveLoader] All critical symbols resolved (via raw PDB parser)"); else diff --git a/WeaveLoaderRuntime/src/SymbolResolver.h b/WeaveLoaderRuntime/src/SymbolResolver.h index 83da0e2..5ba8906 100644 --- a/WeaveLoaderRuntime/src/SymbolResolver.h +++ b/WeaveLoaderRuntime/src/SymbolResolver.h @@ -1,5 +1,6 @@ #pragma once #include +#include "Symbols/SymbolGroups.h" class SymbolResolver { @@ -9,109 +10,19 @@ public: void Cleanup(); void* Resolve(const char* decoratedName); + void* ResolveExact(const char* exactName); + bool IsStub(void* ptr) const; - void* pRunStaticCtors = nullptr; // MinecraftWorld_RunStaticCtors - void* pMinecraftTick = nullptr; // Minecraft::tick(bool, bool) - void* pMinecraftInit = nullptr; // Minecraft::init() - void* pExitGame = nullptr; // CConsoleMinecraftApp::ExitGame() - void* pCreativeStaticCtor = nullptr; // IUIScene_CreativeMenu::staticCtor() - void* pMainMenuCustomDraw = nullptr; // UIScene_MainMenu::customDraw() - void* pPresent = nullptr; // C4JRender::Present() - void* pGetString = nullptr; // CMinecraftApp::GetString(int) - void* pGetResourceAsStream = nullptr; // InputStream::getResourceAsStream(wstring) - void* pLoadUVs = nullptr; // PreStitchedTextureMap::loadUVs() - void* pPreStitchedTextureMapStitch = nullptr; // PreStitchedTextureMap::stitch() - void* pSimpleIconCtor = nullptr; // SimpleIcon::SimpleIcon(wstring,wstring,float*4) - void* pOperatorNew = nullptr; // global operator new(size_t) - for texture injection - void* pRegisterIcon = nullptr; // PreStitchedTextureMap::registerIcon(const wstring&) - void* pItemInstanceGetIcon = nullptr; // ItemInstance::getIcon() - void* pEntityRendererBindTextureResource = nullptr; // EntityRenderer::bindTexture(ResourceLocation*) - void* pItemRendererRenderItemBillboard = nullptr; // ItemRenderer::renderItemBillboard(shared_ptr,Icon*,...) - void* pCompassTextureCycleFrames = nullptr; // CompassTexture::cycleFrames() - void* pClockTextureCycleFrames = nullptr; // ClockTexture::cycleFrames() - void* pCompassTextureGetSourceWidth = nullptr; // CompassTexture::getSourceWidth() const - void* pCompassTextureGetSourceHeight = nullptr; // CompassTexture::getSourceHeight() const - void* pClockTextureGetSourceWidth = nullptr; // ClockTexture::getSourceWidth() const - void* pClockTextureGetSourceHeight = nullptr; // ClockTexture::getSourceHeight() const - void* pItemInstanceMineBlock = nullptr; // ItemInstance::mineBlock(Level*,int,int,int,int,shared_ptr) - void* pItemInstanceSave = nullptr; // ItemInstance::save(CompoundTag*) - void* pItemInstanceLoad = nullptr; // ItemInstance::load(CompoundTag*) - void* pTagNewTag = nullptr; // Tag::newTag(byte,const wstring&) - void* pItemMineBlock = nullptr; // Item::mineBlock(shared_ptr,Level*,int,int,int,int,shared_ptr) - void* pDiggerItemMineBlock = nullptr; // DiggerItem::mineBlock(shared_ptr,Level*,int,int,int,int,shared_ptr) - void* pPickaxeItemGetDestroySpeed = nullptr; // PickaxeItem::getDestroySpeed(shared_ptr,Tile*) - void* pPickaxeItemCanDestroySpecial = nullptr; // PickaxeItem::canDestroySpecial(Tile*) - void* pShovelItemGetDestroySpeed = nullptr; // ShovelItem::getDestroySpeed(shared_ptr,Tile*) - void* pShovelItemCanDestroySpecial = nullptr; // ShovelItem::canDestroySpecial(Tile*) - void* pTileOnPlace = nullptr; // Tile::onPlace(Level*,int,int,int) - void* pTileNeighborChanged = nullptr; // Tile::neighborChanged(Level*,int,int,int,int) - void* pTileTick = nullptr; // Tile::tick(Level*,int,int,int,Random*) - void* pLevelUpdateNeighborsAt = nullptr; // Level::updateNeighborsAt(int,int,int,int) - void* pServerLevelTickPendingTicks = nullptr; // ServerLevel::tickPendingTicks(bool) - void* pLevelGetTile = nullptr; // Level::getTile(int,int,int) - void* pLevelSetData = nullptr; // Level::setData(int,int,int,int,int,bool) - void* pMcRegionChunkStorageLoad = nullptr; // McRegionChunkStorage::load(Level*,int,int) - void* pMcRegionChunkStorageSave = nullptr; // McRegionChunkStorage::save(Level*,LevelChunk*) - void* pTileGetResource = nullptr; // Tile::getResource(int,Random*,int) - void* pTileCloneTileId = nullptr; // Tile::cloneTileId(Level*,int,int,int) - void* pTileGetTextureFaceData = nullptr; // Tile::getTexture(int,int) - void* pStoneSlabGetTexture = nullptr; // StoneSlabTile::getTexture(int,int) - void* pWoodSlabGetTexture = nullptr; // WoodSlabTile::getTexture(int,int) - void* pStoneSlabGetResource = nullptr; // StoneSlabTile::getResource(int,Random*,int) - void* pWoodSlabGetResource = nullptr; // WoodSlabTile::getResource(int,Random*,int) - void* pStoneSlabGetDescriptionId = nullptr; // StoneSlabTile::getDescriptionId(int) - void* pWoodSlabGetDescriptionId = nullptr; // WoodSlabTile::getDescriptionId(int) - void* pStoneSlabGetAuxName = nullptr; // StoneSlabTile::getAuxName(int) - void* pWoodSlabGetAuxName = nullptr; // WoodSlabTile::getAuxName(int) - void* pStoneSlabRegisterIcons = nullptr; // StoneSlabTile::registerIcons(IconRegister*) - void* pWoodSlabRegisterIcons = nullptr; // WoodSlabTile::registerIcons(IconRegister*) - void* pStoneSlabItemGetIcon = nullptr; // StoneSlabTileItem::getIcon(int) - void* pStoneSlabItemGetDescriptionId = nullptr; // StoneSlabTileItem::getDescriptionId(shared_ptr) - void* pHalfSlabCloneTileId = nullptr; // HalfSlabTile::cloneTileId(Level*,int,int,int) - void* pPlayerCanDestroy = nullptr; // Player::canDestroy(Tile*) - void* pServerPlayerGameModeUseItem = nullptr; // ServerPlayerGameMode::useItem(shared_ptr,Level*,shared_ptr,bool) - void* pMultiPlayerGameModeUseItem = nullptr; // MultiPlayerGameMode::useItem(shared_ptr,Level*,shared_ptr,bool) - void* pTexturesBindTextureResource = nullptr; // Textures::bindTexture(ResourceLocation*) - void* pTexturesLoadTextureByName = nullptr; // Textures::loadTexture(TEXTURE_NAME,const wstring&) - void* pTexturesLoadTextureByIndex = nullptr; // Textures::loadTexture(int) - void* pTexturesReadImage = nullptr; // Textures::readImage(TEXTURE_NAME,const wstring&) - void* pStitchedGetU0 = nullptr; // StitchedTexture::getU0(bool) const - void* pStitchedGetU1 = nullptr; // StitchedTexture::getU1(bool) const - void* pStitchedGetV0 = nullptr; // StitchedTexture::getV0(bool) const - void* pStitchedGetV1 = nullptr; // StitchedTexture::getV1(bool) const - void* pBufferedImageCtorFile = nullptr; // BufferedImage::BufferedImage(const wstring&,bool,bool,const wstring&) - void* pBufferedImageCtorDLCPack = nullptr; // BufferedImage::BufferedImage(DLCPack*,const wstring&,bool) - void* pTextureManagerCreateTexture = nullptr; // TextureManager::createTexture(wstring,int,int,int,int,int,int,int,bool,BufferedImage*) - void* pTextureTransferFromImage = nullptr; // Texture::transferFromImage(BufferedImage*) - void* pAbstractTexturePackGetImageResource = nullptr; // AbstractTexturePack::getImageResource - void* pDLCTexturePackGetImageResource = nullptr; // DLCTexturePack::getImageResource - void* pMinecraftSetLevel = nullptr; // Minecraft::setLevel(MultiPlayerLevel*,int,shared_ptr,bool,bool) - void* pLevelAddEntity = nullptr; // Level::addEntity(shared_ptr) - void* pEntityIONewById = nullptr; // EntityIO::newById(int,Level*) - void* pEntityMoveTo = nullptr; // Entity::moveTo(double,double,double,float,float) - void* pEntitySetPos = nullptr; // Entity::setPos(double,double,double) - void* pEntityGetLookAngle = nullptr; // Entity::getLookAngle() - void* pLivingEntityGetViewVector = nullptr; // LivingEntity::getViewVector(float) - void* pEntityLerpMotion = nullptr; // Entity::lerpMotion(double,double,double) - void* pInventoryRemoveResource = nullptr; // Inventory::removeResource(int) - void* pInventoryVtable = nullptr; // Inventory vftable - void* pItemInstanceHurtAndBreak = nullptr; // ItemInstance::hurtAndBreak(int,shared_ptr) - void* pAbstractContainerMenuBroadcastChanges = nullptr; // AbstractContainerMenu::broadcastChanges() - void* pTextureAtlasLocationBlocks = nullptr; // TextureAtlas::LOCATION_BLOCKS - void* pTextureAtlasLocationItems = nullptr; // TextureAtlas::LOCATION_ITEMS - void* pTileTiles = nullptr; // Tile::tiles (Tile*[]) for tile id lookup - void* pMinecraftApp = nullptr; // global CMinecraftApp app - void* pGetMinecraftLanguage = nullptr; // CMinecraftApp::GetMinecraftLanguage(int) - void* pGetMinecraftLocale = nullptr; // CMinecraftApp::GetMinecraftLocale(int) - void* pLevelHasNeighborSignal = nullptr; // Level::hasNeighborSignal(int,int,int) - void* pLevelSetTileAndData = nullptr; // Level::setTileAndData(int,int,int,int,int,int) - void* pLevelAddToTickNextTick = nullptr; // Level::addToTickNextTick(int,int,int,int,int) - void* pServerLevelAddToTickNextTick = nullptr; // ServerLevel::addToTickNextTick(int,int,int,int,int) - void* pLevelChunkGetTile = nullptr; // LevelChunk::getTile(int,int,int) - void* pLevelChunkSetTile = nullptr; // LevelChunk::setTile(int,int,int,int) - void* pLevelChunkGetPos = nullptr; // LevelChunk::getPos() - void* pLevelChunkGetHighestNonEmptyY = nullptr; // LevelChunk::getHighestNonEmptyY() - void* pCompressedTileStorageSet = nullptr; // CompressedTileStorage::set(int,int,int,int) + CoreSymbols Core; + UiSymbols Ui; + ResourceSymbols Resource; + TextureSymbols Texture; + ItemSymbols Item; + TileSymbols Tile; + LevelSymbols Level; + EntitySymbols Entity; + InventorySymbols Inventory; + NbtSymbols Nbt; private: uintptr_t m_moduleBase = 0; diff --git a/WeaveLoaderRuntime/src/Symbols/SymbolGroups.cpp b/WeaveLoaderRuntime/src/Symbols/SymbolGroups.cpp new file mode 100644 index 0000000..4709bf3 --- /dev/null +++ b/WeaveLoaderRuntime/src/Symbols/SymbolGroups.cpp @@ -0,0 +1,467 @@ +#include "Symbols/SymbolGroups.h" +#include "SymbolResolver.h" +#include "PdbParser.h" +#include "LogUtil.h" +#include + +namespace +{ + static void LogSym(const char* name, void* ptr) + { + if (ptr) + LogUtil::Log("[WeaveLoader] %-25s @ %p", name, ptr); + else + LogUtil::Log("[WeaveLoader] MISSING: %s", name); + } + + static const char* SYM_RUN_STATIC_CTORS = "?MinecraftWorld_RunStaticCtors@@YAXXZ"; + static const char* SYM_MINECRAFT_TICK = "?tick@Minecraft@@QEAAX_N0@Z"; + static const char* SYM_MINECRAFT_INIT = "?init@Minecraft@@QEAAXXZ"; + static const char* SYM_EXIT_GAME = "?ExitGame@CConsoleMinecraftApp@@UEAAXXZ"; + static const char* SYM_MINECRAFT_SETLEVEL = "?setLevel@Minecraft@@QEAAXPEAVMultiPlayerLevel@@HV?$shared_ptr@VPlayer@@@std@@_N2@Z"; + static const char* SYM_PRESENT = "?Present@C4JRender@@QEAAXXZ"; + static const char* SYM_GET_MINECRAFT_LANGUAGE = "?GetMinecraftLanguage@CMinecraftApp@@QEAAEH@Z"; + static const char* SYM_GET_MINECRAFT_LOCALE = "?GetMinecraftLocale@CMinecraftApp@@QEAAEH@Z"; + + static const char* SYM_CREATIVE_STATIC_CTOR = "?staticCtor@IUIScene_CreativeMenu@@SAXXZ"; + static const char* SYM_MAINMENU_CUSTOMDRAW = "?customDraw@UIScene_MainMenu@@UEAAXPEAUIggyCustomDrawCallbackRegion@@@Z"; + static const char* SYM_GET_STRING = "?GetString@CMinecraftApp@@SAPEB_WH@Z"; + static const char* SYM_GET_STRING_CONSOLE = "?GetString@CConsoleMinecraftApp@@SAPEB_WH@Z"; + + static const char* SYM_GET_RESOURCE_AS_STREAM = "?getResourceAsStream@InputStream@@SAPEAV1@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@Z"; + static const char* SYM_ABSTRACT_TEXPACK_GETIMAGE = "?getImageResource@AbstractTexturePack@@UEAAPEAVBufferedImage@@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@_N10@Z"; + static const char* SYM_DLC_TEXPACK_GETIMAGE = "?getImageResource@DLCTexturePack@@UEAAPEAVBufferedImage@@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@_N10@Z"; + + static const char* SYM_LOAD_UVS = "?loadUVs@PreStitchedTextureMap@@AEAAXXZ"; + static const char* SYM_PRESTITCHED_STITCH = "?stitch@PreStitchedTextureMap@@QEAAXXZ"; + static const char* SYM_SIMPLE_ICON_CTOR = "??0SimpleIcon@@QEAA@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@0MMMM@Z"; + static const char* SYM_OPERATOR_NEW = "??2@YAPEAX_K@Z"; + static const char* SYM_REGISTER_ICON = "?registerIcon@PreStitchedTextureMap@@UEAAPEAVIcon@@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@Z"; + static const char* SYM_ENTITYRENDERER_BINDTEXTURE_RESOURCE = "?bindTexture@EntityRenderer@@MEAAXPEAVResourceLocation@@@Z"; + static const char* SYM_ITEMRENDERER_RENDERITEMBILLBOARD = "?renderItemBillboard@ItemRenderer@@EEAAXV?$shared_ptr@VItemEntity@@@std@@PEAVIcon@@HMMMM@Z"; + static const char* SYM_COMPASS_CYCLEFRAMES = "?cycleFrames@CompassTexture@@UEAAXXZ"; + static const char* SYM_CLOCK_CYCLEFRAMES = "?cycleFrames@ClockTexture@@UEAAXXZ"; + static const char* SYM_COMPASS_GETSOURCEWIDTH = "?getSourceWidth@CompassTexture@@UEBAHXZ"; + static const char* SYM_COMPASS_GETSOURCEHEIGHT = "?getSourceHeight@CompassTexture@@UEBAHXZ"; + static const char* SYM_CLOCK_GETSOURCEWIDTH = "?getSourceWidth@ClockTexture@@UEBAHXZ"; + static const char* SYM_CLOCK_GETSOURCEHEIGHT = "?getSourceHeight@ClockTexture@@UEBAHXZ"; + static const char* SYM_TEXTURES_BIND_RESOURCE = "?bindTexture@Textures@@QEAAXPEAVResourceLocation@@@Z"; + static const char* SYM_TEXTURES_LOAD_BY_NAME = "?loadTexture@Textures@@AEAAHW4_TEXTURE_NAME@@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@Z"; + static const char* SYM_TEXTURES_LOAD_BY_INDEX_PUBLIC = "?loadTexture@Textures@@QEAAHH@Z"; + static const char* SYM_TEXTURES_LOAD_BY_INDEX_PRIVATE = "?loadTexture@Textures@@AEAAHH@Z"; + static const char* SYM_TEXTURES_READIMAGE = "?readImage@Textures@@QEAAPEAVBufferedImage@@W4_TEXTURE_NAME@@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@Z"; + static const char* SYM_STITCHED_GETU0 = "?getU0@StitchedTexture@@UEBAM_N@Z"; + static const char* SYM_STITCHED_GETU1 = "?getU1@StitchedTexture@@UEBAM_N@Z"; + static const char* SYM_STITCHED_GETV0 = "?getV0@StitchedTexture@@UEBAM_N@Z"; + static const char* SYM_STITCHED_GETV1 = "?getV1@StitchedTexture@@UEBAM_N@Z"; + static const char* SYM_BUFFEREDIMAGE_CTOR_FILE = "??0BufferedImage@@QEAA@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@_N10@Z"; + static const char* SYM_BUFFEREDIMAGE_CTOR_DLC = "??0BufferedImage@@QEAA@PEAVDLCPack@@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@_N@Z"; + static const char* SYM_TEXTUREMANAGER_CREATETEXTURE = "?createTexture@TextureManager@@QEAAPEAVTexture@@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@HHHHHHH_NPEAVBufferedImage@@@Z"; + static const char* SYM_TEXTURE_TRANSFERFROMIMAGE = "?transferFromImage@Texture@@QEAAXPEAVBufferedImage@@@Z"; + static const char* SYM_TEXATLAS_BLOCKS = "?LOCATION_BLOCKS@TextureAtlas@@2VResourceLocation@@A"; + static const char* SYM_TEXATLAS_ITEMS = "?LOCATION_ITEMS@TextureAtlas@@2VResourceLocation@@A"; + + static const char* SYM_ITEMINSTANCE_GETICON = "?getIcon@ItemInstance@@QEAAPEAVIcon@@XZ"; + static const char* SYM_ITEMINSTANCE_MINEBLOCK = "?mineBlock@ItemInstance@@QEAAXPEAVLevel@@HHHHV?$shared_ptr@VPlayer@@@std@@@Z"; + static const char* SYM_ITEMINSTANCE_SAVE = "?save@ItemInstance@@QEAAPEAVCompoundTag@@PEAV2@@Z"; + static const char* SYM_ITEMINSTANCE_LOAD = "?load@ItemInstance@@QEAAXPEAVCompoundTag@@@Z"; + static const char* SYM_ITEMINSTANCE_HURTANDBREAK = "?hurtAndBreak@ItemInstance@@QEAAXHV?$shared_ptr@VLivingEntity@@@std@@@Z"; + static const char* SYM_ITEM_MINEBLOCK = "?mineBlock@Item@@UEAA_NV?$shared_ptr@VItemInstance@@@std@@PEAVLevel@@HHHHV?$shared_ptr@VLivingEntity@@@3@@Z"; + static const char* SYM_DIGGERITEM_MINEBLOCK = "?mineBlock@DiggerItem@@UEAA_NV?$shared_ptr@VItemInstance@@@std@@PEAVLevel@@HHHHV?$shared_ptr@VLivingEntity@@@3@@Z"; + static const char* SYM_PICKAXEITEM_GETDESTROYSPEED = "?getDestroySpeed@PickaxeItem@@UEAAMV?$shared_ptr@VItemInstance@@@std@@PEAVTile@@@Z"; + static const char* SYM_PICKAXEITEM_CANDESTROYSPECIAL = "?canDestroySpecial@PickaxeItem@@UEAA_NPEAVTile@@@Z"; + static const char* SYM_SHOVELITEM_GETDESTROYSPEED = "?getDestroySpeed@ShovelItem@@UEAAMV?$shared_ptr@VItemInstance@@@std@@PEAVTile@@@Z"; + static const char* SYM_SHOVELITEM_CANDESTROYSPECIAL = "?canDestroySpecial@ShovelItem@@UEAA_NPEAVTile@@@Z"; + + static const char* SYM_TILE_ONPLACE = "?onPlace@Tile@@UEAAXPEAVLevel@@HHH@Z"; + static const char* SYM_TILE_NEIGHBORCHANGED = "?neighborChanged@Tile@@UEAAXPEAVLevel@@HHHH@Z"; + static const char* SYM_TILE_TICK = "?tick@Tile@@UEAAXPEAVLevel@@HHHPEAVRandom@@@Z"; + static const char* SYM_TILE_GETRESOURCE = "?getResource@Tile@@UEAAHHPEAVRandom@@H@Z"; + static const char* SYM_TILE_CLONETILEID = "?cloneTileId@Tile@@UEAAHPEAVLevel@@HHH@Z"; + static const char* SYM_TILE_GETTEXTURE_FACEDATA = "?getTexture@Tile@@UEAAPEAVIcon@@HH@Z"; + static const char* SYM_STONESLAB_GETTEXTURE = "?getTexture@StoneSlabTile@@UEAAPEAVIcon@@HH@Z"; + static const char* SYM_WOODSLAB_GETTEXTURE = "?getTexture@WoodSlabTile@@UEAAPEAVIcon@@HH@Z"; + static const char* SYM_STONESLAB_GETRESOURCE = "?getResource@StoneSlabTile@@UEAAHHPEAVRandom@@H@Z"; + static const char* SYM_WOODSLAB_GETRESOURCE = "?getResource@WoodSlabTile@@UEAAHHPEAVRandom@@H@Z"; + static const char* SYM_STONESLAB_GETDESCRIPTIONID = "?getDescriptionId@StoneSlabTile@@UEAAIH@Z"; + static const char* SYM_WOODSLAB_GETDESCRIPTIONID = "?getDescriptionId@WoodSlabTile@@UEAAIH@Z"; + static const char* SYM_STONESLAB_GETAUXNAME = "?getAuxName@StoneSlabTile@@UEAAHH@Z"; + static const char* SYM_WOODSLAB_GETAUXNAME = "?getAuxName@WoodSlabTile@@UEAAHH@Z"; + static const char* SYM_STONESLAB_REGISTERICONS = "?registerIcons@StoneSlabTile@@UEAAXPEAVIconRegister@@@Z"; + static const char* SYM_WOODSLAB_REGISTERICONS = "?registerIcons@WoodSlabTile@@UEAAXPEAVIconRegister@@@Z"; + static const char* SYM_STONESLABITEM_GETICON = "?getIcon@StoneSlabTileItem@@UEAAPEAVIcon@@H@Z"; + static const char* SYM_STONESLABITEM_GETDESCRIPTIONID = "?getDescriptionId@StoneSlabTileItem@@UEAAIV?$shared_ptr@VItemInstance@@@std@@@Z"; + static const char* SYM_HALFSLAB_CLONETILEID = "?cloneTileId@HalfSlabTile@@UEAAHPEAVLevel@@HHH@Z"; + static const char* SYM_TILE_TILES = "?tiles@Tile@@2PEAPEAV1@EA"; + + static const char* SYM_LEVEL_UPDATE_NEIGHBORS_AT = "?updateNeighborsAt@Level@@QEAAXHHHH@Z"; + static const char* SYM_SERVERLEVEL_TICKPENDINGTICKS = "?tickPendingTicks@ServerLevel@@UEAA_N_N@Z"; + static const char* SYM_LEVEL_GETTILE = "?getTile@Level@@UEAAHHHH@Z"; + static const char* SYM_LEVEL_SETDATA = "?setData@Level@@UEAA_NHHHHH_N@Z"; + static const char* SYM_MCREGIONCHUNKSTORAGE_LOAD = "?load@McRegionChunkStorage@@UEAAPEAVLevelChunk@@PEAVLevel@@HH@Z"; + static const char* SYM_MCREGIONCHUNKSTORAGE_SAVE = "?save@McRegionChunkStorage@@UEAAXPEAVLevel@@PEAVLevelChunk@@@Z"; + static const char* SYM_LEVEL_SETTILEANDDATA = "?setTileAndData@Level@@UEAA_NHHHHHH@Z"; + static const char* SYM_LEVEL_HASNEIGHBORSIGNAL = "?hasNeighborSignal@Level@@QEAA_NHHH@Z"; + static const char* SYM_LEVEL_ADDTOTICKNEXTTICK = "?addToTickNextTick@Level@@UEAAXHHHHH@Z"; + static const char* SYM_SERVERLEVEL_ADDTOTICKNEXTTICK = "?addToTickNextTick@ServerLevel@@UEAAXHHHHH@Z"; + + static const char* SYM_PLAYER_CANDESTROY = "?canDestroy@Player@@QEAA_NPEAVTile@@@Z"; + static const char* SYM_SERVER_PLAYER_GAMEMODE_USEITEM = "?useItem@ServerPlayerGameMode@@QEAA_NV?$shared_ptr@VPlayer@@@std@@PEAVLevel@@V?$shared_ptr@VItemInstance@@@3@_N@Z"; + static const char* SYM_MULTI_PLAYER_GAMEMODE_USEITEM = "?useItem@MultiPlayerGameMode@@UEAA_NV?$shared_ptr@VPlayer@@@std@@PEAVLevel@@V?$shared_ptr@VItemInstance@@@3@_N@Z"; + static const char* SYM_LEVEL_ADDENTITY = "?addEntity@Level@@UEAA_NV?$shared_ptr@VEntity@@@std@@@Z"; + static const char* SYM_ENTITYIO_NEWBYID = "?newById@EntityIO@@SA?AV?$shared_ptr@VEntity@@@std@@HPEAVLevel@@@Z"; + static const char* SYM_ENTITY_MOVETO = "?moveTo@Entity@@QEAAXNNNMM@Z"; + static const char* SYM_ENTITY_SETPOS = "?setPos@Entity@@QEAAXNNN@Z"; + static const char* SYM_LIVINGENTITY_GETLOOKANGLE = "?getLookAngle@LivingEntity@@UEAAPEAVVec3@@XZ"; + static const char* SYM_ENTITY_GETLOOKANGLE = "?getLookAngle@Entity@@UEAAPEAVVec3@@XZ"; + static const char* SYM_LIVINGENTITY_GETVIEWVECTOR = "?getViewVector@LivingEntity@@UEAAPEAVVec3@@M@Z"; + static const char* SYM_ENTITY_LERPMOTION = "?lerpMotion@Entity@@UEAAXNNN@Z"; + + static const char* SYM_INVENTORY_REMOVERESOURCE = "?removeResource@Inventory@@QEAA_NH@Z"; + static const char* SYM_INVENTORY_VFTABLE = "??_7Inventory@@6B@"; + static const char* SYM_ABSTRACTCONTAINERMENU_BROADCASTCHANGES = "?broadcastChanges@AbstractContainerMenu@@UEAAXXZ"; + + static const char* SYM_TAG_NEWTAG = "?newTag@Tag@@SAPEAV1@EAEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@Z"; +} + +bool CoreSymbols::Resolve(SymbolResolver& resolver) +{ + pRunStaticCtors = resolver.Resolve(SYM_RUN_STATIC_CTORS); + pMinecraftTick = resolver.Resolve(SYM_MINECRAFT_TICK); + pMinecraftInit = resolver.Resolve(SYM_MINECRAFT_INIT); + pMinecraftSetLevel = resolver.Resolve(SYM_MINECRAFT_SETLEVEL); + pExitGame = resolver.Resolve(SYM_EXIT_GAME); + pPresent = resolver.Resolve(SYM_PRESENT); + pMinecraftApp = resolver.Resolve("?app@@3VCMinecraftApp@@A"); + if (!pMinecraftApp) + pMinecraftApp = resolver.ResolveExact("app"); + pGetMinecraftLanguage = resolver.Resolve(SYM_GET_MINECRAFT_LANGUAGE); + if (!pGetMinecraftLanguage) + pGetMinecraftLanguage = resolver.ResolveExact("CMinecraftApp::GetMinecraftLanguage"); + pGetMinecraftLocale = resolver.Resolve(SYM_GET_MINECRAFT_LOCALE); + if (!pGetMinecraftLocale) + pGetMinecraftLocale = resolver.ResolveExact("CMinecraftApp::GetMinecraftLocale"); + return HasCritical(); +} + +void CoreSymbols::Log() const +{ + LogSym("RunStaticCtors", pRunStaticCtors); + LogSym("Minecraft::tick", pMinecraftTick); + LogSym("Minecraft::init", pMinecraftInit); + LogSym("Minecraft::setLevel", pMinecraftSetLevel); + LogSym("ExitGame", pExitGame); + LogSym("C4JRender::Present", pPresent); + LogSym("app (CMinecraftApp)", pMinecraftApp); + LogSym("CMinecraftApp::GetMinecraftLanguage", pGetMinecraftLanguage); + LogSym("CMinecraftApp::GetMinecraftLocale", pGetMinecraftLocale); +} + +bool CoreSymbols::HasCritical() const +{ + return pRunStaticCtors && pMinecraftTick && pMinecraftInit; +} + +bool UiSymbols::Resolve(SymbolResolver& resolver) +{ + pCreativeStaticCtor = resolver.Resolve(SYM_CREATIVE_STATIC_CTOR); + pMainMenuCustomDraw = resolver.Resolve(SYM_MAINMENU_CUSTOMDRAW); + pGetString = resolver.Resolve(SYM_GET_STRING); + if (!pGetString) + pGetString = resolver.Resolve(SYM_GET_STRING_CONSOLE); + return true; +} + +void UiSymbols::Log() const +{ + LogSym("CreativeStaticCtor", pCreativeStaticCtor); + LogSym("MainMenuCustomDraw", pMainMenuCustomDraw); + LogSym("CMinecraftApp::GetString", pGetString); +} + +bool ResourceSymbols::Resolve(SymbolResolver& resolver) +{ + pGetResourceAsStream = resolver.Resolve(SYM_GET_RESOURCE_AS_STREAM); + pAbstractTexturePackGetImageResource = resolver.Resolve(SYM_ABSTRACT_TEXPACK_GETIMAGE); + if (!pAbstractTexturePackGetImageResource) + pAbstractTexturePackGetImageResource = resolver.ResolveExact("AbstractTexturePack::getImageResource"); + pDLCTexturePackGetImageResource = resolver.Resolve(SYM_DLC_TEXPACK_GETIMAGE); + if (!pDLCTexturePackGetImageResource) + pDLCTexturePackGetImageResource = resolver.ResolveExact("DLCTexturePack::getImageResource"); + return true; +} + +void ResourceSymbols::Log() const +{ + LogSym("InputStream::getResourceAsStream", pGetResourceAsStream); + LogSym("AbstractTexturePack::getImageResource", pAbstractTexturePackGetImageResource); + LogSym("DLCTexturePack::getImageResource", pDLCTexturePackGetImageResource); +} + +bool TextureSymbols::Resolve(SymbolResolver& resolver) +{ + pLoadUVs = resolver.Resolve(SYM_LOAD_UVS); + pPreStitchedTextureMapStitch = resolver.Resolve(SYM_PRESTITCHED_STITCH); + if (!pPreStitchedTextureMapStitch) + pPreStitchedTextureMapStitch = resolver.ResolveExact("PreStitchedTextureMap::stitch"); + pSimpleIconCtor = resolver.Resolve(SYM_SIMPLE_ICON_CTOR); + pOperatorNew = resolver.Resolve(SYM_OPERATOR_NEW); + pRegisterIcon = resolver.Resolve(SYM_REGISTER_ICON); + pEntityRendererBindTextureResource = resolver.Resolve(SYM_ENTITYRENDERER_BINDTEXTURE_RESOURCE); + pItemRendererRenderItemBillboard = resolver.Resolve(SYM_ITEMRENDERER_RENDERITEMBILLBOARD); + pCompassTextureCycleFrames = resolver.Resolve(SYM_COMPASS_CYCLEFRAMES); + pClockTextureCycleFrames = resolver.Resolve(SYM_CLOCK_CYCLEFRAMES); + pCompassTextureGetSourceWidth = resolver.Resolve(SYM_COMPASS_GETSOURCEWIDTH); + pCompassTextureGetSourceHeight = resolver.Resolve(SYM_COMPASS_GETSOURCEHEIGHT); + pClockTextureGetSourceWidth = resolver.Resolve(SYM_CLOCK_GETSOURCEWIDTH); + pClockTextureGetSourceHeight = resolver.Resolve(SYM_CLOCK_GETSOURCEHEIGHT); + pTexturesBindTextureResource = resolver.Resolve(SYM_TEXTURES_BIND_RESOURCE); + pTexturesLoadTextureByName = resolver.Resolve(SYM_TEXTURES_LOAD_BY_NAME); + pTexturesLoadTextureByIndex = resolver.Resolve(SYM_TEXTURES_LOAD_BY_INDEX_PUBLIC); + if (!pTexturesLoadTextureByIndex) + pTexturesLoadTextureByIndex = resolver.Resolve(SYM_TEXTURES_LOAD_BY_INDEX_PRIVATE); + pTexturesReadImage = resolver.Resolve(SYM_TEXTURES_READIMAGE); + pStitchedGetU0 = resolver.Resolve(SYM_STITCHED_GETU0); + pStitchedGetU1 = resolver.Resolve(SYM_STITCHED_GETU1); + pStitchedGetV0 = resolver.Resolve(SYM_STITCHED_GETV0); + pStitchedGetV1 = resolver.Resolve(SYM_STITCHED_GETV1); + pBufferedImageCtorFile = resolver.Resolve(SYM_BUFFEREDIMAGE_CTOR_FILE); + pBufferedImageCtorDLCPack = resolver.Resolve(SYM_BUFFEREDIMAGE_CTOR_DLC); + pTextureManagerCreateTexture = resolver.Resolve(SYM_TEXTUREMANAGER_CREATETEXTURE); + pTextureTransferFromImage = resolver.Resolve(SYM_TEXTURE_TRANSFERFROMIMAGE); + pTextureAtlasLocationBlocks = resolver.Resolve(SYM_TEXATLAS_BLOCKS); + pTextureAtlasLocationItems = resolver.Resolve(SYM_TEXATLAS_ITEMS); + + if (!pOperatorNew) + pOperatorNew = GetProcAddress(GetModuleHandleA("vcruntime140.dll"), SYM_OPERATOR_NEW); + if (!pOperatorNew) + pOperatorNew = GetProcAddress(GetModuleHandleA("vcruntime140d.dll"), SYM_OPERATOR_NEW); + if (!pOperatorNew) + pOperatorNew = GetProcAddress(GetModuleHandle(nullptr), SYM_OPERATOR_NEW); + + return true; +} + +void TextureSymbols::Log() const +{ + LogSym("PreStitchedTextureMap::loadUVs", pLoadUVs); + LogSym("PreStitchedTextureMap::stitch", pPreStitchedTextureMapStitch); + LogSym("SimpleIcon::SimpleIcon", pSimpleIconCtor); + LogSym("operator new", pOperatorNew); + LogSym("registerIcon", pRegisterIcon); + LogSym("EntityRenderer::bindTexture(ResourceLocation)", pEntityRendererBindTextureResource); + LogSym("ItemRenderer::renderItemBillboard", pItemRendererRenderItemBillboard); + LogSym("CompassTexture::cycleFrames", pCompassTextureCycleFrames); + LogSym("ClockTexture::cycleFrames", pClockTextureCycleFrames); + LogSym("CompassTexture::getSourceWidth", pCompassTextureGetSourceWidth); + LogSym("CompassTexture::getSourceHeight", pCompassTextureGetSourceHeight); + LogSym("ClockTexture::getSourceWidth", pClockTextureGetSourceWidth); + LogSym("ClockTexture::getSourceHeight", pClockTextureGetSourceHeight); + LogSym("Textures::bindTexture(ResourceLocation)", pTexturesBindTextureResource); + LogSym("Textures::loadTexture(TEXTURE_NAME,wstring)", pTexturesLoadTextureByName); + LogSym("Textures::loadTexture(int)", pTexturesLoadTextureByIndex); + LogSym("Textures::readImage(TEXTURE_NAME,wstring)", pTexturesReadImage); + LogSym("StitchedTexture::getU0", pStitchedGetU0); + LogSym("StitchedTexture::getU1", pStitchedGetU1); + LogSym("StitchedTexture::getV0", pStitchedGetV0); + LogSym("StitchedTexture::getV1", pStitchedGetV1); + LogSym("BufferedImage::BufferedImage(file)", pBufferedImageCtorFile); + LogSym("BufferedImage::BufferedImage(DLCPack)", pBufferedImageCtorDLCPack); + LogSym("TextureManager::createTexture", pTextureManagerCreateTexture); + LogSym("Texture::transferFromImage", pTextureTransferFromImage); + LogSym("TextureAtlas::LOCATION_BLOCKS", pTextureAtlasLocationBlocks); + LogSym("TextureAtlas::LOCATION_ITEMS", pTextureAtlasLocationItems); +} + +bool ItemSymbols::Resolve(SymbolResolver& resolver) +{ + pItemInstanceGetIcon = resolver.Resolve(SYM_ITEMINSTANCE_GETICON); + pItemInstanceMineBlock = resolver.Resolve(SYM_ITEMINSTANCE_MINEBLOCK); + pItemInstanceSave = resolver.Resolve(SYM_ITEMINSTANCE_SAVE); + pItemInstanceLoad = resolver.Resolve(SYM_ITEMINSTANCE_LOAD); + pItemInstanceHurtAndBreak = resolver.Resolve(SYM_ITEMINSTANCE_HURTANDBREAK); + pItemMineBlock = resolver.Resolve(SYM_ITEM_MINEBLOCK); + pDiggerItemMineBlock = resolver.Resolve(SYM_DIGGERITEM_MINEBLOCK); + pPickaxeItemGetDestroySpeed = resolver.Resolve(SYM_PICKAXEITEM_GETDESTROYSPEED); + pPickaxeItemCanDestroySpecial = resolver.Resolve(SYM_PICKAXEITEM_CANDESTROYSPECIAL); + pShovelItemGetDestroySpeed = resolver.Resolve(SYM_SHOVELITEM_GETDESTROYSPEED); + pShovelItemCanDestroySpecial = resolver.Resolve(SYM_SHOVELITEM_CANDESTROYSPECIAL); + if (!pShovelItemGetDestroySpeed) + pShovelItemGetDestroySpeed = resolver.ResolveExact("DiggerItem::getDestroySpeed"); + return true; +} + +void ItemSymbols::Log() const +{ + LogSym("ItemInstance::getIcon", pItemInstanceGetIcon); + LogSym("ItemInstance::mineBlock", pItemInstanceMineBlock); + LogSym("ItemInstance::save", pItemInstanceSave); + LogSym("ItemInstance::load", pItemInstanceLoad); + LogSym("ItemInstance::hurtAndBreak", pItemInstanceHurtAndBreak); + LogSym("Item::mineBlock", pItemMineBlock); + LogSym("DiggerItem::mineBlock", pDiggerItemMineBlock); + LogSym("PickaxeItem::getDestroySpeed", pPickaxeItemGetDestroySpeed); + LogSym("PickaxeItem::canDestroySpecial", pPickaxeItemCanDestroySpecial); + LogSym("ShovelItem::getDestroySpeed", pShovelItemGetDestroySpeed); + LogSym("ShovelItem::canDestroySpecial", pShovelItemCanDestroySpecial); +} + +bool TileSymbols::Resolve(SymbolResolver& resolver) +{ + pTileOnPlace = resolver.Resolve(SYM_TILE_ONPLACE); + pTileNeighborChanged = resolver.Resolve(SYM_TILE_NEIGHBORCHANGED); + pTileTick = resolver.Resolve(SYM_TILE_TICK); + pTileGetResource = resolver.Resolve(SYM_TILE_GETRESOURCE); + pTileCloneTileId = resolver.Resolve(SYM_TILE_CLONETILEID); + pTileGetTextureFaceData = resolver.Resolve(SYM_TILE_GETTEXTURE_FACEDATA); + pStoneSlabGetTexture = resolver.Resolve(SYM_STONESLAB_GETTEXTURE); + pWoodSlabGetTexture = resolver.Resolve(SYM_WOODSLAB_GETTEXTURE); + pStoneSlabGetResource = resolver.Resolve(SYM_STONESLAB_GETRESOURCE); + pWoodSlabGetResource = resolver.Resolve(SYM_WOODSLAB_GETRESOURCE); + pStoneSlabGetDescriptionId = resolver.Resolve(SYM_STONESLAB_GETDESCRIPTIONID); + pWoodSlabGetDescriptionId = resolver.Resolve(SYM_WOODSLAB_GETDESCRIPTIONID); + pStoneSlabGetAuxName = resolver.Resolve(SYM_STONESLAB_GETAUXNAME); + pWoodSlabGetAuxName = resolver.Resolve(SYM_WOODSLAB_GETAUXNAME); + pStoneSlabRegisterIcons = resolver.Resolve(SYM_STONESLAB_REGISTERICONS); + pWoodSlabRegisterIcons = resolver.Resolve(SYM_WOODSLAB_REGISTERICONS); + pStoneSlabItemGetIcon = resolver.Resolve(SYM_STONESLABITEM_GETICON); + pStoneSlabItemGetDescriptionId = resolver.Resolve(SYM_STONESLABITEM_GETDESCRIPTIONID); + pHalfSlabCloneTileId = resolver.Resolve(SYM_HALFSLAB_CLONETILEID); + pTileTiles = resolver.Resolve(SYM_TILE_TILES); + + if (resolver.IsStub(pTileOnPlace)) + pTileOnPlace = resolver.ResolveExact("Tile::onPlace"); + if (resolver.IsStub(pTileNeighborChanged)) + pTileNeighborChanged = resolver.ResolveExact("Tile::neighborChanged"); + if (resolver.IsStub(pTileTick)) + pTileTick = resolver.ResolveExact("Tile::tick"); + if (resolver.IsStub(pWoodSlabRegisterIcons)) + pWoodSlabRegisterIcons = resolver.ResolveExact("WoodSlabTile::registerIcons"); + return true; +} + +void TileSymbols::Log() const +{ + LogSym("Tile::onPlace", pTileOnPlace); + LogSym("Tile::neighborChanged", pTileNeighborChanged); + LogSym("Tile::tick", pTileTick); + LogSym("Tile::getResource", pTileGetResource); + LogSym("Tile::cloneTileId", pTileCloneTileId); + LogSym("Tile::getTexture(face,data)", pTileGetTextureFaceData); + LogSym("StoneSlabTile::getTexture", pStoneSlabGetTexture); + LogSym("WoodSlabTile::getTexture", pWoodSlabGetTexture); + LogSym("StoneSlabTile::getResource", pStoneSlabGetResource); + LogSym("WoodSlabTile::getResource", pWoodSlabGetResource); + LogSym("StoneSlabTile::getDescriptionId", pStoneSlabGetDescriptionId); + LogSym("WoodSlabTile::getDescriptionId", pWoodSlabGetDescriptionId); + LogSym("StoneSlabTile::getAuxName", pStoneSlabGetAuxName); + LogSym("WoodSlabTile::getAuxName", pWoodSlabGetAuxName); + LogSym("StoneSlabTile::registerIcons", pStoneSlabRegisterIcons); + LogSym("WoodSlabTile::registerIcons", pWoodSlabRegisterIcons); + LogSym("StoneSlabTileItem::getIcon", pStoneSlabItemGetIcon); + LogSym("StoneSlabTileItem::getDescriptionId", pStoneSlabItemGetDescriptionId); + LogSym("HalfSlabTile::cloneTileId", pHalfSlabCloneTileId); + LogSym("Tile::tiles", pTileTiles); +} + +bool LevelSymbols::Resolve(SymbolResolver& resolver) +{ + pLevelUpdateNeighborsAt = resolver.Resolve(SYM_LEVEL_UPDATE_NEIGHBORS_AT); + pServerLevelTickPendingTicks = resolver.Resolve(SYM_SERVERLEVEL_TICKPENDINGTICKS); + pLevelGetTile = resolver.Resolve(SYM_LEVEL_GETTILE); + pLevelSetData = resolver.Resolve(SYM_LEVEL_SETDATA); + pMcRegionChunkStorageLoad = resolver.Resolve(SYM_MCREGIONCHUNKSTORAGE_LOAD); + if (!pMcRegionChunkStorageLoad) + pMcRegionChunkStorageLoad = resolver.ResolveExact("McRegionChunkStorage::load"); + pMcRegionChunkStorageSave = resolver.Resolve(SYM_MCREGIONCHUNKSTORAGE_SAVE); + if (!pMcRegionChunkStorageSave) + pMcRegionChunkStorageSave = resolver.ResolveExact("McRegionChunkStorage::save"); + pLevelSetTileAndData = resolver.Resolve(SYM_LEVEL_SETTILEANDDATA); + pLevelHasNeighborSignal = resolver.Resolve(SYM_LEVEL_HASNEIGHBORSIGNAL); + pLevelAddToTickNextTick = resolver.Resolve(SYM_LEVEL_ADDTOTICKNEXTTICK); + pServerLevelAddToTickNextTick = resolver.Resolve(SYM_SERVERLEVEL_ADDTOTICKNEXTTICK); + pLevelChunkGetTile = resolver.ResolveExact("LevelChunk::getTile"); + pLevelChunkSetTile = resolver.ResolveExact("LevelChunk::setTile"); + pLevelChunkGetPos = resolver.ResolveExact("LevelChunk::getPos"); + pLevelChunkGetHighestNonEmptyY = resolver.ResolveExact("LevelChunk::getHighestNonEmptyY"); + pCompressedTileStorageSet = resolver.ResolveExact("CompressedTileStorage::set"); + return true; +} + +void LevelSymbols::Log() const +{ + LogSym("Level::updateNeighborsAt", pLevelUpdateNeighborsAt); + LogSym("ServerLevel::tickPendingTicks", pServerLevelTickPendingTicks); + LogSym("Level::getTile", pLevelGetTile); + LogSym("Level::setData", pLevelSetData); + LogSym("McRegionChunkStorage::load", pMcRegionChunkStorageLoad); + LogSym("McRegionChunkStorage::save", pMcRegionChunkStorageSave); + LogSym("Level::setTileAndData", pLevelSetTileAndData); + LogSym("Level::hasNeighborSignal", pLevelHasNeighborSignal); + LogSym("Level::addToTickNextTick", pLevelAddToTickNextTick); + LogSym("ServerLevel::addToTickNextTick", pServerLevelAddToTickNextTick); + LogSym("LevelChunk::getTile", pLevelChunkGetTile); + LogSym("LevelChunk::setTile", pLevelChunkSetTile); + LogSym("LevelChunk::getPos", pLevelChunkGetPos); + LogSym("LevelChunk::getHighestNonEmptyY", pLevelChunkGetHighestNonEmptyY); + LogSym("CompressedTileStorage::set", pCompressedTileStorageSet); +} + +bool EntitySymbols::Resolve(SymbolResolver& resolver) +{ + pPlayerCanDestroy = resolver.Resolve(SYM_PLAYER_CANDESTROY); + pServerPlayerGameModeUseItem = resolver.Resolve(SYM_SERVER_PLAYER_GAMEMODE_USEITEM); + pMultiPlayerGameModeUseItem = resolver.Resolve(SYM_MULTI_PLAYER_GAMEMODE_USEITEM); + pLevelAddEntity = resolver.Resolve(SYM_LEVEL_ADDENTITY); + pEntityIONewById = resolver.Resolve(SYM_ENTITYIO_NEWBYID); + pEntityMoveTo = resolver.Resolve(SYM_ENTITY_MOVETO); + pEntitySetPos = resolver.Resolve(SYM_ENTITY_SETPOS); + pEntityGetLookAngle = resolver.Resolve(SYM_LIVINGENTITY_GETLOOKANGLE); + pLivingEntityGetViewVector = resolver.Resolve(SYM_LIVINGENTITY_GETVIEWVECTOR); + if (!pEntityGetLookAngle) + pEntityGetLookAngle = resolver.Resolve(SYM_ENTITY_GETLOOKANGLE); + pEntityLerpMotion = resolver.Resolve(SYM_ENTITY_LERPMOTION); + return true; +} + +void EntitySymbols::Log() const +{ + LogSym("Player::canDestroy", pPlayerCanDestroy); + LogSym("ServerPlayerGameMode::useItem", pServerPlayerGameModeUseItem); + LogSym("MultiPlayerGameMode::useItem", pMultiPlayerGameModeUseItem); + LogSym("Level::addEntity", pLevelAddEntity); + LogSym("EntityIO::newById", pEntityIONewById); + LogSym("Entity::moveTo", pEntityMoveTo); + LogSym("Entity::setPos", pEntitySetPos); + LogSym("LivingEntity/Entity::getLookAngle", pEntityGetLookAngle); + LogSym("LivingEntity::getViewVector", pLivingEntityGetViewVector); + LogSym("Entity::lerpMotion", pEntityLerpMotion); +} + +bool InventorySymbols::Resolve(SymbolResolver& resolver) +{ + pInventoryRemoveResource = resolver.Resolve(SYM_INVENTORY_REMOVERESOURCE); + pInventoryVtable = resolver.Resolve(SYM_INVENTORY_VFTABLE); + pAbstractContainerMenuBroadcastChanges = resolver.Resolve(SYM_ABSTRACTCONTAINERMENU_BROADCASTCHANGES); + return true; +} + +void InventorySymbols::Log() const +{ + LogSym("Inventory::removeResource", pInventoryRemoveResource); + LogSym("Inventory::vftable", pInventoryVtable); + LogSym("AbstractContainerMenu::broadcastChanges", pAbstractContainerMenuBroadcastChanges); +} + +bool NbtSymbols::Resolve(SymbolResolver& resolver) +{ + pTagNewTag = resolver.Resolve(SYM_TAG_NEWTAG); + if (!pTagNewTag) + pTagNewTag = resolver.ResolveExact("Tag::newTag"); + return true; +} + +void NbtSymbols::Log() const +{ + LogSym("Tag::newTag", pTagNewTag); +} diff --git a/WeaveLoaderRuntime/src/Symbols/SymbolGroups.h b/WeaveLoaderRuntime/src/Symbols/SymbolGroups.h new file mode 100644 index 0000000..ac83c92 --- /dev/null +++ b/WeaveLoaderRuntime/src/Symbols/SymbolGroups.h @@ -0,0 +1,176 @@ +#pragma once + +class SymbolResolver; + +struct CoreSymbols +{ + void* pRunStaticCtors = nullptr; + void* pMinecraftTick = nullptr; + void* pMinecraftInit = nullptr; + void* pMinecraftSetLevel = nullptr; + void* pExitGame = nullptr; + void* pPresent = nullptr; + void* pMinecraftApp = nullptr; + void* pGetMinecraftLanguage = nullptr; + void* pGetMinecraftLocale = nullptr; + + bool Resolve(SymbolResolver& resolver); + void Log() const; + bool HasCritical() const; +}; + +struct UiSymbols +{ + void* pCreativeStaticCtor = nullptr; + void* pMainMenuCustomDraw = nullptr; + void* pGetString = nullptr; + + bool Resolve(SymbolResolver& resolver); + void Log() const; +}; + +struct ResourceSymbols +{ + void* pGetResourceAsStream = nullptr; + void* pAbstractTexturePackGetImageResource = nullptr; + void* pDLCTexturePackGetImageResource = nullptr; + + bool Resolve(SymbolResolver& resolver); + void Log() const; +}; + +struct TextureSymbols +{ + void* pLoadUVs = nullptr; + void* pPreStitchedTextureMapStitch = nullptr; + void* pSimpleIconCtor = nullptr; + void* pOperatorNew = nullptr; + void* pRegisterIcon = nullptr; + void* pEntityRendererBindTextureResource = nullptr; + void* pItemRendererRenderItemBillboard = nullptr; + void* pCompassTextureCycleFrames = nullptr; + void* pClockTextureCycleFrames = nullptr; + void* pCompassTextureGetSourceWidth = nullptr; + void* pCompassTextureGetSourceHeight = nullptr; + void* pClockTextureGetSourceWidth = nullptr; + void* pClockTextureGetSourceHeight = nullptr; + void* pTexturesBindTextureResource = nullptr; + void* pTexturesLoadTextureByName = nullptr; + void* pTexturesLoadTextureByIndex = nullptr; + void* pTexturesReadImage = nullptr; + void* pStitchedGetU0 = nullptr; + void* pStitchedGetU1 = nullptr; + void* pStitchedGetV0 = nullptr; + void* pStitchedGetV1 = nullptr; + void* pBufferedImageCtorFile = nullptr; + void* pBufferedImageCtorDLCPack = nullptr; + void* pTextureManagerCreateTexture = nullptr; + void* pTextureTransferFromImage = nullptr; + void* pTextureAtlasLocationBlocks = nullptr; + void* pTextureAtlasLocationItems = nullptr; + + bool Resolve(SymbolResolver& resolver); + void Log() const; +}; + +struct ItemSymbols +{ + void* pItemInstanceGetIcon = nullptr; + void* pItemInstanceMineBlock = nullptr; + void* pItemInstanceSave = nullptr; + void* pItemInstanceLoad = nullptr; + void* pItemInstanceHurtAndBreak = nullptr; + void* pItemMineBlock = nullptr; + void* pDiggerItemMineBlock = nullptr; + void* pPickaxeItemGetDestroySpeed = nullptr; + void* pPickaxeItemCanDestroySpecial = nullptr; + void* pShovelItemGetDestroySpeed = nullptr; + void* pShovelItemCanDestroySpecial = nullptr; + + bool Resolve(SymbolResolver& resolver); + void Log() const; +}; + +struct TileSymbols +{ + void* pTileOnPlace = nullptr; + void* pTileNeighborChanged = nullptr; + void* pTileTick = nullptr; + void* pTileGetResource = nullptr; + void* pTileCloneTileId = nullptr; + void* pTileGetTextureFaceData = nullptr; + void* pStoneSlabGetTexture = nullptr; + void* pWoodSlabGetTexture = nullptr; + void* pStoneSlabGetResource = nullptr; + void* pWoodSlabGetResource = nullptr; + void* pStoneSlabGetDescriptionId = nullptr; + void* pWoodSlabGetDescriptionId = nullptr; + void* pStoneSlabGetAuxName = nullptr; + void* pWoodSlabGetAuxName = nullptr; + void* pStoneSlabRegisterIcons = nullptr; + void* pWoodSlabRegisterIcons = nullptr; + void* pStoneSlabItemGetIcon = nullptr; + void* pStoneSlabItemGetDescriptionId = nullptr; + void* pHalfSlabCloneTileId = nullptr; + void* pTileTiles = nullptr; + + bool Resolve(SymbolResolver& resolver); + void Log() const; +}; + +struct LevelSymbols +{ + void* pLevelUpdateNeighborsAt = nullptr; + void* pServerLevelTickPendingTicks = nullptr; + void* pLevelGetTile = nullptr; + void* pLevelSetData = nullptr; + void* pMcRegionChunkStorageLoad = nullptr; + void* pMcRegionChunkStorageSave = nullptr; + void* pLevelSetTileAndData = nullptr; + void* pLevelHasNeighborSignal = nullptr; + void* pLevelAddToTickNextTick = nullptr; + void* pServerLevelAddToTickNextTick = nullptr; + void* pLevelChunkGetTile = nullptr; + void* pLevelChunkSetTile = nullptr; + void* pLevelChunkGetPos = nullptr; + void* pLevelChunkGetHighestNonEmptyY = nullptr; + void* pCompressedTileStorageSet = nullptr; + + bool Resolve(SymbolResolver& resolver); + void Log() const; +}; + +struct EntitySymbols +{ + void* pPlayerCanDestroy = nullptr; + void* pServerPlayerGameModeUseItem = nullptr; + void* pMultiPlayerGameModeUseItem = nullptr; + void* pLevelAddEntity = nullptr; + void* pEntityIONewById = nullptr; + void* pEntityMoveTo = nullptr; + void* pEntitySetPos = nullptr; + void* pEntityGetLookAngle = nullptr; + void* pLivingEntityGetViewVector = nullptr; + void* pEntityLerpMotion = nullptr; + + bool Resolve(SymbolResolver& resolver); + void Log() const; +}; + +struct InventorySymbols +{ + void* pInventoryRemoveResource = nullptr; + void* pInventoryVtable = nullptr; + void* pAbstractContainerMenuBroadcastChanges = nullptr; + + bool Resolve(SymbolResolver& resolver); + void Log() const; +}; + +struct NbtSymbols +{ + void* pTagNewTag = nullptr; + + bool Resolve(SymbolResolver& resolver); + void Log() const; +};