From 56537782dad55f0888a4eff23d628df3d081f941 Mon Sep 17 00:00:00 2001 From: elmasas Date: Tue, 29 Sep 2026 18:00:29 -0300 Subject: [PATCH] Fix mouse aim sensitivity --- lcs/generated/generated_unit_0059.cpp | 4 ++++ lcs/generated/generated_unit_0060.cpp | 4 ++++ lcs/host/lcs_controls.cpp | 15 +++++++++++++++ lcs/host/lcs_mouse.hpp | 4 ++++ 4 files changed, 27 insertions(+) diff --git a/lcs/generated/generated_unit_0059.cpp b/lcs/generated/generated_unit_0059.cpp index d72ad84..ffe56cf 100644 --- a/lcs/generated/generated_unit_0059.cpp +++ b/lcs/generated/generated_unit_0059.cpp @@ -3589,11 +3589,15 @@ L_088F13B8: ctx.fpr[12] = ctx.fpr[12] - ctx.fpr[13]; { const float fs = ctx.fpr[12]; const float ft = ctx.fpr[15]; if ((std::isinf(fs) && ft == 0.0f) || (std::isinf(ft) && fs == 0.0f)) ctx.fpr[15] = std::bit_cast(0x7FC00000u); else ctx.fpr[15] = fs * ft; } ctx.fpr[14] = ctx.fpr[14] + ctx.fpr[15]; + ctx.fpr[14] = lcs::lcs_mouse_aim_turn_angle(ctx.fpr[14], + std::bit_cast(aot_mem.aot_load32(ctx.gpr[17] + static_cast(196)))); aot_mem.aot_store32(ctx.gpr[17] + static_cast(208), std::bit_cast(ctx.fpr[14])); ctx.fpr[17] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[17] + static_cast(192))); { const float fs = ctx.fpr[13]; const float ft = ctx.fpr[17]; if ((std::isinf(fs) && ft == 0.0f) || (std::isinf(ft) && fs == 0.0f)) ctx.fpr[13] = std::bit_cast(0x7FC00000u); else ctx.fpr[13] = fs * ft; } { const float fs = ctx.fpr[12]; const float ft = ctx.fpr[16]; if ((std::isinf(fs) && ft == 0.0f) || (std::isinf(ft) && fs == 0.0f)) ctx.fpr[12] = std::bit_cast(0x7FC00000u); else ctx.fpr[12] = fs * ft; } ctx.fpr[12] = ctx.fpr[13] + ctx.fpr[12]; + ctx.fpr[12] = lcs::lcs_mouse_aim_pitch_angle(ctx.fpr[12], + std::bit_cast(aot_mem.aot_load32(ctx.gpr[17] + static_cast(196)))); aot_mem.aot_store32(ctx.gpr[17] + static_cast(192), std::bit_cast(ctx.fpr[12])); ctx.gpr[4] = (50298u << 16u); ctx.gpr[4] = (ctx.gpr[4] | 16384u); diff --git a/lcs/generated/generated_unit_0060.cpp b/lcs/generated/generated_unit_0060.cpp index 9c00b6a..61c9ba6 100644 --- a/lcs/generated/generated_unit_0060.cpp +++ b/lcs/generated/generated_unit_0060.cpp @@ -7687,6 +7687,8 @@ L_088F74E4: ctx.fpr[17] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[4] + static_cast(23832))); { const float fs = ctx.fpr[16]; const float ft = ctx.fpr[17]; if ((std::isinf(fs) && ft == 0.0f) || (std::isinf(ft) && fs == 0.0f)) ctx.fpr[16] = std::bit_cast(0x7FC00000u); else ctx.fpr[16] = fs * ft; } ctx.fpr[14] = ctx.fpr[14] + ctx.fpr[16]; + ctx.fpr[14] = lcs::lcs_mouse_aim_turn_angle(ctx.fpr[14], + std::bit_cast(aot_mem.aot_load32(ctx.gpr[30] + static_cast(196)))); aot_mem.aot_store32(ctx.gpr[30] + static_cast(208), std::bit_cast(ctx.fpr[14])); ctx.fpr[18] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[30] + static_cast(192))); { const float fs = ctx.fpr[12]; const float ft = ctx.fpr[18]; if ((std::isinf(fs) && ft == 0.0f) || (std::isinf(ft) && fs == 0.0f)) ctx.fpr[12] = std::bit_cast(0x7FC00000u); else ctx.fpr[12] = fs * ft; } @@ -7694,6 +7696,8 @@ L_088F74E4: ctx.fpr[19] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[4] + static_cast(23832))); { const float fs = ctx.fpr[13]; const float ft = ctx.fpr[19]; if ((std::isinf(fs) && ft == 0.0f) || (std::isinf(ft) && fs == 0.0f)) ctx.fpr[13] = std::bit_cast(0x7FC00000u); else ctx.fpr[13] = fs * ft; } ctx.fpr[12] = ctx.fpr[12] + ctx.fpr[13]; + ctx.fpr[12] = lcs::lcs_mouse_aim_pitch_angle(ctx.fpr[12], + std::bit_cast(aot_mem.aot_load32(ctx.gpr[30] + static_cast(196)))); aot_mem.aot_store32(ctx.gpr[30] + static_cast(192), std::bit_cast(ctx.fpr[12])); ctx.fpr[16] = std::bit_cast(aot_mem.aot_load32(ctx.gpr[30] + static_cast(204))); ctx.fpr[14] = ctx.fpr[16] + ctx.fpr[14]; diff --git a/lcs/host/lcs_controls.cpp b/lcs/host/lcs_controls.cpp index 7b157a3..7beca28 100644 --- a/lcs/host/lcs_controls.cpp +++ b/lcs/host/lcs_controls.cpp @@ -132,6 +132,21 @@ float lcs_mouse_camera_pitch_angle(float game_angle) noexcept { return mouse_camera_angle(g_mouse_camera_dy, pitch_sign(), game_angle); } +static float mouse_aim_angle(std::atomic &counts, float sign, float game_angle, + float fov) noexcept { + if (!mouse_camera_active()) return game_angle; + const float zoom = fov > 0.0f ? fov / 80.0f : 1.0f; + return take_mouse_angle(counts, sign) * zoom; +} + +float lcs_mouse_aim_turn_angle(float game_angle, float fov) noexcept { + return mouse_aim_angle(g_mouse_camera_dx, -1.0f, game_angle, fov); +} + +float lcs_mouse_aim_pitch_angle(float game_angle, float fov) noexcept { + return mouse_aim_angle(g_mouse_camera_dy, pitch_sign(), game_angle, fov); +} + bool lcs_camera_hook_enabled() noexcept { static const bool value = [] { const LcsConfiguration &config = lcs_render_configuration(); diff --git a/lcs/host/lcs_mouse.hpp b/lcs/host/lcs_mouse.hpp index 4673788..c47a905 100644 --- a/lcs/host/lcs_mouse.hpp +++ b/lcs/host/lcs_mouse.hpp @@ -12,6 +12,10 @@ namespace lcs { [[nodiscard]] float lcs_mouse_camera_pitch_angle(float game_angle) noexcept; +[[nodiscard]] float lcs_mouse_aim_turn_angle(float game_angle, float fov) noexcept; + +[[nodiscard]] float lcs_mouse_aim_pitch_angle(float game_angle, float fov) noexcept; + [[nodiscard]] float lcs_mouse_vehicle_camera_axis_x(float game_axis) noexcept; [[nodiscard]] float lcs_mouse_vehicle_camera_axis_y(float game_axis) noexcept;