From 886f1c6a53615c64daf2d817c76c0f1be9daf39e Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Mon, 5 Aug 2024 20:06:26 +0200 Subject: [PATCH] Client: fix numerous issues with CurveLook rebuild Fix incorrect type for g_aimCurveConfig, its a static array, so it needs to be a single pointer not a double. Also fixed several blocks inside CurveLook that did not match the assembly code of the game. The aim-assist code is still broken however, pending research. --- src/game/client/c_player.cpp | 64 +++++++++++++++--------------------- src/game/client/c_player.h | 4 +-- src/game/client/gamepad.h | 2 +- 3 files changed, 29 insertions(+), 41 deletions(-) diff --git a/src/game/client/c_player.cpp b/src/game/client/c_player.cpp index d841af2c..2af10724 100644 --- a/src/game/client/c_player.cpp +++ b/src/game/client/c_player.cpp @@ -28,7 +28,6 @@ void C_Player::CurveLook(C_Player* player, CInput::UserInput_t* input, float a3, bool m_bAutoAim_UnknownBool1AC; // r13 bool m_bAutoAim_UnknownBool1AD; // r15 bool m_bAutoAim_UnknownBool1B1; // r14 - vec_t z; // eax QAngle* v24; // rax bool v25; // zf QAngle v26; // xmm0_12 @@ -40,12 +39,10 @@ void C_Player::CurveLook(C_Player* player, CInput::UserInput_t* input, float a3, int selectedGamePadLookCurve; // r12d float v33; // xmm7_4 int customAimSpeed; // eax - char v36; // r10 int v37; // edx float* v38; // rsi char* v39; // rsi float v40; // xmm6_4 - float m_flUnknownFloat1B4; // xmm6_4 float v42; // xmm0_4 float v43; // xmm0_4 float v44; // xmm10_4 @@ -69,7 +66,7 @@ void C_Player::CurveLook(C_Player* player, CInput::UserInput_t* input, float a3, float v66; // xmm7_4 QAngle v68; // [rsp+68h] [rbp-A0h] BYREF QAngle v69; // [rsp+78h] [rbp-90h] BYREF - Vector3D v70; // [rsp+88h] [rbp-80h] BYREF + Vector3D v70; QAngle v71; // [rsp+178h] [rbp+70h] BYREF float m_flUnknownFloat1B8; // [rsp+188h] [rbp+80h] float v73; // [rsp+190h] [rbp+88h] @@ -124,26 +121,24 @@ void C_Player::CurveLook(C_Player* player, CInput::UserInput_t* input, float a3, || C_Player__IsInTimeShift(player) || v11 > 0.050000001 || !gamePadCustomEnabled && (unsigned int)C_Player__GetAimSpeed(player, isZoomed) == 7 - || (v19 = *(_QWORD*)&player->pl.lastPlayerView_angle.x, v70.z = player->pl.lastPlayerView_angle.z, *(_QWORD*)&v70.x = v19, *(float*)&v19 < -50.0) + || (v19 = *(_QWORD*)&player->pl.lastPlayerView_angle.x, v70.z = player->pl.lastPlayerView_angle.z, *(_QWORD*)&v70.x = v19, *(float*)&v19 < -50.0f) || sub_1405AD4E0(player) < FLT_EPSILON) { - m_bAutoAim_UnknownBool1AC = 0; - m_bAutoAim_UnknownBool1AD = 0; - runAimAssist = 0; - m_bAutoAim_UnknownBool1B1 = 0; + m_bAutoAim_UnknownBool1AC = false; + m_bAutoAim_UnknownBool1AD = false; + runAimAssist = false; + m_bAutoAim_UnknownBool1B1 = false; } else { m_bAutoAim_UnknownBool1AC = input->m_bAutoAim_UnknownBool1AC; m_bAutoAim_UnknownBool1AD = input->m_bAutoAim_UnknownBool1AD; - m_bAutoAim_UnknownBool1B1 = input->m_bAutoAim_UnknownBool1B1; runAimAssist = input->m_bAutoAim_UnknownBool1B0; + m_bAutoAim_UnknownBool1B1 = input->m_bAutoAim_UnknownBool1B1; } - z = input->m_vecUnknown1BC.z; + v70 = input->m_vecUnknown1BC; m_flUnknownFloat1B8 = input->m_flUnknownFloat1B8; - *(_QWORD*)&v70.x = *(_QWORD*)&input->m_vecUnknown1BC.x; - v70.z = z; v24 = sub_1406257E0(&v69, player); v25 = !input->m_bUnknown1D4; *(_QWORD*)&v26.x = *(_QWORD*)&v24->x; @@ -159,7 +154,7 @@ void C_Player::CurveLook(C_Player* player, CInput::UserInput_t* input, float a3, *(_QWORD*)&v69.x = v28; v69.z = v29; if (m_bAutoAim_UnknownBool1AD && m_bAutoAim_UnknownBool1B1) - input->m_flUnknownFloat1B4 = 0.0; + input->m_flUnknownFloat1B4 = 0.0f; else input->m_flUnknownFloat1B4 = inputSampleFrametime + input->m_flUnknownFloat1B4; @@ -169,24 +164,17 @@ void C_Player::CurveLook(C_Player* player, CInput::UserInput_t* input, float a3, selectedGamePadLookCurve = 1; v33 = sub_1405B0BC0(player, input, 0); a5 = sub_1405B0BC0(player, input, 1); - customAimSpeed = C_Player__GetAimSpeed(player, isZoomed); - v37 = *(_DWORD*)((unsigned int)(*dword_1423880E0) + *(_QWORD*)&player->gap_21a0[16]); bool v35 = m_bAutoAim_UnknownBool1B1; // r9 + bool v36 = runAimAssist; - if (m_bAutoAim_UnknownBool1AC && m_bAutoAim_UnknownBool1AD) + if (!m_bAutoAim_UnknownBool1AD || !m_bAutoAim_UnknownBool1B1) { - v36 = true; + v35 = false; } - else - { - v36 = false; - if (!m_bAutoAim_UnknownBool1AC) - { - v35 = false; - } - } + customAimSpeed = C_Player__GetAimSpeed(player, isZoomed); + v37 = *(_DWORD*)((unsigned int)(*dword_1423880E0) + *(_QWORD*)&player->gap_21a0[16]); if (gamePadCustomEnabled) { @@ -219,10 +207,10 @@ void C_Player::CurveLook(C_Player* player, CInput::UserInput_t* input, float a3, } else { - m_flUnknownFloat1B4 = input->m_flUnknownFloat1B4; - if (m_flUnknownFloat1B4 <= 0.2) + float m_flUnknownFloat1B4 = input->m_flUnknownFloat1B4; + if (m_flUnknownFloat1B4 <= 0.2f) { - if (m_flUnknownFloat1B4 > 0.1) + if (m_flUnknownFloat1B4 > 0.1f) v40 = (float)((float)((float)(m_flUnknownFloat1B4 - 0.1f) / 0.1f) * 0.35000002f) + 0.64999998f; else v40 = 0.64999998f; @@ -235,8 +223,8 @@ void C_Player::CurveLook(C_Player* player, CInput::UserInput_t* input, float a3, v42 = m_flUnknownFloat1B8; sub_1405AF810(player, input, (__int64)v38, m_bAutoAim_UnknownBool1AC, v36, &v70, &v69, &v68, m_flUnknownFloat1B8); - inputSampleFrametime = (float)((float)(v42 * (float)(1.0 - v40)) + v40) * (float)(1.0 - (float)(v33 * 0.94999999f)); - v43 = sqrtf((float)(a3 * a3) + (float)(v73 * v73)); + inputSampleFrametime = ((v42 * (1.0f - v40)) + v40) * (1.0f - (v33 * 0.94999999f)); + v43 = sqrtf((a3 * a3) + (v73 * v73)); v44 = v43; const int gamePadLookCurve = gamepad_look_curve->GetInt(); @@ -244,13 +232,13 @@ void C_Player::CurveLook(C_Player* player, CInput::UserInput_t* input, float a3, if (gamePadLookCurve <= 4u) selectedGamePadLookCurve = gamePadLookCurve; - v45 = fabs((float)(v43 - 0.0f)); + v45 = fabs((v43 - 0.0f)); if (v45 > 0.001f) { if (gamePadCustomEnabled) v47 = GamePad_CalcOuterDeadzoneCustom(v43); else - v47 = GamePad_CalcOuterDeadzone(g_aimCurveConfig[selectedGamePadLookCurve], v43); + v47 = GamePad_CalcOuterDeadzone(&g_aimCurveConfig[selectedGamePadLookCurve], v43); v46 = v47 / v44; } @@ -293,8 +281,8 @@ void C_Player::CurveLook(C_Player* player, CInput::UserInput_t* input, float a3, v59 = v31 * v12; v60 = v49 * v12; C_WeaponX* pWeapon = C_BaseCombatCharacter__GetActiveWeapon(player); - if (pWeapon && C_Player__GetZoomFrac(player) >= 0.99000001 && pWeapon->m_modVars[412]) - v62 = *v38; + if (pWeapon && C_Player__GetZoomFrac(player) >= 0.99000001f && pWeapon->m_modVars[412]) + v62 = v38[0]; else v62 = v38[1]; @@ -317,7 +305,8 @@ void C_Player::CurveLook(C_Player* player, CInput::UserInput_t* input, float a3, v65 = a9; v66 = (float)(v48 * inputSampleFrametime) * v62; a9->unk1 = v71.y; - v65->unk2 = 0i64; + + v65->unk2.Init(); const float pitchX = ((v66 * adsScalar) + v59) * v63; const float pitchY = ((v64 * adsScalar) + v60) * v63; @@ -328,8 +317,7 @@ void C_Player::CurveLook(C_Player* player, CInput::UserInput_t* input, float a3, if (m_bAutoAim_UnknownBool1AD && runAimAssist) { - sub_1405AF1F0(input, player, (QAngle*)&v70, &v69, v14, v13, inputSampleFrametime_c, a5, (QAngle*)&a9); - v65->unk2 = a9; + sub_1405AF1F0(input, player, (QAngle*)&v70, &v69, v14, v13, inputSampleFrametime_c, a5, &v65->unk2); } } diff --git a/src/game/client/c_player.h b/src/game/client/c_player.h index 3636ac6f..b2309b44 100644 --- a/src/game/client/c_player.h +++ b/src/game/client/c_player.h @@ -61,7 +61,7 @@ struct JoyAngle_t { QAngle pitch; float unk1; - void* unk2; + Vector2D unk2; }; class C_Player : public C_BaseCombatCharacter @@ -360,7 +360,7 @@ inline void (*sub_1405AEA10)(void* a1, bool isZoomed, char a3); inline void (*sub_1405AF810)(C_Player* player, CInput::UserInput_t* input, __int64 a3, char a4, char a5, Vector3D* a6, QAngle* a7, QAngle* a8, float a9); inline C_BaseEntity* (*sub_1409DC4E0)(C_Player* player); inline float (*sub_1405D4300)(C_Player* player); -inline QAngle* (*sub_1405AF1F0)(CInput::UserInput_t* a1, C_Player* a2, QAngle* a3, QAngle* a4, float a5, float a6, float a7, float a8, QAngle* a9); +inline QAngle* (*sub_1405AF1F0)(CInput::UserInput_t* a1, C_Player* a2, QAngle* a3, QAngle* a4, float a5, float a6, float a7, float a8, Vector2D* a9); inline float (*C_Player__GetZoomFrac)(C_Player* thisptr); inline int (*C_Player__GetAimSpeed)(C_Player* thisptr, bool isZoomed); diff --git a/src/game/client/gamepad.h b/src/game/client/gamepad.h index f989042e..353aa26b 100644 --- a/src/game/client/gamepad.h +++ b/src/game/client/gamepad.h @@ -39,7 +39,7 @@ inline char* g_lookSensitivity_Titan; inline char* g_lookSensitivity_Zoomed; inline char* g_lookSensitivity; -inline AimCurveConfig_s** g_aimCurveConfig; +inline AimCurveConfig_s* g_aimCurveConfig; /////////////////////////////////////////////////////////////////////////////// class V_GamePad : public IDetour