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.
This commit is contained in:
Kawe Mazidjatari 2024-08-05 20:06:26 +02:00
parent 08a69db020
commit 886f1c6a53
3 changed files with 29 additions and 41 deletions

View File

@ -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_UnknownBool1AC; // r13
bool m_bAutoAim_UnknownBool1AD; // r15 bool m_bAutoAim_UnknownBool1AD; // r15
bool m_bAutoAim_UnknownBool1B1; // r14 bool m_bAutoAim_UnknownBool1B1; // r14
vec_t z; // eax
QAngle* v24; // rax QAngle* v24; // rax
bool v25; // zf bool v25; // zf
QAngle v26; // xmm0_12 QAngle v26; // xmm0_12
@ -40,12 +39,10 @@ void C_Player::CurveLook(C_Player* player, CInput::UserInput_t* input, float a3,
int selectedGamePadLookCurve; // r12d int selectedGamePadLookCurve; // r12d
float v33; // xmm7_4 float v33; // xmm7_4
int customAimSpeed; // eax int customAimSpeed; // eax
char v36; // r10
int v37; // edx int v37; // edx
float* v38; // rsi float* v38; // rsi
char* v39; // rsi char* v39; // rsi
float v40; // xmm6_4 float v40; // xmm6_4
float m_flUnknownFloat1B4; // xmm6_4
float v42; // xmm0_4 float v42; // xmm0_4
float v43; // xmm0_4 float v43; // xmm0_4
float v44; // xmm10_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 float v66; // xmm7_4
QAngle v68; // [rsp+68h] [rbp-A0h] BYREF QAngle v68; // [rsp+68h] [rbp-A0h] BYREF
QAngle v69; // [rsp+78h] [rbp-90h] BYREF QAngle v69; // [rsp+78h] [rbp-90h] BYREF
Vector3D v70; // [rsp+88h] [rbp-80h] BYREF Vector3D v70;
QAngle v71; // [rsp+178h] [rbp+70h] BYREF QAngle v71; // [rsp+178h] [rbp+70h] BYREF
float m_flUnknownFloat1B8; // [rsp+188h] [rbp+80h] float m_flUnknownFloat1B8; // [rsp+188h] [rbp+80h]
float v73; // [rsp+190h] [rbp+88h] 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) || C_Player__IsInTimeShift(player)
|| v11 > 0.050000001 || v11 > 0.050000001
|| !gamePadCustomEnabled && (unsigned int)C_Player__GetAimSpeed(player, isZoomed) == 7 || !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) || sub_1405AD4E0(player) < FLT_EPSILON)
{ {
m_bAutoAim_UnknownBool1AC = 0; m_bAutoAim_UnknownBool1AC = false;
m_bAutoAim_UnknownBool1AD = 0; m_bAutoAim_UnknownBool1AD = false;
runAimAssist = 0; runAimAssist = false;
m_bAutoAim_UnknownBool1B1 = 0; m_bAutoAim_UnknownBool1B1 = false;
} }
else else
{ {
m_bAutoAim_UnknownBool1AC = input->m_bAutoAim_UnknownBool1AC; m_bAutoAim_UnknownBool1AC = input->m_bAutoAim_UnknownBool1AC;
m_bAutoAim_UnknownBool1AD = input->m_bAutoAim_UnknownBool1AD; m_bAutoAim_UnknownBool1AD = input->m_bAutoAim_UnknownBool1AD;
m_bAutoAim_UnknownBool1B1 = input->m_bAutoAim_UnknownBool1B1;
runAimAssist = input->m_bAutoAim_UnknownBool1B0; 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; m_flUnknownFloat1B8 = input->m_flUnknownFloat1B8;
*(_QWORD*)&v70.x = *(_QWORD*)&input->m_vecUnknown1BC.x;
v70.z = z;
v24 = sub_1406257E0(&v69, player); v24 = sub_1406257E0(&v69, player);
v25 = !input->m_bUnknown1D4; v25 = !input->m_bUnknown1D4;
*(_QWORD*)&v26.x = *(_QWORD*)&v24->x; *(_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; *(_QWORD*)&v69.x = v28;
v69.z = v29; v69.z = v29;
if (m_bAutoAim_UnknownBool1AD && m_bAutoAim_UnknownBool1B1) if (m_bAutoAim_UnknownBool1AD && m_bAutoAim_UnknownBool1B1)
input->m_flUnknownFloat1B4 = 0.0; input->m_flUnknownFloat1B4 = 0.0f;
else else
input->m_flUnknownFloat1B4 = inputSampleFrametime + input->m_flUnknownFloat1B4; 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; selectedGamePadLookCurve = 1;
v33 = sub_1405B0BC0(player, input, 0); v33 = sub_1405B0BC0(player, input, 0);
a5 = sub_1405B0BC0(player, input, 1); 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 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) customAimSpeed = C_Player__GetAimSpeed(player, isZoomed);
{ v37 = *(_DWORD*)((unsigned int)(*dword_1423880E0) + *(_QWORD*)&player->gap_21a0[16]);
v35 = false;
}
}
if (gamePadCustomEnabled) if (gamePadCustomEnabled)
{ {
@ -219,10 +207,10 @@ void C_Player::CurveLook(C_Player* player, CInput::UserInput_t* input, float a3,
} }
else else
{ {
m_flUnknownFloat1B4 = input->m_flUnknownFloat1B4; float m_flUnknownFloat1B4 = input->m_flUnknownFloat1B4;
if (m_flUnknownFloat1B4 <= 0.2) 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; v40 = (float)((float)((float)(m_flUnknownFloat1B4 - 0.1f) / 0.1f) * 0.35000002f) + 0.64999998f;
else else
v40 = 0.64999998f; v40 = 0.64999998f;
@ -235,8 +223,8 @@ void C_Player::CurveLook(C_Player* player, CInput::UserInput_t* input, float a3,
v42 = m_flUnknownFloat1B8; v42 = m_flUnknownFloat1B8;
sub_1405AF810(player, input, (__int64)v38, m_bAutoAim_UnknownBool1AC, v36, &v70, &v69, &v68, 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)); inputSampleFrametime = ((v42 * (1.0f - v40)) + v40) * (1.0f - (v33 * 0.94999999f));
v43 = sqrtf((float)(a3 * a3) + (float)(v73 * v73)); v43 = sqrtf((a3 * a3) + (v73 * v73));
v44 = v43; v44 = v43;
const int gamePadLookCurve = gamepad_look_curve->GetInt(); 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) if (gamePadLookCurve <= 4u)
selectedGamePadLookCurve = gamePadLookCurve; selectedGamePadLookCurve = gamePadLookCurve;
v45 = fabs((float)(v43 - 0.0f)); v45 = fabs((v43 - 0.0f));
if (v45 > 0.001f) if (v45 > 0.001f)
{ {
if (gamePadCustomEnabled) if (gamePadCustomEnabled)
v47 = GamePad_CalcOuterDeadzoneCustom(v43); v47 = GamePad_CalcOuterDeadzoneCustom(v43);
else else
v47 = GamePad_CalcOuterDeadzone(g_aimCurveConfig[selectedGamePadLookCurve], v43); v47 = GamePad_CalcOuterDeadzone(&g_aimCurveConfig[selectedGamePadLookCurve], v43);
v46 = v47 / v44; v46 = v47 / v44;
} }
@ -293,8 +281,8 @@ void C_Player::CurveLook(C_Player* player, CInput::UserInput_t* input, float a3,
v59 = v31 * v12; v59 = v31 * v12;
v60 = v49 * v12; v60 = v49 * v12;
C_WeaponX* pWeapon = C_BaseCombatCharacter__GetActiveWeapon(player); C_WeaponX* pWeapon = C_BaseCombatCharacter__GetActiveWeapon(player);
if (pWeapon && C_Player__GetZoomFrac(player) >= 0.99000001 && pWeapon->m_modVars[412]) if (pWeapon && C_Player__GetZoomFrac(player) >= 0.99000001f && pWeapon->m_modVars[412])
v62 = *v38; v62 = v38[0];
else else
v62 = v38[1]; v62 = v38[1];
@ -317,7 +305,8 @@ void C_Player::CurveLook(C_Player* player, CInput::UserInput_t* input, float a3,
v65 = a9; v65 = a9;
v66 = (float)(v48 * inputSampleFrametime) * v62; v66 = (float)(v48 * inputSampleFrametime) * v62;
a9->unk1 = v71.y; a9->unk1 = v71.y;
v65->unk2 = 0i64;
v65->unk2.Init();
const float pitchX = ((v66 * adsScalar) + v59) * v63; const float pitchX = ((v66 * adsScalar) + v59) * v63;
const float pitchY = ((v64 * adsScalar) + v60) * 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) if (m_bAutoAim_UnknownBool1AD && runAimAssist)
{ {
sub_1405AF1F0(input, player, (QAngle*)&v70, &v69, v14, v13, inputSampleFrametime_c, a5, (QAngle*)&a9); sub_1405AF1F0(input, player, (QAngle*)&v70, &v69, v14, v13, inputSampleFrametime_c, a5, &v65->unk2);
v65->unk2 = a9;
} }
} }

View File

@ -61,7 +61,7 @@ struct JoyAngle_t
{ {
QAngle pitch; QAngle pitch;
float unk1; float unk1;
void* unk2; Vector2D unk2;
}; };
class C_Player : public C_BaseCombatCharacter 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 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 C_BaseEntity* (*sub_1409DC4E0)(C_Player* player);
inline float (*sub_1405D4300)(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 float (*C_Player__GetZoomFrac)(C_Player* thisptr);
inline int (*C_Player__GetAimSpeed)(C_Player* thisptr, bool isZoomed); inline int (*C_Player__GetAimSpeed)(C_Player* thisptr, bool isZoomed);

View File

@ -39,7 +39,7 @@ inline char* g_lookSensitivity_Titan;
inline char* g_lookSensitivity_Zoomed; inline char* g_lookSensitivity_Zoomed;
inline char* g_lookSensitivity; inline char* g_lookSensitivity;
inline AimCurveConfig_s** g_aimCurveConfig; inline AimCurveConfig_s* g_aimCurveConfig;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
class V_GamePad : public IDetour class V_GamePad : public IDetour