From eb8acf88fc6b42b149acc68759d8d80e803542b5 Mon Sep 17 00:00:00 2001 From: DarkDrifter Date: Tue, 27 Sep 2022 23:34:32 +0200 Subject: [PATCH 1/2] Fix weapon zoom getting affected by single player Fix weapon zoom in/out getting affected by single player key bindings. We now hook Direct Input scroll wheel data as the game seems to use this value rather than the windows messaging system to handle zoom. --- .../core/DXHook/CProxyDirectInputDevice8.cpp | 27 +++++++++++++++++++ Client/core/DXHook/CProxyDirectInputDevice8.h | 1 + 2 files changed, 28 insertions(+) diff --git a/Client/core/DXHook/CProxyDirectInputDevice8.cpp b/Client/core/DXHook/CProxyDirectInputDevice8.cpp index 83dd3c8cc79..b20d275fddd 100644 --- a/Client/core/DXHook/CProxyDirectInputDevice8.cpp +++ b/Client/core/DXHook/CProxyDirectInputDevice8.cpp @@ -19,6 +19,7 @@ CProxyDirectInputDevice8::CProxyDirectInputDevice8(IDirectInputDevice8A* pDevice // Initialize our device member variable. m_pDevice = pDevice; m_bDropDataIfInputGoesToGUI = true; + m_bIsMouse = false; // Don't block joystick if GUI wants input (so same as XInput joystick) DIDEVICEINSTANCE didi; @@ -31,13 +32,21 @@ CProxyDirectInputDevice8::CProxyDirectInputDevice8(IDirectInputDevice8A* pDevice uint uiHid = (didi.dwDevType >> 16) & 0xff; if (uiType == DI8DEVTYPE_GAMEPAD || uiType == DI8DEVTYPE_JOYSTICK) + { m_bDropDataIfInputGoesToGUI = false; + } + else if (uiType == DI8DEVTYPE_MOUSE) + { + m_bIsMouse = true; + } WriteDebugEvent(SString(" CProxyDirectInputDevice8 Device:%08x Type:0x%x SubType:0x%x HID:0x%x ProductName:%s", pDevice, uiType, uiSubType, uiHid, didi.tszProductName)); } else + { WriteDebugEvent(SString(" CProxyDirectInputDevice8 GetDeviceInfo failed:%08x", hResult)); + } } CProxyDirectInputDevice8::~CProxyDirectInputDevice8() @@ -124,6 +133,24 @@ HRESULT CProxyDirectInputDevice8::GetDeviceState(DWORD a, LPVOID b) } } + // HACK: Don't pass scroll wheel data to the game as it interfers with MTA key bindings + // Without this, zoom in/out with scroll wheel still happens when not bound to + // mouse wheel in MTA but bound in single player. + // A better option could be to instead give this data only when we want it (bound + // in MTA and when scrolling) to retain the proper smooth zoom, but it would require + // forcing the game to use this data even when not bound in single player. + if (m_bIsMouse) + { + hResult = m_pDevice->GetDeviceState(a, b); + + DIMOUSESTATE2* mouseState = reinterpret_cast(b); + mouseState->lZ = 0; + + m_pDevice->GetDeviceData(sizeof(DIDEVICEOBJECTDATA), NULL, &dwNumItems, 0); + + return hResult; + } + return m_pDevice->GetDeviceState(a, b); } diff --git a/Client/core/DXHook/CProxyDirectInputDevice8.h b/Client/core/DXHook/CProxyDirectInputDevice8.h index 347b073a074..d48d4bbb866 100644 --- a/Client/core/DXHook/CProxyDirectInputDevice8.h +++ b/Client/core/DXHook/CProxyDirectInputDevice8.h @@ -57,4 +57,5 @@ class CProxyDirectInputDevice8 : public IDirectInputDevice8A IDirectInputDevice8A* m_pDevice; bool m_bDropDataIfInputGoesToGUI; + bool m_bIsMouse; }; From 314f5c8b0930acb45a472bb58b57f34b0657a051 Mon Sep 17 00:00:00 2001 From: DarkDrifter Date: Sun, 25 Sep 2022 18:11:18 +0200 Subject: [PATCH 2/2] Remove now useless HACK that prevents Zoom In/Out to be used with mouse wheel --- Client/core/CKeyBinds.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Client/core/CKeyBinds.cpp b/Client/core/CKeyBinds.cpp index dc6d5a8f3a1..59ff3b35446 100644 --- a/Client/core/CKeyBinds.cpp +++ b/Client/core/CKeyBinds.cpp @@ -1087,12 +1087,8 @@ void CKeyBinds::CallGTAControlBind(CGTAControlBind* pBind, bool bState) // If its keydown, or there isnt another bind for this control down if (bState || !GetMultiGTAControlState(pBind)) { - // HACK: Are we're trying to ZOOM IN or ZOOM OUT using the mouse wheel? - bool bZoomWheel = m_bMouseWheel && (pBind->control->action == ZOOM_IN || pBind->control->action == ZOOM_OUT); - // If this control is enabled - // HACK: Prevent the game from using the mouse wheel to zoom *again* (it still does this itself) - if (pBind->control->bEnabled && !bZoomWheel) + if (pBind->control->bEnabled) { pBind->control->bState = bState; }