From 61125e75fa91cc50351601f24927492bb0849912 Mon Sep 17 00:00:00 2001 From: DarkDrifter Date: Tue, 27 Sep 2022 23:34:32 +0200 Subject: [PATCH] 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 83dd3c8cc7..b20d275fdd 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 347b073a07..d48d4bbb86 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; };