{"TotalCount":3,"Files":[{"Ident":"notpointless.chomnr_head_bobbing_effect","Path":"Code/FirstPersonHeadBob.cs","FileName":"FirstPersonHeadBob.cs","PackageType":"library","CodeKind":"Game","AssetVersionId":339025,"Code":"using System;\n\nnamespace Sandbox;\n\n[Title( \u0022Head Bobbing Effect\u0022 )]\n[Category( \u0022Camera\u0022 )]\n[Description( \u0022Polished first-person camera motion driven by player velocity.\u0022 )]\n[Icon( \u0022visibility\u0022 )]\npublic sealed class FirstPersonHeadBob : Component\n{\n\tconst float MeanAbsoluteCosine = 0.6366198f;\n\n\t[Property, Group( \u0022Motion\u0022 ), Range( 0f, 2f )]\n\tpublic float Amount { get; set; } = 1f;\n\n\t[Property, Group( \u0022Motion\u0022 ), Range( 0f, 3f )]\n\tpublic float HorizontalAmount { get; set; } = 0.85f;\n\n\t[Property, Group( \u0022Motion\u0022 ), Range( 0f, 3f )]\n\tpublic float VerticalAmount { get; set; } = 1.2f;\n\n\t[Property, Group( \u0022Motion\u0022 ), Range( 0.5f, 4f )]\n\tpublic float StepFrequency { get; set; } = 1.9f;\n\n\t[Property, Group( \u0022Motion\u0022 ), Range( 0f, 0.5f )]\n\tpublic float GaitDetail { get; set; } = 0.12f;\n\n\t[Property, Group( \u0022Motion\u0022 ), Range( 0.25f, 1f )]\n\tpublic float CrouchMultiplier { get; set; } = 0.72f;\n\n\t[Property, Group( \u0022Idle\u0022 ), Range( 0f, 1f )]\n\tpublic float IdleAmount { get; set; } = 0.5f;\n\n\t[Property, Group( \u0022Idle\u0022 ), Range( 0.05f, 1f )]\n\tpublic float BreathingFrequency { get; set; } = 0.23f;\n\n\t[Property, Group( \u0022Idle\u0022 ), Range( 0f, 1f )]\n\tpublic float IdlePitchAmount { get; set; } = 0.32f;\n\n\t[Property, Group( \u0022Rotation\u0022 ), Range( 0f, 2f )]\n\tpublic float PitchAmount { get; set; } = 0.38f;\n\n\t[Property, Group( \u0022Rotation\u0022 ), Range( 0f, 2f )]\n\tpublic float RollAmount { get; set; } = 0.62f;\n\n\t[Property, Group( \u0022Velocity\u0022 ), Range( 0f, 2f )]\n\tpublic float VelocityPitchAmount { get; set; } = 0.32f;\n\n\t[Property, Group( \u0022Velocity\u0022 ), Range( 0f, 3f )]\n\tpublic float VelocityRollAmount { get; set; } = 0.75f;\n\n\t[Property, Group( \u0022Velocity\u0022 ), Range( 0f, 3f )]\n\tpublic float InertiaAmount { get; set; } = 0.85f;\n\n\t[Property, Group( \u0022Velocity\u0022 ), Range( 1f, 30f )]\n\tpublic float VelocitySmoothing { get; set; } = 6.5f;\n\n\t[Property, Group( \u0022Velocity\u0022 ), Range( 1f, 30f )]\n\tpublic float InertiaSmoothing { get; set; } = 3.5f;\n\n\t[Property, Group( \u0022Response\u0022 ), Range( 1f, 30f )]\n\tpublic float BlendSpeed { get; set; } = 6.5f;\n\n\t[Property, Group( \u0022Response\u0022 ), Range( 1f, 30f )]\n\tpublic float CadenceSmoothing { get; set; } = 5.5f;\n\n\t[Property, Group( \u0022Response\u0022 ), Range( 1f, 30f )]\n\tpublic float AirborneBlendSpeed { get; set; } = 5f;\n\n\t[Property, Group( \u0022Landing\u0022 ), Range( 0f, 4f )]\n\tpublic float LandingDip { get; set; } = 1.6f;\n\n\t[Property, Group( \u0022Landing\u0022 ), Range( 1f, 30f )]\n\tpublic float LandingSpring { get; set; } = 15f;\n\n\t[Property, Group( \u0022Landing\u0022 ), Range( 0.1f, 2f )]\n\tpublic float LandingDamping { get; set; } = 0.82f;\n\n\t[Property, Group( \u0022Speed\u0022 ), Range( 0f, 100f )]\n\tpublic float MinimumSpeed { get; set; } = 1.5f;\n\n\t[Property, Group( \u0022Speed\u0022 ), Range( 1f, 500f )]\n\tpublic float ReferenceSpeed { get; set; } = 110f;\n\n\t[Property, Group( \u0022Speed\u0022 ), Range( 1f, 3f )]\n\tpublic float MaximumSpeedScale { get; set; } = 1.65f;\n\n\t[Property, Group( \u0022Safety\u0022 ), Range( 0.5f, 8f )]\n\tpublic float MaximumPositionOffset { get; set; } = 3.5f;\n\n\t[Property, Group( \u0022Safety\u0022 ), Range( 0.5f, 5f )]\n\tpublic float MaximumRotationOffset { get; set; } = 2.5f;\n\n\tPlayerController Controller { get; set; }\n\n\tfloat _gaitPhase;\n\tfloat _idlePhase;\n\tfloat _movementStrength;\n\tfloat _cadence;\n\tfloat _landingOffset;\n\tfloat _landingVelocity;\n\tfloat _lastVerticalVelocity;\n\tVector3 _velocity;\n\tVector3 _smoothedVelocity;\n\tVector3 _inertiaVelocity;\n\tbool _wasGrounded;\n\tbool _isGrounded;\n\tbool _initialized;\n\n\tprotected override void OnStart()\n\t{\n\t\tController = Components.Get\u003CPlayerController\u003E();\n\t\tInitializeState();\n\t}\n\n\tprotected override void OnDisabled()\n\t{\n\t\t_initialized = false;\n\t\t_movementStrength = 0f;\n\t\t_cadence = 0f;\n\t\t_landingOffset = 0f;\n\t\t_landingVelocity = 0f;\n\t}\n\n\tprotected override void OnUpdate()\n\t{\n\t\tController ??= Components.Get\u003CPlayerController\u003E();\n\n\t\tif ( !Controller.IsValid() || IsProxy || Controller.ThirdPerson )\n\t\t{\n\t\t\t_initialized = false;\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !_initialized )\n\t\t\tInitializeState();\n\n\t\tvar delta = MathF.Min( Time.Delta, 0.05f );\n\t\tif ( delta \u003C= 0f )\n\t\t\treturn;\n\n\t\t_velocity = Controller.Velocity;\n\t\tvar planarVelocity = new Vector3( _velocity.x, _velocity.y, 0f );\n\t\tvar planarSpeed = planarVelocity.Length;\n\t\tvar grounded = Controller.IsOnGround;\n\t\tvar moving = grounded \u0026\u0026 planarSpeed \u003E= MinimumSpeed;\n\t\tvar referenceSpeed = MathF.Max( ReferenceSpeed, 1f );\n\t\tvar speedScale = (planarSpeed / referenceSpeed).Clamp( 0f, MaximumSpeedScale );\n\t\tvar crouchScale = Controller.IsDucking ? CrouchMultiplier : 1f;\n\t\tvar targetStrength = moving ? speedScale * crouchScale : 0f;\n\t\tvar targetCadence = moving ? speedScale * MathF.Sqrt( crouchScale ) : 0f;\n\t\tvar movementBlendSpeed = grounded ? BlendSpeed : AirborneBlendSpeed;\n\n\t\t_movementStrength = MathX.LerpTo(\n\t\t\t_movementStrength,\n\t\t\ttargetStrength,\n\t\t\tExponentialBlend( movementBlendSpeed, delta )\n\t\t);\n\t\t_cadence = MathX.LerpTo(\n\t\t\t_cadence,\n\t\t\ttargetCadence,\n\t\t\tExponentialBlend( CadenceSmoothing, delta )\n\t\t);\n\t\t_smoothedVelocity = Vector3.Lerp(\n\t\t\t_smoothedVelocity,\n\t\t\tplanarVelocity,\n\t\t\tExponentialBlend( VelocitySmoothing, delta )\n\t\t);\n\t\t_inertiaVelocity = Vector3.Lerp(\n\t\t\t_inertiaVelocity,\n\t\t\t_smoothedVelocity,\n\t\t\tExponentialBlend( InertiaSmoothing, delta )\n\t\t);\n\n\t\t_idlePhase = (_idlePhase \u002B MathF.Tau * BreathingFrequency * delta) % (MathF.Tau * 2f);\n\n\t\tif ( grounded \u0026\u0026 _cadence \u003E 0.001f )\n\t\t{\n\t\t\t_gaitPhase \u002B= MathF.PI * StepFrequency * _cadence * delta;\n\t\t\t_gaitPhase %= MathF.Tau * 2f;\n\t\t}\n\n\t\tif ( grounded \u0026\u0026 !_wasGrounded )\n\t\t{\n\t\t\tvar impact = (-_lastVerticalVelocity / 600f).Clamp( 0f, 1f );\n\t\t\t_landingVelocity -= impact * LandingDip * LandingSpring;\n\t\t}\n\n\t\tUpdateLandingSpring( delta );\n\n\t\tif ( !grounded )\n\t\t\t_lastVerticalVelocity = _velocity.z;\n\n\t\t_wasGrounded = grounded;\n\t\t_isGrounded = grounded;\n\t}\n\n\tprotected override void OnPreRender()\n\t{\n\t\tif ( !_initialized || !Controller.IsValid() || IsProxy || Controller.ThirdPerson )\n\t\t\treturn;\n\n\t\tvar camera = Scene.Camera;\n\t\tif ( !camera.IsValid() )\n\t\t\treturn;\n\n\t\tvar rotation = camera.WorldRotation;\n\t\tvar flatForward = new Vector3( rotation.Forward.x, rotation.Forward.y, 0f );\n\t\tvar flatLength = flatForward.Length;\n\t\tflatForward = flatLength \u003E 0.001f ? flatForward / flatLength : Vector3.Forward;\n\t\tvar flatRight = new Vector3( -flatForward.y, flatForward.x, 0f );\n\t\tvar referenceSpeed = MathF.Max( ReferenceSpeed, 1f );\n\t\tvar forwardSpeed = (_smoothedVelocity.Dot( flatForward ) / referenceSpeed)\n\t\t\t.Clamp( -MaximumSpeedScale, MaximumSpeedScale );\n\t\tvar sideSpeed = (_smoothedVelocity.Dot( flatRight ) / referenceSpeed)\n\t\t\t.Clamp( -MaximumSpeedScale, MaximumSpeedScale );\n\t\tvar velocityLag = (_smoothedVelocity - _inertiaVelocity) / referenceSpeed;\n\t\tvar lagForward = velocityLag.Dot( flatForward ).Clamp( -1f, 1f );\n\t\tvar lagSide = velocityLag.Dot( flatRight ).Clamp( -1f, 1f );\n\n\t\tvar sideWave = MathF.Sin( _gaitPhase * 0.5f );\n\t\tvar sideDetail = MathF.Sin( _gaitPhase * 1.5f \u002B 0.35f ) * GaitDetail;\n\t\tvar footPlant = MathF.Abs( MathF.Cos( _gaitPhase ) ) - MeanAbsoluteCosine;\n\t\tvar stepDetail = MathF.Sin( _gaitPhase * 2f \u002B 0.7f ) * GaitDetail;\n\t\tvar movementAmount = Amount * _movementStrength;\n\t\tvar idleBlend = _isGrounded\n\t\t\t? 1f - (_movementStrength / 0.45f).Clamp( 0f, 1f )\n\t\t\t: 0f;\n\t\tvar breathWave = MathF.Sin( _idlePhase );\n\t\tvar weightShift = MathF.Sin( _idlePhase * 0.5f );\n\n\t\tvar sideOffset = (sideWave \u002B sideDetail) * HorizontalAmount * movementAmount;\n\t\tsideOffset \u002B= weightShift * IdleAmount * 0.22f * idleBlend * Amount;\n\t\tsideOffset -= lagSide * InertiaAmount * Amount;\n\n\t\tvar verticalOffset = -(footPlant \u002B stepDetail) * VerticalAmount * movementAmount;\n\t\tverticalOffset \u002B= breathWave * IdleAmount * idleBlend * Amount;\n\t\tverticalOffset \u002B= _landingOffset * Amount;\n\n\t\tvar forwardOffset = -lagForward * InertiaAmount * Amount;\n\t\tvar pitch = (footPlant \u002B stepDetail * 0.5f) * PitchAmount * movementAmount;\n\t\tpitch -= breathWave * IdlePitchAmount * idleBlend * Amount;\n\t\tpitch -= forwardSpeed * VelocityPitchAmount * Amount;\n\t\tpitch -= lagForward * VelocityPitchAmount * Amount;\n\n\t\tvar roll = -(sideWave \u002B sideDetail * 0.5f) * RollAmount * movementAmount;\n\t\troll \u002B= weightShift * IdlePitchAmount * 0.22f * idleBlend * Amount;\n\t\troll \u002B= sideSpeed * VelocityRollAmount * Amount;\n\t\troll \u002B= lagSide * VelocityRollAmount * Amount;\n\n\t\tvar localOffset = new Vector3( forwardOffset, sideOffset, verticalOffset );\n\t\tvar offsetLength = localOffset.Length;\n\t\tif ( offsetLength \u003E MaximumPositionOffset )\n\t\t\tlocalOffset *= MaximumPositionOffset / offsetLength;\n\n\t\tpitch = pitch.Clamp( -MaximumRotationOffset, MaximumRotationOffset );\n\t\troll = roll.Clamp( -MaximumRotationOffset, MaximumRotationOffset );\n\n\t\tcamera.WorldPosition \u002B= rotation.Forward * localOffset.x;\n\t\tcamera.WorldPosition \u002B= rotation.Right * localOffset.y;\n\t\tcamera.WorldPosition \u002B= rotation.Up * localOffset.z;\n\t\tcamera.WorldRotation *= Rotation.From( pitch, 0f, roll );\n\t}\n\n\tvoid InitializeState()\n\t{\n\t\tif ( !Controller.IsValid() )\n\t\t\treturn;\n\n\t\t_gaitPhase = 0f;\n\t\t_movementStrength = 0f;\n\t\t_cadence = 0f;\n\t\t_velocity = Controller.Velocity;\n\t\tvar planarVelocity = new Vector3( _velocity.x, _velocity.y, 0f );\n\t\t_smoothedVelocity = planarVelocity;\n\t\t_inertiaVelocity = planarVelocity;\n\t\t_wasGrounded = Controller.IsOnGround;\n\t\t_isGrounded = _wasGrounded;\n\t\t_lastVerticalVelocity = _velocity.z;\n\t\t_landingOffset = 0f;\n\t\t_landingVelocity = 0f;\n\t\t_initialized = true;\n\t}\n\n\tvoid UpdateLandingSpring( float delta )\n\t{\n\t\tvar remaining = delta;\n\t\tvar spring = MathF.Max( LandingSpring, 1f );\n\t\tvar damping = MathF.Max( LandingDamping, 0.1f );\n\n\t\twhile ( remaining \u003E 0f )\n\t\t{\n\t\t\tvar step = MathF.Min( remaining, 1f / 120f );\n\t\t\tvar acceleration = -spring * spring * _landingOffset\n\t\t\t\t- 2f * damping * spring * _landingVelocity;\n\t\t\t_landingVelocity \u002B= acceleration * step;\n\t\t\t_landingOffset \u002B= _landingVelocity * step;\n\t\t\tremaining -= step;\n\t\t}\n\n\t\t_landingOffset = _landingOffset.Clamp( -LandingDip * 1.25f, LandingDip * 0.35f );\n\t}\n\n\tstatic float ExponentialBlend( float speed, float delta )\n\t{\n\t\treturn 1f - MathF.Exp( -MathF.Max( speed, 0.01f ) * delta );\n\t}\n}\n"},{"Ident":"notpointless.chomnr_head_bobbing_effect","Path":"FirstPersonHeadBob.cs","FileName":"FirstPersonHeadBob.cs","PackageType":"library","CodeKind":"Game","AssetVersionId":339025,"Code":"using System;\n\nnamespace Sandbox;\n\n[Title( \u0022Head Bobbing Effect\u0022 )]\n[Category( \u0022Camera\u0022 )]\n[Description( \u0022Polished first-person camera motion driven by player velocity.\u0022 )]\n[Icon( \u0022visibility\u0022 )]\npublic sealed class FirstPersonHeadBob : Component\n{\n\tconst float MeanAbsoluteCosine = 0.6366198f;\n\n\t[Property, Group( \u0022Motion\u0022 ), Range( 0f, 2f )]\n\tpublic float Amount { get; set; } = 1f;\n\n\t[Property, Group( \u0022Motion\u0022 ), Range( 0f, 3f )]\n\tpublic float HorizontalAmount { get; set; } = 0.85f;\n\n\t[Property, Group( \u0022Motion\u0022 ), Range( 0f, 3f )]\n\tpublic float VerticalAmount { get; set; } = 1.2f;\n\n\t[Property, Group( \u0022Motion\u0022 ), Range( 0.5f, 4f )]\n\tpublic float StepFrequency { get; set; } = 1.9f;\n\n\t[Property, Group( \u0022Motion\u0022 ), Range( 0f, 0.5f )]\n\tpublic float GaitDetail { get; set; } = 0.12f;\n\n\t[Property, Group( \u0022Motion\u0022 ), Range( 0.25f, 1f )]\n\tpublic float CrouchMultiplier { get; set; } = 0.72f;\n\n\t[Property, Group( \u0022Idle\u0022 ), Range( 0f, 1f )]\n\tpublic float IdleAmount { get; set; } = 0.5f;\n\n\t[Property, Group( \u0022Idle\u0022 ), Range( 0.05f, 1f )]\n\tpublic float BreathingFrequency { get; set; } = 0.23f;\n\n\t[Property, Group( \u0022Idle\u0022 ), Range( 0f, 1f )]\n\tpublic float IdlePitchAmount { get; set; } = 0.32f;\n\n\t[Property, Group( \u0022Rotation\u0022 ), Range( 0f, 2f )]\n\tpublic float PitchAmount { get; set; } = 0.38f;\n\n\t[Property, Group( \u0022Rotation\u0022 ), Range( 0f, 2f )]\n\tpublic float RollAmount { get; set; } = 0.62f;\n\n\t[Property, Group( \u0022Velocity\u0022 ), Range( 0f, 2f )]\n\tpublic float VelocityPitchAmount { get; set; } = 0.32f;\n\n\t[Property, Group( \u0022Velocity\u0022 ), Range( 0f, 3f )]\n\tpublic float VelocityRollAmount { get; set; } = 0.75f;\n\n\t[Property, Group( \u0022Velocity\u0022 ), Range( 0f, 3f )]\n\tpublic float InertiaAmount { get; set; } = 0.85f;\n\n\t[Property, Group( \u0022Velocity\u0022 ), Range( 1f, 30f )]\n\tpublic float VelocitySmoothing { get; set; } = 6.5f;\n\n\t[Property, Group( \u0022Velocity\u0022 ), Range( 1f, 30f )]\n\tpublic float InertiaSmoothing { get; set; } = 3.5f;\n\n\t[Property, Group( \u0022Response\u0022 ), Range( 1f, 30f )]\n\tpublic float BlendSpeed { get; set; } = 6.5f;\n\n\t[Property, Group( \u0022Response\u0022 ), Range( 1f, 30f )]\n\tpublic float CadenceSmoothing { get; set; } = 5.5f;\n\n\t[Property, Group( \u0022Response\u0022 ), Range( 1f, 30f )]\n\tpublic float AirborneBlendSpeed { get; set; } = 5f;\n\n\t[Property, Group( \u0022Landing\u0022 ), Range( 0f, 4f )]\n\tpublic float LandingDip { get; set; } = 1.6f;\n\n\t[Property, Group( \u0022Landing\u0022 ), Range( 1f, 30f )]\n\tpublic float LandingSpring { get; set; } = 15f;\n\n\t[Property, Group( \u0022Landing\u0022 ), Range( 0.1f, 2f )]\n\tpublic float LandingDamping { get; set; } = 0.82f;\n\n\t[Property, Group( \u0022Speed\u0022 ), Range( 0f, 100f )]\n\tpublic float MinimumSpeed { get; set; } = 1.5f;\n\n\t[Property, Group( \u0022Speed\u0022 ), Range( 1f, 500f )]\n\tpublic float ReferenceSpeed { get; set; } = 110f;\n\n\t[Property, Group( \u0022Speed\u0022 ), Range( 1f, 3f )]\n\tpublic float MaximumSpeedScale { get; set; } = 1.65f;\n\n\t[Property, Group( \u0022Safety\u0022 ), Range( 0.5f, 8f )]\n\tpublic float MaximumPositionOffset { get; set; } = 3.5f;\n\n\t[Property, Group( \u0022Safety\u0022 ), Range( 0.5f, 5f )]\n\tpublic float MaximumRotationOffset { get; set; } = 2.5f;\n\n\tPlayerController Controller { get; set; }\n\n\tfloat _gaitPhase;\n\tfloat _idlePhase;\n\tfloat _movementStrength;\n\tfloat _cadence;\n\tfloat _landingOffset;\n\tfloat _landingVelocity;\n\tfloat _lastVerticalVelocity;\n\tVector3 _velocity;\n\tVector3 _smoothedVelocity;\n\tVector3 _inertiaVelocity;\n\tbool _wasGrounded;\n\tbool _isGrounded;\n\tbool _initialized;\n\n\tprotected override void OnStart()\n\t{\n\t\tController = Components.Get\u003CPlayerController\u003E();\n\t\tInitializeState();\n\t}\n\n\tprotected override void OnDisabled()\n\t{\n\t\t_initialized = false;\n\t\t_movementStrength = 0f;\n\t\t_cadence = 0f;\n\t\t_landingOffset = 0f;\n\t\t_landingVelocity = 0f;\n\t}\n\n\tprotected override void OnUpdate()\n\t{\n\t\tController ??= Components.Get\u003CPlayerController\u003E();\n\n\t\tif ( !Controller.IsValid() || IsProxy || Controller.ThirdPerson )\n\t\t{\n\t\t\t_initialized = false;\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !_initialized )\n\t\t\tInitializeState();\n\n\t\tvar delta = MathF.Min( Time.Delta, 0.05f );\n\t\tif ( delta \u003C= 0f )\n\t\t\treturn;\n\n\t\t_velocity = Controller.Velocity;\n\t\tvar planarVelocity = new Vector3( _velocity.x, _velocity.y, 0f );\n\t\tvar planarSpeed = planarVelocity.Length;\n\t\tvar grounded = Controller.IsOnGround;\n\t\tvar moving = grounded \u0026\u0026 planarSpeed \u003E= MinimumSpeed;\n\t\tvar referenceSpeed = MathF.Max( ReferenceSpeed, 1f );\n\t\tvar speedScale = (planarSpeed / referenceSpeed).Clamp( 0f, MaximumSpeedScale );\n\t\tvar crouchScale = Controller.IsDucking ? CrouchMultiplier : 1f;\n\t\tvar targetStrength = moving ? speedScale * crouchScale : 0f;\n\t\tvar targetCadence = moving ? speedScale * MathF.Sqrt( crouchScale ) : 0f;\n\t\tvar movementBlendSpeed = grounded ? BlendSpeed : AirborneBlendSpeed;\n\n\t\t_movementStrength = MathX.LerpTo(\n\t\t\t_movementStrength,\n\t\t\ttargetStrength,\n\t\t\tExponentialBlend( movementBlendSpeed, delta )\n\t\t);\n\t\t_cadence = MathX.LerpTo(\n\t\t\t_cadence,\n\t\t\ttargetCadence,\n\t\t\tExponentialBlend( CadenceSmoothing, delta )\n\t\t);\n\t\t_smoothedVelocity = Vector3.Lerp(\n\t\t\t_smoothedVelocity,\n\t\t\tplanarVelocity,\n\t\t\tExponentialBlend( VelocitySmoothing, delta )\n\t\t);\n\t\t_inertiaVelocity = Vector3.Lerp(\n\t\t\t_inertiaVelocity,\n\t\t\t_smoothedVelocity,\n\t\t\tExponentialBlend( InertiaSmoothing, delta )\n\t\t);\n\n\t\t_idlePhase = (_idlePhase \u002B MathF.Tau * BreathingFrequency * delta) % (MathF.Tau * 2f);\n\n\t\tif ( grounded \u0026\u0026 _cadence \u003E 0.001f )\n\t\t{\n\t\t\t_gaitPhase \u002B= MathF.PI * StepFrequency * _cadence * delta;\n\t\t\t_gaitPhase %= MathF.Tau * 2f;\n\t\t}\n\n\t\tif ( grounded \u0026\u0026 !_wasGrounded )\n\t\t{\n\t\t\tvar impact = (-_lastVerticalVelocity / 600f).Clamp( 0f, 1f );\n\t\t\t_landingVelocity -= impact * LandingDip * LandingSpring;\n\t\t}\n\n\t\tUpdateLandingSpring( delta );\n\n\t\tif ( !grounded )\n\t\t\t_lastVerticalVelocity = _velocity.z;\n\n\t\t_wasGrounded = grounded;\n\t\t_isGrounded = grounded;\n\t}\n\n\tprotected override void OnPreRender()\n\t{\n\t\tif ( !_initialized || !Controller.IsValid() || IsProxy || Controller.ThirdPerson )\n\t\t\treturn;\n\n\t\tvar camera = Scene.Camera;\n\t\tif ( !camera.IsValid() )\n\t\t\treturn;\n\n\t\tvar rotation = camera.WorldRotation;\n\t\tvar flatForward = new Vector3( rotation.Forward.x, rotation.Forward.y, 0f );\n\t\tvar flatLength = flatForward.Length;\n\t\tflatForward = flatLength \u003E 0.001f ? flatForward / flatLength : Vector3.Forward;\n\t\tvar flatRight = new Vector3( -flatForward.y, flatForward.x, 0f );\n\t\tvar referenceSpeed = MathF.Max( ReferenceSpeed, 1f );\n\t\tvar forwardSpeed = (_smoothedVelocity.Dot( flatForward ) / referenceSpeed)\n\t\t\t.Clamp( -MaximumSpeedScale, MaximumSpeedScale );\n\t\tvar sideSpeed = (_smoothedVelocity.Dot( flatRight ) / referenceSpeed)\n\t\t\t.Clamp( -MaximumSpeedScale, MaximumSpeedScale );\n\t\tvar velocityLag = (_smoothedVelocity - _inertiaVelocity) / referenceSpeed;\n\t\tvar lagForward = velocityLag.Dot( flatForward ).Clamp( -1f, 1f );\n\t\tvar lagSide = velocityLag.Dot( flatRight ).Clamp( -1f, 1f );\n\n\t\tvar sideWave = MathF.Sin( _gaitPhase * 0.5f );\n\t\tvar sideDetail = MathF.Sin( _gaitPhase * 1.5f \u002B 0.35f ) * GaitDetail;\n\t\tvar footPlant = MathF.Abs( MathF.Cos( _gaitPhase ) ) - MeanAbsoluteCosine;\n\t\tvar stepDetail = MathF.Sin( _gaitPhase * 2f \u002B 0.7f ) * GaitDetail;\n\t\tvar movementAmount = Amount * _movementStrength;\n\t\tvar idleBlend = _isGrounded\n\t\t\t? 1f - (_movementStrength / 0.45f).Clamp( 0f, 1f )\n\t\t\t: 0f;\n\t\tvar breathWave = MathF.Sin( _idlePhase );\n\t\tvar weightShift = MathF.Sin( _idlePhase * 0.5f );\n\n\t\tvar sideOffset = (sideWave \u002B sideDetail) * HorizontalAmount * movementAmount;\n\t\tsideOffset \u002B= weightShift * IdleAmount * 0.22f * idleBlend * Amount;\n\t\tsideOffset -= lagSide * InertiaAmount * Amount;\n\n\t\tvar verticalOffset = -(footPlant \u002B stepDetail) * VerticalAmount * movementAmount;\n\t\tverticalOffset \u002B= breathWave * IdleAmount * idleBlend * Amount;\n\t\tverticalOffset \u002B= _landingOffset * Amount;\n\n\t\tvar forwardOffset = -lagForward * InertiaAmount * Amount;\n\t\tvar pitch = (footPlant \u002B stepDetail * 0.5f) * PitchAmount * movementAmount;\n\t\tpitch -= breathWave * IdlePitchAmount * idleBlend * Amount;\n\t\tpitch -= forwardSpeed * VelocityPitchAmount * Amount;\n\t\tpitch -= lagForward * VelocityPitchAmount * Amount;\n\n\t\tvar roll = -(sideWave \u002B sideDetail * 0.5f) * RollAmount * movementAmount;\n\t\troll \u002B= weightShift * IdlePitchAmount * 0.22f * idleBlend * Amount;\n\t\troll \u002B= sideSpeed * VelocityRollAmount * Amount;\n\t\troll \u002B= lagSide * VelocityRollAmount * Amount;\n\n\t\tvar localOffset = new Vector3( forwardOffset, sideOffset, verticalOffset );\n\t\tvar offsetLength = localOffset.Length;\n\t\tif ( offsetLength \u003E MaximumPositionOffset )\n\t\t\tlocalOffset *= MaximumPositionOffset / offsetLength;\n\n\t\tpitch = pitch.Clamp( -MaximumRotationOffset, MaximumRotationOffset );\n\t\troll = roll.Clamp( -MaximumRotationOffset, MaximumRotationOffset );\n\n\t\tcamera.WorldPosition \u002B= rotation.Forward * localOffset.x;\n\t\tcamera.WorldPosition \u002B= rotation.Right * localOffset.y;\n\t\tcamera.WorldPosition \u002B= rotation.Up * localOffset.z;\n\t\tcamera.WorldRotation *= Rotation.From( pitch, 0f, roll );\n\t}\n\n\tvoid InitializeState()\n\t{\n\t\tif ( !Controller.IsValid() )\n\t\t\treturn;\n\n\t\t_gaitPhase = 0f;\n\t\t_movementStrength = 0f;\n\t\t_cadence = 0f;\n\t\t_velocity = Controller.Velocity;\n\t\tvar planarVelocity = new Vector3( _velocity.x, _velocity.y, 0f );\n\t\t_smoothedVelocity = planarVelocity;\n\t\t_inertiaVelocity = planarVelocity;\n\t\t_wasGrounded = Controller.IsOnGround;\n\t\t_isGrounded = _wasGrounded;\n\t\t_lastVerticalVelocity = _velocity.z;\n\t\t_landingOffset = 0f;\n\t\t_landingVelocity = 0f;\n\t\t_initialized = true;\n\t}\n\n\tvoid UpdateLandingSpring( float delta )\n\t{\n\t\tvar remaining = delta;\n\t\tvar spring = MathF.Max( LandingSpring, 1f );\n\t\tvar damping = MathF.Max( LandingDamping, 0.1f );\n\n\t\twhile ( remaining \u003E 0f )\n\t\t{\n\t\t\tvar step = MathF.Min( remaining, 1f / 120f );\n\t\t\tvar acceleration = -spring * spring * _landingOffset\n\t\t\t\t- 2f * damping * spring * _landingVelocity;\n\t\t\t_landingVelocity \u002B= acceleration * step;\n\t\t\t_landingOffset \u002B= _landingVelocity * step;\n\t\t\tremaining -= step;\n\t\t}\n\n\t\t_landingOffset = _landingOffset.Clamp( -LandingDip * 1.25f, LandingDip * 0.35f );\n\t}\n\n\tstatic float ExponentialBlend( float speed, float delta )\n\t{\n\t\treturn 1f - MathF.Exp( -MathF.Max( speed, 0.01f ) * delta );\n\t}\n}\n"},{"Ident":"notpointless.chomnr_head_bobbing_effect","Path":".obj/__compiler_extra.cs","FileName":"__compiler_extra.cs","PackageType":"library","CodeKind":"Game","AssetVersionId":339025,"Code":"global using static Sandbox.Internal.GlobalGameNamespace;\r\nglobal using Microsoft.AspNetCore.Components;\r\nglobal using Microsoft.AspNetCore.Components.Rendering;\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022AddonTitle\u0022, \u0022Head Bobbing Effect\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022AddonIdent\u0022, \u0022chomnr_head_bobbing_effect\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022OrgIdent\u0022, \u0022notpointless\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022Ident\u0022, \u0022notpointless.chomnr_head_bobbing_effect\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022EngineVersion\u0022, \u002228\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022EngineMinorVersion\u0022, \u00221\u0022 )]\r\n\r\n[assembly: System.Runtime.Versioning.TargetFramework( \u0022.NETCoreApp,Version=v9.0\u0022, FrameworkDisplayName = \u0022.NET 9.0\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022CompileTime\u0022, \u00222026-08-05T20:29:59.4807449Z\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyVersion(\u00220.0.129.0\u0022)]\r\n[assembly: global::System.Reflection.AssemblyFileVersion(\u00220.0.129.0\u0022)]"}]}