diff --git a/player_controller/PlayerController.tscn b/player_controller/PlayerController.tscn index 5a483caf..d856347b 100644 --- a/player_controller/PlayerController.tscn +++ b/player_controller/PlayerController.tscn @@ -156,6 +156,7 @@ debug_color = Color(0, 0.6, 0.701961, 0.341176) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.6, 0) CameraInclineAcceleration = 20.0 GroundedCameraIncline = 3.0 +SlidingJitterAmplitude = 0.2 [node name="MantleSystem" parent="HeadSystem" instance=ExtResource("8_qu4wy")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.6, 0) diff --git a/player_controller/Scripts/PlayerController.cs b/player_controller/Scripts/PlayerController.cs index b21777a8..95296a35 100644 --- a/player_controller/Scripts/PlayerController.cs +++ b/player_controller/Scripts/PlayerController.cs @@ -793,7 +793,7 @@ public partial class PlayerController : CharacterBody3D var wallHugContactPoint = _onWallRunning.Active ? _currentWallContactPoint : Vector3.Zero; var playerVelocity = GetGlobalMoveInput(); - HeadSystem.LookAround(delta, inputLookDir, playerVelocity, wallHugContactPoint, lookSensitivity); + HeadSystem.LookAround(delta, inputLookDir, playerVelocity, Velocity, wallHugContactPoint, lookSensitivity, isSliding: _groundSliding.Active); } public void RotateWeaponWithPlayer() { @@ -808,7 +808,7 @@ public partial class PlayerController : CharacterBody3D Bobbing.CameraBobbingParams cameraBobbingParams = new Bobbing.CameraBobbingParams { Delta = delta, - IsOnFloorCustom = isOnFloorCustom() || _onWallRunning.Active, + IsOnFloorCustom = _grounded.Active || _onWallRunning.Active, Velocity = Velocity, SettingsMultiplier = _headBobbingMultiplier }; @@ -1267,7 +1267,8 @@ public partial class PlayerController : CharacterBody3D public void OnInputSlideStarted() { _isSlideInputDown = true; - _playerState.SendEvent("slide"); + if (Velocity.Length() > WalkSpeed/2f) + _playerState.SendEvent("slide"); } public void OnInputSlideEnded() { @@ -1711,14 +1712,13 @@ public partial class PlayerController : CharacterBody3D CameraModifications((float) delta); MoveSlideAndHandleStairs((float) delta); MantleSystem.ProcessMantle(_grounded.Active); + if (WeaponSystem.InHandState.Active) RotateWeaponWithPlayer(); - if (WeaponSystem.InHandState.Active && !_aiming.Active && TutorialDone) { DashIndicatorMesh.Visible = false; } - if (!WeaponSystem.InHandState.Active && TutorialDone) { DashIndicatorMesh.Visible = true; diff --git a/systems/head/HeadSystem.cs b/systems/head/HeadSystem.cs index dea69e65..d9407d9f 100644 --- a/systems/head/HeadSystem.cs +++ b/systems/head/HeadSystem.cs @@ -22,12 +22,26 @@ public partial class HeadSystem : Node3D [Export(PropertyHint.Range, "0,10,0.1,or_greater")] public float GroundedCameraIncline { get; set; } = 5f; + [Export(PropertyHint.Range, "0,2,0.1,or_greater")] + public float SlidingCameraHeightOffset { get; set; } = 1.0f; + + [Export(PropertyHint.Range, "0,1,0.01,or_greater")] + public float SlidingJitterFrequency { get; set; } = 0.01f; + + [Export(PropertyHint.Range, "0,1,0.01,or_greater")] + public float SlidingJitterAmplitude { get; set; } = 0.1f; + + private FastNoiseLite _slidingNoise = new FastNoiseLite(); + public void Init() { Input.SetMouseMode(Input.MouseModeEnum.Captured); _camera = GetNode("CameraSmooth/Camera3D"); _cameraAnchor = GetNode("CameraAnchor"); _animationPlayer = GetNode("AnimationPlayer"); + + _slidingNoise.NoiseType = FastNoiseLite.NoiseTypeEnum.Perlin; + _slidingNoise.SetFrequency(SlidingJitterFrequency); } public void OnMantle() @@ -35,7 +49,7 @@ public partial class HeadSystem : Node3D _animationPlayer.Play("mantle"); } - public void LookAround(double delta, Vector2 lookDir, Vector3 playerVelocity, Vector3? wallContactPoint = null, float sensitivitMultiplier = 1f) + public void LookAround(double delta, Vector2 lookDir, Vector3 playerInput, Vector3 playerVelocity, Vector3? wallContactPoint = null, float sensitivitMultiplier = 1f, bool isSliding = false) { // Horizontal movement of head float angleForHorizontalRotation = lookDir.X * LookSensitivity * sensitivitMultiplier; @@ -46,8 +60,9 @@ public partial class HeadSystem : Node3D currentCameraRotation.X += Convert.ToSingle(lookDir.Y * LookSensitivity * sensitivitMultiplier); currentCameraRotation.X = Mathf.Clamp(currentCameraRotation.X, Mathf.DegToRad(-90f), Mathf.DegToRad(90f)); + // Camera incline on Wall and more var isWallRunning = wallContactPoint.HasValue && wallContactPoint.Value.Length() > Mathf.Epsilon; - var cameraIncline = 0f; + float cameraIncline; if (isWallRunning) { var directionToWall = (wallContactPoint.Value - GlobalPosition).Normalized(); @@ -56,11 +71,23 @@ public partial class HeadSystem : Node3D } else { - var cameraInclineFactor = ComputeCameraInclineFactor(playerVelocity); + var cameraInclineFactor = ComputeCameraInclineFactor(playerInput); cameraIncline = Mathf.DegToRad(GroundedCameraIncline * cameraInclineFactor * -1.0f); } currentCameraRotation.Z = (float) Mathf.Lerp(currentCameraRotation.Z, cameraIncline, delta * CameraInclineAcceleration); _cameraAnchor.Rotation = currentCameraRotation; + + if (isSliding) + { + _cameraAnchor.Position = Vector3.Down*SlidingCameraHeightOffset; + float noise1D = _slidingNoise.GetNoise1D(Time.GetTicksMsec()); + float noiseAmplitude = SlidingJitterAmplitude*Mathf.Clamp(playerVelocity.Length(), 0f, 1f); + _cameraAnchor.Position += Vector3.Up*noise1D*noiseAmplitude; + } + else + { + _cameraAnchor.Position = Vector3.Zero; + } _camera.GlobalTransform = _cameraAnchor.GetGlobalTransformInterpolated(); }