diff --git a/rust/src/game_settings.rs b/rust/src/game_settings.rs index ab2e8fb..96409e4 100644 --- a/rust/src/game_settings.rs +++ b/rust/src/game_settings.rs @@ -26,6 +26,8 @@ pub struct GameSettings { pub window_mode: WindowModeSetting, pub render_scale: f32, pub recent_servers: Vec, + pub mouse_sensitivity: f32, + pub controller_sensitivity: f32, pub volume: VolumeSettings, pub keybinds: KeybindSettings, } @@ -150,6 +152,8 @@ impl Default for GameSettings { render_scale: 1., window_mode: WindowModeSetting::Maximized, recent_servers: Vec::new(), + mouse_sensitivity: 1.5, + controller_sensitivity: 1.5, volume: VolumeSettings { master_volume: 100., sfx_volume: 100., diff --git a/rust/src/player/local_player.rs b/rust/src/player/local_player.rs index 2b5d589..b09da4a 100644 --- a/rust/src/player/local_player.rs +++ b/rust/src/player/local_player.rs @@ -40,7 +40,9 @@ use crate::{ #[class(base=CharacterBody3D, init)] pub struct LocalPlayer { #[export] - look_sensitivity: f32, + mouse_sensitivity: f32, + #[export] + controller_sensitivity: f32, #[export] camera: Option>, #[export] @@ -776,7 +778,7 @@ impl ICharacterBody3D for LocalPlayer { } if let Ok(event) = event.try_cast::() { - self.move_look(event.get_relative()) + self.move_look(event.get_relative(), self.mouse_sensitivity) } } } @@ -788,7 +790,7 @@ impl ICharacterBody3D for LocalPlayer { input.get_action_strength("look_down") - input.get_action_strength("look_up"), ) * 5.; if !joypad_look_dir.is_zero_approx() { - self.move_look(joypad_look_dir); + self.move_look(joypad_look_dir, self.controller_sensitivity); } let rot = self.y_rot; @@ -873,6 +875,8 @@ impl LocalPlayer { if let Some(camera) = &mut self.camera { camera.set_fov(settings.fov as f32); } + self.mouse_sensitivity = settings.mouse_sensitivity; + self.controller_sensitivity = settings.controller_sensitivity; } pub fn play_local_hit_sound(&mut self) { @@ -919,19 +923,18 @@ impl LocalPlayer { } } - fn move_look(&mut self, direction: Vector2) { + fn move_look(&mut self, direction: Vector2, sensitivity: f32) { if !self.is_dead() { - let dir = direction * 0.001 * self.look_sensitivity; + let dir = direction * 0.001 * sensitivity; if let Some(camera) = self.camera.as_mut() { let curr_rotation = camera.get_rotation(); - let x_rot = - (curr_rotation.x - dir.y * self.look_sensitivity).clamp(-PI / 2., PI / 2.); + let x_rot = (curr_rotation.x - dir.y * sensitivity).clamp(-PI / 2., PI / 2.); camera.set_rotation(Vector3::RIGHT * x_rot); self.look_up = x_rot; } - let y_rot = -dir.x * self.look_sensitivity; + let y_rot = -dir.x * sensitivity; self.y_rot = self.base().get_global_rotation().y + y_rot; } } diff --git a/rust/src/ui/settings.rs b/rust/src/ui/settings.rs index ef3459c..dd61201 100644 --- a/rust/src/ui/settings.rs +++ b/rust/src/ui/settings.rs @@ -23,6 +23,8 @@ pub enum Setting { ReplayFPS, WindowMode, RenderScale, + MouseSensitivity, + ControllerSensitivity, // Volume settings MasterVolume, @@ -57,6 +59,8 @@ impl ToString for Setting { Setting::ReplayFPS => "Replay FPS", Setting::WindowMode => "Window Mode", Setting::RenderScale => "Render Scale", + Setting::MouseSensitivity => "Mouse Sensitivity", + Setting::ControllerSensitivity => "Controller Sensitivity", Setting::MasterVolume => "Master volume", Setting::SfxVolume => "Sfx Volume", @@ -86,6 +90,8 @@ impl Setting { Setting::ReplayFPS => SettingsTab::General, Setting::WindowMode => SettingsTab::General, Setting::RenderScale => SettingsTab::General, + Setting::MouseSensitivity => SettingsTab::General, + Setting::ControllerSensitivity => SettingsTab::General, Setting::MasterVolume => SettingsTab::Volume, Setting::SfxVolume => SettingsTab::Volume, @@ -383,6 +389,12 @@ impl SettingsPanel { (Setting::RenderScale, SettingValue::SliderNumber(value)) => { new_settings.render_scale = value.value as f32; } + (Setting::MouseSensitivity, SettingValue::SliderNumber(value)) => { + new_settings.mouse_sensitivity = value.value as f32; + } + (Setting::ControllerSensitivity, SettingValue::SliderNumber(value)) => { + new_settings.controller_sensitivity = value.value as f32; + } (Setting::MasterVolume, SettingValue::SliderNumber(value)) => { new_settings.volume.master_volume = value.value; @@ -509,6 +521,24 @@ fn settings_from(map: &mut HashMap, settings: &GameSettin value: settings.render_scale as f64, }), ); + map.insert( + Setting::MouseSensitivity, + SettingValue::SliderNumber(SliderValue { + min: 0.25, + max: 3., + step: 0.05, + value: settings.mouse_sensitivity as f64, + }), + ); + map.insert( + Setting::ControllerSensitivity, + SettingValue::SliderNumber(SliderValue { + min: 0.25, + max: 3., + step: 0.05, + value: settings.controller_sensitivity as f64, + }), + ); map.insert( Setting::MasterVolume, SettingValue::SliderNumber(SliderValue {