Запрещено публиковать исходный код без BB-кода — CODE
Я пытаюсь получить объект Player из перехваченной функции.
Перехват вызывается, указатели передаются правильно, но при вызове GetPlayer из .uc игра зависает (без сбоя)
Что я делаю не так?
У меня есть подозрение, что .uc не принимает класс из самого Engine и его нужно как-то сериализовать?
Перехват вызывается, указатели передаются правильно, но при вызове GetPlayer из .uc игра зависает (без сбоя)
Что я делаю не так?
У меня есть подозрение, что .uc не принимает класс из самого Engine и его нужно как-то сериализовать?
void hookEngine(){ auto hEngine = GetModuleHandleA("Engine.dll"); if (hEngine) { auto targetFunction = reinterpret_cast<LPVOID>(GetProcAddress(hEngine, "?SetPlayer@APlayerController@@QAEXPAVUPlayer@@@Z")); if (targetFunction) { if (MH_Initialize() == MH_OK) { if (MH_CreateHook(targetFunction, reinterpret_cast<LPVOID>(&HookedSetPlayer), reinterpret_cast<LPVOID *>(&OriginalSetPlayer)) == MH_OK) { MH_EnableHook(targetFunction); } } } }}int __fastcall HookedSetPlayer(UObject *thisPtr, void *unused, UObject *a2){ char message[256]; sprintf_s(message, sizeof(message), "SetPlayer called with this: %p, NewPlayer: %p", thisPtr, a2); MessageBoxA(NULL, message, "SetPlayer Hook", MB_OK | MB_ICONINFORMATION); LastSetPlayer = a2; return OriginalSetPlayer(thisPtr, a2);}void __stdcall GetPlayer(FFrame &Stack, void *Result){ if (!LastSetActor) { *((UObject **)Result) = nullptr; return; } *((UObject **)Result) = LastSetPlayer;}
