CheatMenuSA/src/hook.cpp

349 lines
7.5 KiB
C++
Raw Normal View History

2021-10-25 10:03:27 -04:00
#include "pch.h"
2021-09-20 08:41:40 -04:00
#include "hook.h"
2021-10-24 18:08:00 -04:00
#include "../depend/kiero/kiero.h"
#include "../depend/kiero/minhook/MinHook.h"
2021-10-25 10:03:27 -04:00
#include "../depend/imgui/imgui_impl_dx9.h"
#include "../depend/imgui/imgui_impl_dx11.h"
#include "../depend/imgui/imgui_impl_win32.h"
2021-10-16 17:01:02 -04:00
#include <dinput.h>
#define DIMOUSE ((LPDIRECTINPUTDEVICE8)(RsGlobal.ps->diMouse))
2020-12-02 16:19:16 -05:00
LRESULT Hook::WndProc(const HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
2020-12-02 16:19:16 -05:00
{
2021-10-25 10:03:27 -04:00
ImGui_ImplWin32_WndProcHandler(hWnd, uMsg, wParam, lParam);
2020-12-02 16:19:16 -05:00
2021-10-25 10:03:27 -04:00
if (ImGui::GetIO().WantTextInput)
{
2021-08-06 11:53:18 -04:00
#ifdef GTASA
2021-10-25 10:03:27 -04:00
Call<0x53F1E0>(); // CPad::ClearKeyboardHistory
2021-08-06 11:53:18 -04:00
#endif
2021-10-25 10:03:27 -04:00
return 1;
}
2021-02-24 16:54:45 -05:00
2021-10-25 10:03:27 -04:00
return CallWindowProc(oWndProc, hWnd, uMsg, wParam, lParam);
2020-12-02 16:19:16 -05:00
}
2021-10-25 10:03:27 -04:00
HRESULT Hook::Reset(IDirect3DDevice9* pDevice, D3DPRESENT_PARAMETERS* pPresentationParameters)
2020-12-02 16:19:16 -05:00
{
2021-10-25 10:03:27 -04:00
ImGui_ImplDX9_InvalidateDeviceObjects();
2020-12-02 16:19:16 -05:00
2021-10-25 10:03:27 -04:00
return oReset(pDevice, pPresentationParameters);
2020-12-02 16:19:16 -05:00
}
2021-10-25 10:03:27 -04:00
void Hook::RenderFrame(void* ptr)
2020-12-02 16:19:16 -05:00
{
2021-10-25 10:03:27 -04:00
if (!ImGui::GetCurrentContext())
{
2021-11-11 02:55:47 -05:00
ImGui::CreateContext();
2021-10-25 10:03:27 -04:00
}
ImGuiIO& io = ImGui::GetIO();
static bool bInit = false;
if (bInit)
{
ShowMouse(m_bShowMouse);
2021-11-11 02:55:47 -05:00
// Scale the menu if game resolution changed
2021-10-25 10:03:27 -04:00
static ImVec2 fScreenSize = ImVec2(-1, -1);
ImVec2 size(screen::GetScreenWidth(), screen::GetScreenHeight());
if (fScreenSize.x != size.x && fScreenSize.y != size.y)
{
2021-11-05 05:59:11 -04:00
FontMgr::ReinitFonts();
2021-10-25 10:03:27 -04:00
if (gRenderer == Render_DirectX9)
{
ImGui_ImplDX9_InvalidateDeviceObjects();
}
else
{
ImGui_ImplDX11_InvalidateDeviceObjects();
}
ImGuiStyle* style = &ImGui::GetStyle();
float scaleX = size.x / 1366.0f;
float scaleY = size.y / 768.0f;
2021-11-05 05:59:11 -04:00
style->FramePadding = ImVec2(5 * scaleX, 5 * scaleY);
2021-10-25 10:03:27 -04:00
style->ItemSpacing = ImVec2(8 * scaleX, 4 * scaleY);
style->ScrollbarSize = 12 * scaleX;
style->IndentSpacing = 20 * scaleX;
2021-11-05 05:59:11 -04:00
style->ItemInnerSpacing = ImVec2(5 * scaleX, 5 * scaleY);
2021-10-25 10:03:27 -04:00
fScreenSize = size;
}
ImGui_ImplWin32_NewFrame();
if (gRenderer == Render_DirectX9)
{
ImGui_ImplDX9_NewFrame();
}
else
{
ImGui_ImplDX11_NewFrame();
}
ImGui::NewFrame();
2021-11-11 02:55:47 -05:00
if (pCallbackFunc != nullptr)
2021-10-25 10:03:27 -04:00
{
2021-11-11 02:55:47 -05:00
pCallbackFunc();
2021-10-25 10:03:27 -04:00
}
ImGui::EndFrame();
ImGui::Render();
if (gRenderer == Render_DirectX9)
{
ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData());
}
else
{
ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData());
}
}
else
{
bInit = true;
ImGui_ImplWin32_Init(RsGlobal.ps->window);
2021-02-24 16:54:45 -05:00
2021-08-06 11:53:18 -04:00
#ifdef GTASA
2021-10-25 10:03:27 -04:00
// shift trigger fix
patch::Nop(0x00531155, 5);
2021-08-06 11:53:18 -04:00
#endif
2020-12-02 16:19:16 -05:00
2021-10-25 10:03:27 -04:00
if (gRenderer == Render_DirectX9)
{
ImGui_ImplDX9_Init(reinterpret_cast<IDirect3DDevice9*>(ptr));
}
else
{
// for dx11 device ptr is swapchain
reinterpret_cast<IDXGISwapChain*>(ptr)->GetDevice(__uuidof(ID3D11Device), &ptr);
ID3D11DeviceContext* context;
reinterpret_cast<ID3D11Device*>(ptr)->GetImmediateContext(&context);
ImGui_ImplDX11_Init(reinterpret_cast<ID3D11Device*>(ptr), context);
}
ImGui_ImplWin32_EnableDpiAwareness();
2021-11-05 05:59:11 -04:00
// Loading fonts
io.FontDefault = FontMgr::LoadFont("text", 1.0f);
FontMgr::LoadFont("title", 2.0f);
FontMgr::LoadFont("header", 1.25f);
2021-10-25 10:03:27 -04:00
io.IniFilename = nullptr;
io.LogFilename = nullptr;
io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad;
oWndProc = (WNDPROC)SetWindowLongPtr(RsGlobal.ps->window, GWL_WNDPROC, (LRESULT)WndProc);
}
}
2020-12-02 16:19:16 -05:00
2021-10-25 10:03:27 -04:00
HRESULT Hook::Dx9Handler(IDirect3DDevice9* pDevice)
{
2021-10-25 10:03:27 -04:00
RenderFrame(pDevice);
return oEndScene(pDevice);
}
2021-10-25 10:03:27 -04:00
HRESULT Hook::Dx11Handler(IDXGISwapChain* pSwapChain, UINT SyncInterval, UINT Flags)
{
2021-10-25 10:03:27 -04:00
RenderFrame(pSwapChain);
return oPresent11(pSwapChain, SyncInterval, Flags);
2020-12-02 16:19:16 -05:00
}
void Hook::ShowMouse(bool state)
{
2021-10-25 10:03:27 -04:00
// Disable player controls for controllers
bool bMouseDisabled = false;
bool isController;
2021-10-22 18:03:27 -04:00
#ifdef GTA3
2021-10-25 10:03:27 -04:00
isController = !patch::Get<BYTE>(0x5F03D8);
2021-10-22 18:03:27 -04:00
#elif GTAVC
2021-10-25 10:03:27 -04:00
isController = patch::Get<BYTE>(0x86968B);
2021-10-22 18:03:27 -04:00
#else // GTASA
2021-10-25 10:03:27 -04:00
isController = patch::Get<BYTE>(0xBA6818);
2021-10-22 18:03:27 -04:00
#endif
2021-10-25 10:03:27 -04:00
if (isController && (m_bShowMouse || bMouseDisabled))
{
2021-10-03 10:04:04 -04:00
#ifdef GTASA
2021-10-25 10:03:27 -04:00
CPlayerPed *player = FindPlayerPed();
CPad *pad = player ? player->GetPadFromPlayer() : NULL;
2021-10-21 18:23:02 -04:00
#else
2021-10-25 10:03:27 -04:00
CPad *pad = CPad::GetPad(0);
2021-10-03 10:04:04 -04:00
#endif
2021-10-25 10:03:27 -04:00
if (pad)
{
if (m_bShowMouse)
{
bMouseDisabled = true;
2021-10-21 18:23:02 -04:00
#ifdef GTA3
2021-10-25 10:03:27 -04:00
pad->m_bDisablePlayerControls = true;
#else //GTAVC & GTASA
pad->DisablePlayerControls = true;
2021-10-21 18:23:02 -04:00
#endif
2021-10-25 10:03:27 -04:00
}
else
{
bMouseDisabled = false;
2021-10-21 18:23:02 -04:00
#ifdef GTA3
2021-10-25 10:03:27 -04:00
pad->m_bDisablePlayerControls = false;
#else //GTAVC & GTASA
pad->DisablePlayerControls = false;
2021-10-21 18:23:02 -04:00
#endif
2021-10-25 10:03:27 -04:00
}
}
}
2021-10-02 11:30:17 -04:00
2021-10-25 10:03:27 -04:00
if (m_bMouseVisibility != m_bShowMouse)
{
ImGui::GetIO().MouseDrawCursor = state;
2021-02-24 16:54:45 -05:00
2021-08-06 11:53:18 -04:00
#ifdef GTASA
2021-10-25 10:03:27 -04:00
Hook::ApplyMouseFix(); // Reapply the patches
2021-10-21 18:23:02 -04:00
#else
2021-10-25 10:03:27 -04:00
if (m_bShowMouse)
{
patch::SetUChar(BY_GAME(0, 0x6020A0, 0x580D20), 0xC3); // psSetMousePos
patch::Nop(BY_GAME(0, 0x4AB6CA, 0x49272F), 5); // don't call CPad::UpdateMouse()
}
else
{
patch::SetUChar(BY_GAME(0, 0x6020A0, 0x580D20), 0x53);
2021-10-21 18:23:02 -04:00
#ifdef GTAVC
2021-10-25 10:03:27 -04:00
patch::SetRaw(0x4AB6CA, (char*)"\xE8\x51\x21\x00\x00", 5);
2021-10-21 18:23:02 -04:00
#else // GTA3
2021-10-25 10:03:27 -04:00
patch::SetRaw(0x49272F, (char*)"\xE8\x6C\xF5\xFF\xFF", 5);
2021-10-21 18:23:02 -04:00
#endif
2021-10-25 10:03:27 -04:00
}
2021-08-06 11:53:18 -04:00
#endif
2021-08-01 21:41:48 -04:00
2021-10-25 10:03:27 -04:00
CPad::NewMouseControllerState.X = 0;
CPad::NewMouseControllerState.Y = 0;
2021-10-21 18:23:02 -04:00
#ifdef GTA3
2021-10-25 10:03:27 -04:00
CPad::GetPad(0)->ClearMouseHistory();
2021-10-21 18:23:02 -04:00
#else // GTAVC & GTASA
2021-10-25 10:03:27 -04:00
CPad::ClearMouseHistory();
2021-10-21 18:23:02 -04:00
#endif
2021-10-25 10:03:27 -04:00
CPad::UpdatePads();
m_bMouseVisibility = m_bShowMouse;
}
}
2020-12-02 16:19:16 -05:00
Hook::Hook()
{
2021-10-25 10:03:27 -04:00
// Nvidia Overlay crash fix
if (init(kiero::RenderType::D3D9) == kiero::Status::Success)
{
gRenderer = Render_DirectX9;
kiero::bind(16, (void**)&oReset, Reset);
kiero::bind(42, (void**)&oEndScene, Dx9Handler);
}
else
{
// gtaRenderHook
if (init(kiero::RenderType::D3D11) == kiero::Status::Success)
{
gRenderer = Render_DirectX11;
kiero::bind(8, (void**)&oPresent11, Dx11Handler);
}
}
2020-12-02 16:19:16 -05:00
}
Hook::~Hook()
{
2021-10-25 10:03:27 -04:00
SetWindowLongPtr(RsGlobal.ps->window, GWL_WNDPROC, (LRESULT)oWndProc);
ImGui_ImplDX9_Shutdown();
ImGui_ImplWin32_Shutdown();
ImGui::DestroyContext();
kiero::shutdown();
2021-06-18 12:49:11 -04:00
}
2021-08-01 21:41:48 -04:00
#ifdef GTASA
struct Mouse
{
2021-10-25 10:03:27 -04:00
unsigned int x, y;
unsigned int wheelDelta;
unsigned char buttons[8];
};
struct MouseInfo
{
2021-10-25 10:03:27 -04:00
int x, y, wheelDelta;
} mouseInfo;
static BOOL __stdcall _SetCursorPos(int X, int Y)
{
2021-10-25 10:03:27 -04:00
if (Hook::m_bShowMouse || GetActiveWindow() != RsGlobal.ps->window)
{
return 1;
}
2021-10-25 10:03:27 -04:00
mouseInfo.x = X;
mouseInfo.y = Y;
2021-10-25 10:03:27 -04:00
return SetCursorPos(X, Y);
}
2021-10-25 10:03:27 -04:00
static LRESULT __stdcall _DispatchMessage(MSG* lpMsg)
{
2021-10-25 10:03:27 -04:00
if (lpMsg->message == WM_MOUSEWHEEL && !Hook::m_bShowMouse)
{
mouseInfo.wheelDelta += GET_WHEEL_DELTA_WPARAM(lpMsg->wParam);
}
2021-10-25 10:03:27 -04:00
return DispatchMessageA(lpMsg);
}
2021-10-25 10:03:27 -04:00
static int _cdecl _GetMouseState(Mouse* pMouse)
{
2021-10-25 10:03:27 -04:00
if (Hook::m_bShowMouse || !RsGlobal.ps->diMouse)
{
DIMOUSE->Unacquire();
return -1;
}
if (DIMOUSE->GetDeviceState(sizeof(Mouse), pMouse) < 0)
{
if (DIMOUSE->Acquire() == DIERR_NOTINITIALIZED)
{
while (DIMOUSE->Acquire() == DIERR_NOTINITIALIZED);
}
}
pMouse->wheelDelta = mouseInfo.wheelDelta;
mouseInfo.wheelDelta = 0;
pMouse->buttons[0] = (GetAsyncKeyState(1) >> 8);
pMouse->buttons[1] = (GetAsyncKeyState(2) >> 8);
pMouse->buttons[2] = (GetAsyncKeyState(4) >> 8);
pMouse->buttons[3] = (GetAsyncKeyState(5) >> 8);
pMouse->buttons[4] = (GetAsyncKeyState(6) >> 8);
return 0;
}
void Hook::ApplyMouseFix()
{
2021-10-25 10:03:27 -04:00
patch::ReplaceFunctionCall(0x53F417, _GetMouseState);
patch::Nop(0x57C59B, 1);
patch::ReplaceFunctionCall(0x57C59C, _SetCursorPos);
patch::Nop(0x81E5D4, 1);
patch::ReplaceFunctionCall(0x81E5D5, _SetCursorPos);
patch::Nop(0x74542D, 1);
patch::ReplaceFunctionCall(0x74542E, _SetCursorPos);
patch::Nop(0x748A7C, 1);
patch::ReplaceFunctionCall(0x748A7D, _DispatchMessage);
patch::SetChar(0x746A08, 32); // diMouseOffset
patch::SetChar(0x746A58, 32); // diDeviceoffset
}
2021-08-01 21:41:48 -04:00
#endif