| 45 | } |
| 46 | |
| 47 | void Init() |
| 48 | { |
| 49 | auto pattern = hook::pattern("8B 0D ? ? ? ? 50 51 89 54 24"); |
| 50 | hWnd.SetAddress(*pattern.get_first<HWND*>(2)); |
| 51 | |
| 52 | pattern = hook::pattern("A3 ? ? ? ? 89 35 ? ? ? ? C6 05"); |
| 53 | ResX.SetAddress(*pattern.get_first<int*>(1)); |
| 54 | ResY.SetAddress(*pattern.get_first<int*>(7)); |
| 55 | |
| 56 | pattern = hook::pattern("A1 ? ? ? ? 85 C0 75 ? C3 8B 40"); |
| 57 | TheGameFlowManager.SetAddress(*pattern.get_first<GameFlowManager*>(1)); |
| 58 | |
| 59 | pattern = hook::pattern("8B 15 ? ? ? ? F7 DA 1B D2 83 E2 ? 3B C3"); |
| 60 | dwWindowedMode.SetAddress(*pattern.get_first<uint32_t*>(2)); |
| 61 | |
| 62 | pattern = hook::pattern("6A ? 68 ? ? ? ? 64 A1 ? ? ? ? 50 83 EC ? 56 A1 ? ? ? ? 33 C4 50 8D 44 24 ? 64 A3 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? E8 ? ? ? ? E8"); |
| 63 | shMainLoop = safetyhook::create_inline(pattern.get_first(), MainLoop); |
| 64 | |
| 65 | pattern = hook::pattern("51 E9 ? ? ? ? 50 E8"); |
| 66 | shMiniMainLoop = safetyhook::create_inline(pattern.get_first(), MiniMainLoop); |
| 67 | |
| 68 | pattern = hook::pattern("E8 ? ? ? ? ? ? ? ? 84 C0 0F 57 C9"); |
| 69 | GameFlowManager::IsPaused = decltype(GameFlowManager::IsPaused)(injector::GetBranchDestination(pattern.get_first()).get()); |
| 70 | |
| 71 | pattern = hook::pattern("F3 0F 10 05 ? ? ? ? B8 ? ? ? ? F3 0F 11 44 24"); |
| 72 | Sim::Internal::mLastFrameTime.SetAddress(*pattern.get_first<float*>(4)); |
| 73 | |
| 74 | pattern = hook::pattern("A1 ? ? ? ? 53 8B 5C 24 08 56 57 8B 38 74 19"); |
| 75 | Direct3DDevice.SetAddress(*pattern.get_first<IDirect3DDevice9***>(1)); |
| 76 | |
| 77 | pattern = hook::pattern("81 C7 ? ? ? ? 57 50 FF D2"); |
| 78 | static auto BeforeResetHook = safetyhook::create_mid(pattern.get_first(), [](SafetyHookContext& regs) |
| 79 | { |
| 80 | WFP::onBeforeReset().executeAll(); |
| 81 | }); |
| 82 | |
| 83 | pattern = hook::pattern("8B 91 ? ? ? ? 57 FF D2 ? ? 8B 48"); |
| 84 | static auto BeforeEndSceneHook = safetyhook::create_mid(pattern.get_first(), [](SafetyHookContext& regs) |
| 85 | { |
| 86 | WFP::onEndScene().executeAll(); |
| 87 | }); |
| 88 | |
| 89 | WFP::onInitEvent().executeAll(); |
| 90 | |
| 91 | static auto futures = WFP::onInitEventAsync().executeAllAsync(); |
| 92 | |
| 93 | WFP::onGameInitEvent() += []() |
| 94 | { |
| 95 | for (auto& f : futures.get()) |
| 96 | f.wait(); |
| 97 | futures.get().clear(); |
| 98 | }; |
| 99 | } |
| 100 | |
| 101 | CEXP void InitializeASI() |
| 102 | { |
nothing calls this directly
no test coverage detected