{"TotalCount":17,"Files":[{"Ident":"viper.viperscitzencontroller","Path":"Components/CameraMovement.cs","FileName":"CameraMovement.cs","PackageType":"library","CodeKind":"Game","AssetVersionId":72227,"IsPrivate":false,"Code":"using Sandbox;\r\n\r\npublic sealed class CameraMovement : Component\r\n{\r\n\t[Property] public CharacterController1 Player { get; set; }\r\n\t[Property] public GameObject Body { get; set; }\r\n\t[Property] public GameObject Head { get; set; }\r\n\t[Property] public float Distance { get; set; } = 0f;\r\n\t[Property] public float Sensitivity { get; set; } = 0.1f;\r\n\tpublic bool IsFirstPerson =\u003E Distance == 0f;\r\n\tprivate CameraComponent Camera;\r\n\tprivate ModelRenderer BodyRenderer;\r\n\tprivate Vector3 CurrentOffset = Vector3.Zero;\r\n\tprotected override void OnAwake()\r\n\t{\r\n\t\tbase.OnAwake();\r\n\t\tCamera = Components.Get\u003CCameraComponent\u003E();\r\n\t\tBodyRenderer = Body.Components.Get\u003CModelRenderer\u003E();\r\n\t}\r\n\tprotected override void OnUpdate()\r\n\t{\r\n\t\tvar eyeAngles = Head.Transform.Rotation.Angles();\r\n\t\teyeAngles.pitch \u002B= Input.MouseDelta.y * Sensitivity;\r\n\t\teyeAngles.yaw -= Input.MouseDelta.x * Sensitivity;\r\n\t\teyeAngles.roll = 0f;\r\n\t\teyeAngles.pitch = eyeAngles.pitch.Clamp( -89.9f, 89.9f );\r\n\t\tHead.Transform.Rotation = eyeAngles.ToRotation();\r\n\t\tvar targetOffset = Vector3.Zero;\r\n\t\tif ( Player.IsCrouching ) targetOffset \u002B= Vector3.Down * 35f;\r\n\t\tCurrentOffset = Vector3.Lerp( CurrentOffset, targetOffset, Time.Delta * 10f );\r\n\t\tif ( Camera is not null )\r\n\t\t{\r\n\t\t\tvar camPos = Head.Transform.Position \u002B CurrentOffset;\r\n\t\t\tif ( !IsFirstPerson )\r\n\t\t\t{\r\n\t\t\t\tvar camForward = eyeAngles.ToRotation().Forward;\r\n\t\t\t\tvar camTrace = Scene.Trace.Ray( camPos, camPos - (camForward * Distance) )\r\n\t\t\t\t\t.WithoutTags( \u0022player\u0022, \u0022trigger\u0022 )\r\n\t\t\t\t\t.Run();\r\n\t\t\t\tif ( camTrace.Hit )\r\n\t\t\t\t{\r\n\t\t\t\t\tcamPos = camTrace.HitPosition \u002B camTrace.Normal;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tcamPos = camTrace.EndPosition;\r\n\t\t\t\t}\r\n\t\t\t\tBodyRenderer.RenderType = ModelRenderer.ShadowRenderType.On;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tBodyRenderer.RenderType = ModelRenderer.ShadowRenderType.ShadowsOnly;\r\n\t\t\t}\r\n\r\n\r\n\t\t\tLog.Info( CurrentOffset );\r\n\t\t\tCamera.Transform.Position = camPos;\r\n\t\t\tCamera.Transform.Rotation = eyeAngles.ToRotation();\r\n\t\t}\r\n\t}\r\n}\r\n"},{"Ident":"viper.viperscitzencontroller","Path":"Code/MyLibraryComponent.cs","FileName":"MyLibraryComponent.cs","PackageType":"library","CodeKind":"Game","AssetVersionId":72227,"IsPrivate":false,"Code":"using Sandbox;\r\n\r\n/// \u003Csummary\u003E\r\n/// This is a component - in your library!\r\n/// \u003C/summary\u003E\r\n[Title( \u0022Viper\u0027s Citzen Controller - My Component\u0022 )]\r\npublic class MyLibraryComponent : Component\r\n{\r\n\r\n}\r\n"},{"Ident":"viper.viperscitzencontroller","Path":"UnitTests/UnitTest.cs","FileName":"UnitTest.cs","PackageType":"library","CodeKind":"UnitTest","AssetVersionId":72227,"IsPrivate":false,"Code":"global using Microsoft.VisualStudio.TestTools.UnitTesting;\r\n\r\n[TestClass]\r\npublic class TestInit\r\n{\r\n\t[AssemblyInitialize]\r\n\tpublic static void ClassInitialize( TestContext context )\r\n\t{\r\n\t\tSandbox.Application.InitUnitTest();\r\n\t}\r\n}\r\n"},{"Ident":"viper.viperscitzencontroller","Path":"Code/Assembly.cs","FileName":"Assembly.cs","PackageType":"library","CodeKind":"Game","AssetVersionId":72227,"IsPrivate":false,"Code":"global using Sandbox;\r\nglobal using System.Collections.Generic;\r\nglobal using System.Linq;\r\n"},{"Ident":"viper.viperscitzencontroller","Path":"Code/Components/CharctorController.cs","FileName":"CharctorController.cs","PackageType":"library","CodeKind":"Game","AssetVersionId":72227,"IsPrivate":false,"Code":"using Sandbox;\r\nusing Sandbox.Citizen;\r\n\r\n\r\npublic sealed class CharacterController1 : Component\r\n{\r\n\t[Property] public float GroundControl { get; set; } = 4.0f;\r\n\t[Property] public float AirControl { get; set; } = 0.1f;\r\n\t[Property] public float MaxForce { get; set; } = 50f;\r\n\t[Property] public float Speed { get; set; } = 160f;\r\n\t[Property] public float RunSpeed { get; set; } = 290f;\r\n\t[Property] public float CrouchSpeed { get; set; } = 90f;\r\n\t[Property] public float JumpForce { get; set; } = 400f;\r\n\t[Property] public GameObject Head { get; set; }\r\n\t[Property] public GameObject Body { get; set; }\r\n\tpublic Vector3 WishVelocity { get; set; }\r\n\tpublic bool IsCrouching = false;\r\n\tpublic bool IsSprinting = false;\r\n\tpublic bool canUnCrouch = false;\r\n\tprivate CharacterController characterController;\r\n\tprivate CitizenAnimationHelper animationHelper;\r\n\tprotected override void OnAwake()\r\n\t{\r\n\t\tbase.OnAwake();\r\n\t\tcharacterController = Components.Get\u003CCharacterController\u003E();\r\n\t\tanimationHelper = Components.Get\u003CCitizenAnimationHelper\u003E();\r\n\t}\r\n\tprotected override void OnUpdate()\r\n\t{\r\n\t\tbase.OnUpdate();\r\n\t\tUpdateCrouch();\r\n\t\tIsSprinting = Input.Down( \u0022Run\u0022 );\r\n\t\tRotateBody();\r\n\t\tif ( Input.Pressed( \u0022Jump\u0022 ) ) Jump();\r\n\t\tUpdateAnimations();\r\n\t}\r\n\tprotected override void OnFixedUpdate()\r\n\t{\r\n\t\tbase.OnFixedUpdate();\r\n\t\tBuildWishVelocity();\r\n\t\tMove();\r\n\t}\r\n\tvoid BuildWishVelocity()\r\n\t{\r\n\t\tWishVelocity = 0;\r\n\r\n\t\tvar rot = Head.Transform.Rotation;\r\n\t\tif ( Input.Down( \u0022Forward\u0022 ) ) WishVelocity \u002B= rot.Forward;\r\n\t\tif ( Input.Down( \u0022Backward\u0022 ) ) WishVelocity \u002B= rot.Backward;\r\n\t\tif ( Input.Down( \u0022Left\u0022 ) ) WishVelocity \u002B= rot.Left;\r\n\t\tif ( Input.Down( \u0022Right\u0022 ) ) WishVelocity \u002B= rot.Right;\r\n\r\n\t\tWishVelocity = WishVelocity.WithZ( 0 );\r\n\r\n\t\tif ( !WishVelocity.IsNearZeroLength ) WishVelocity = WishVelocity.Normal;\r\n\r\n\t\tif ( IsCrouching ) WishVelocity *= CrouchSpeed; // Crouching takes presedence over sprinting\r\n\t\telse if ( IsSprinting ) WishVelocity *= RunSpeed; // Sprinting takes presedence over walking\r\n\t\telse WishVelocity *= Speed;\r\n\t}\r\n\tvoid Move()\r\n\t{\r\n\t\t// Get gravity from our scene\r\n\t\tvar gravity = Scene.PhysicsWorld.Gravity;\r\n\r\n\t\tif ( characterController.IsOnGround )\r\n\t\t{\r\n\t\t\t// Apply Friction/Acceleration\r\n\t\t\tcharacterController.Velocity = characterController.Velocity.WithZ( 0 );\r\n\t\t\tcharacterController.Accelerate( WishVelocity );\r\n\t\t\tcharacterController.ApplyFriction( GroundControl );\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t// Apply Air Control / Gravity\r\n\t\t\tcharacterController.Velocity \u002B= gravity * Time.Delta * 0.5f;\r\n\t\t\tcharacterController.Accelerate( WishVelocity.ClampLength( MaxForce ) );\r\n\t\t\tcharacterController.ApplyFriction( AirControl );\r\n\t\t}\r\n\r\n\t\t// Move the character controller\r\n\t\tcharacterController.Move();\r\n\r\n\t\t// Apply the second half of gravity after movement\r\n\t\tif ( !characterController.IsOnGround )\r\n\t\t{\r\n\t\t\tcharacterController.Velocity \u002B= gravity * Time.Delta * 0.5f;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tcharacterController.Velocity = characterController.Velocity.WithZ( 0 );\r\n\t\t}\r\n\t}\r\n\tvoid RotateBody()\r\n\t{\r\n\t\tif ( Body is null ) return;\r\n\t\tvar targetAngle = new Angles( 0, Head.Transform.Rotation.Yaw(), 0 ).ToRotation();\r\n\t\tfloat rotateDiffrence = Body.Transform.Rotation.Distance( targetAngle );\r\n\t\tif ( rotateDiffrence \u003E 10f || characterController.Velocity.Length \u003E 10f )\r\n\t\t{\r\n\t\t\tBody.Transform.Rotation = Rotation.Lerp( Body.Transform.Rotation, targetAngle, Time.Delta * 2f );\r\n\t\t}\r\n\t}\r\n\tvoid Jump()\r\n\t{\r\n\t\tif ( !characterController.IsOnGround ) return;\r\n\t\tcharacterController.Punch( Vector3.Up * JumpForce );\r\n\t\tanimationHelper?.TriggerJump();\r\n\t}\r\n\tvoid UpdateAnimations()\r\n\t{ \r\n\t\tif(animationHelper is null) return;\r\n\t\tanimationHelper.WithWishVelocity( WishVelocity );\r\n\t\tanimationHelper.WithVelocity( characterController.Velocity );\r\n\t\tanimationHelper.AimAngle = Head.Transform.Rotation;\r\n\t\tanimationHelper.IsGrounded = characterController.IsOnGround;\r\n\t\tanimationHelper.WithLook( Head.Transform.Rotation.Forward, 1f, 0.75f, 0.5f );\r\n\t\tanimationHelper.MoveStyle = CitizenAnimationHelper.MoveStyles.Run;\r\n\t\tanimationHelper.DuckLevel = IsCrouching ? 1f : 0f;\r\n\r\n\t}\r\n\tvoid UpdateCrouch()\r\n\t{ \r\n\t\tif ( characterController is null ) return;\r\n\r\n\t\tif ( Input.Pressed( \u0022Duck\u0022 ) \u0026\u0026 !IsCrouching)\r\n\t\t{ \r\n\t\t\tIsCrouching = true;\r\n\t\t\tcharacterController.Height /= 2f;\r\n\t\t}\r\n\t\tvar duckTrace = characterController.TraceDirection( Vector3.Up * characterController.Height );\r\n\t\tif ( duckTrace.Hit )\r\n\t\t{\r\n\t\t\tcanUnCrouch = false;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tcanUnCrouch = true;\r\n\t\t}\r\n\t\tif ( Input.Released( \u0022Duck\u0022 ) \u0026\u0026 IsCrouching \u0026\u0026 canUnCrouch ) //| IsCrouching \u0026\u0026 !Input.Pressed( \u0022Duck\u0022 ) \u0026\u0026 canUnCrouch \r\n\t\t{ \r\n\t\t\tIsCrouching = false;\r\n\t\t\tcharacterController.Height *= 2f;\r\n\t\t}\r\n\t\tif ( IsCrouching \u0026\u0026 !Input.Down( \u0022Duck\u0022 ) \u0026\u0026 canUnCrouch )\r\n\t\t{\r\n\t\t\tIsCrouching = false;\r\n\t\t\tcharacterController.Height *= 2f;\r\n\t\t}\r\n\t}\r\n}\r\n"},{"Ident":"viper.viperscitzencontroller","Path":"Code/MyComponent.cs","FileName":"MyComponent.cs","PackageType":"library","CodeKind":"Game","AssetVersionId":72227,"IsPrivate":false,"Code":"\r\npublic sealed class MyComponent : Component\r\n{\r\n\t[Property] public string StringProperty { get; set; }\r\n\r\n\tprotected override void OnUpdate()\r\n\t{\r\n\t}\r\n}\r\n"},{"Ident":"viper.viperscitzencontroller","Path":"Code/Components/StaticClothing.cs","FileName":"StaticClothing.cs","PackageType":"library","CodeKind":"Game","AssetVersionId":72227,"IsPrivate":false,"Code":"using Sandbox;\r\n\r\npublic sealed class StaticClothing : Component\r\n{\r\n\t[Property] private SkinnedModelRenderer ModelRenderer { get; set; }\r\n\t[Property] private List\u003CSandbox.Clothing\u003E ClothingOutfit { get; set; } = new();\r\n\r\n\tprotected override void OnStart()\r\n\t{\r\n\t\tvar container = new ClothingContainer();\r\n\r\n\t\tforeach ( Sandbox.Clothing item in ClothingOutfit )\r\n\t\t{\r\n\t\t\tcontainer.Toggle( item );\r\n\t\t}\r\n\r\n\t\tcontainer.Apply( ModelRenderer );\r\n\t}\r\n}\r\n"},{"Ident":"viper.viperscitzencontroller","Path":"Code/Components/CameraMovement.cs","FileName":"CameraMovement.cs","PackageType":"library","CodeKind":"Game","AssetVersionId":72227,"IsPrivate":false,"Code":"using Sandbox;\r\n\r\npublic sealed class CameraMovement : Component\r\n{\r\n\t[Property] public CharacterController1 Player { get; set; }\r\n\t[Property] public GameObject Body { get; set; }\r\n\t[Property] public GameObject Head { get; set; }\r\n\t[Property] public float Distance { get; set; } = 0f;\r\n\t[Property] public float Sensitivity { get; set; } = 0.1f;\r\n\tpublic bool IsFirstPerson =\u003E Distance == 0f;\r\n\tprivate CameraComponent Camera;\r\n\tprivate ModelRenderer BodyRenderer;\r\n\tprivate Vector3 CurrentOffset = Vector3.Zero;\r\n\tprotected override void OnAwake()\r\n\t{\r\n\t\tbase.OnAwake();\r\n\t\tCamera = Components.Get\u003CCameraComponent\u003E();\r\n\t\tBodyRenderer = Body.Components.Get\u003CModelRenderer\u003E();\r\n\t}\r\n\tprotected override void OnUpdate()\r\n\t{\r\n\t\tvar eyeAngles = Head.Transform.Rotation.Angles();\r\n\t\teyeAngles.pitch \u002B= Input.MouseDelta.y * Sensitivity;\r\n\t\teyeAngles.yaw -= Input.MouseDelta.x * Sensitivity;\r\n\t\teyeAngles.roll = 0f;\r\n\t\teyeAngles.pitch = eyeAngles.pitch.Clamp( -89.9f, 89.9f );\r\n\t\tHead.Transform.Rotation = eyeAngles.ToRotation();\r\n\t\tvar targetOffset = Vector3.Zero;\r\n\t\tif ( Player.IsCrouching ) targetOffset \u002B= Vector3.Down * 35f;\r\n\t\tCurrentOffset = Vector3.Lerp( CurrentOffset, targetOffset, Time.Delta * 10f );\r\n\t\tif ( Camera is not null )\r\n\t\t{\r\n\t\t\tvar camPos = Head.Transform.Position \u002B CurrentOffset;\r\n\t\t\tif ( !IsFirstPerson )\r\n\t\t\t{\r\n\t\t\t\tvar camForward = eyeAngles.ToRotation().Forward;\r\n\t\t\t\tvar camTrace = Scene.Trace.Ray( camPos, camPos - (camForward * Distance) )\r\n\t\t\t\t\t.WithoutTags( \u0022player\u0022, \u0022trigger\u0022 )\r\n\t\t\t\t\t.Run();\r\n\t\t\t\tif ( camTrace.Hit )\r\n\t\t\t\t{\r\n\t\t\t\t\tcamPos = camTrace.HitPosition \u002B camTrace.Normal;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tcamPos = camTrace.EndPosition;\r\n\t\t\t\t}\r\n\t\t\t\tBodyRenderer.RenderType = ModelRenderer.ShadowRenderType.On;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tBodyRenderer.RenderType = ModelRenderer.ShadowRenderType.ShadowsOnly;\r\n\t\t\t}\r\n\r\n\r\n\t\t\tLog.Info( CurrentOffset );\r\n\t\t\tCamera.Transform.Position = camPos;\r\n\t\t\tCamera.Transform.Rotation = eyeAngles.ToRotation();\r\n\t\t}\r\n\t}\r\n}\r\n"},{"Ident":"viper.viperscitzencontroller","Path":"Editor/MyEditorMenu.cs","FileName":"MyEditorMenu.cs","PackageType":"library","CodeKind":"Editor","AssetVersionId":72227,"IsPrivate":false,"Code":"using Editor;\r\n\r\npublic static class MyEditorMenu\r\n{\r\n\t[Menu( \u0022Editor\u0022, \u0022Viper\u0027s Citzen Controller/My Menu Option\u0022 )]\r\n\tpublic static void OpenMyMenu()\r\n\t{\r\n\t\tEditorUtility.DisplayDialog( \u0022It worked!\u0022, \u0022This is being called from your library\u0027s editor code!\u0022 );\r\n\t}\r\n}\r\n"},{"Ident":"viper.viperscitzencontroller","Path":".obj/__compiler_extra.cs","FileName":"__compiler_extra.cs","PackageType":"library","CodeKind":"Game","AssetVersionId":72227,"IsPrivate":false,"Code":"global using static Sandbox.Internal.GlobalGameNamespace;\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022AddonTitle\u0022, \u0022Viper\u0027s Citzen Controller\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022AddonIdent\u0022, \u0022viperscitzencontroller\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022OrgIdent\u0022, \u0022viper\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022Ident\u0022, \u0022viper.viperscitzencontroller\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022CompileTime\u0022, \u00229/7/2024 7:03:20 AM\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022EngineVersion\u0022, \u002217\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022EngineMinorVersion\u0022, \u00221\u0022 )]\r\n\r\n[assembly: System.Runtime.Versioning.TargetFramework( \u0022.NETCoreApp,Version=v7.0\u0022, FrameworkDisplayName = \u0022.NET 7.0\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyVersion(\u00220.0.119.0\u0022)]\r\n[assembly: global::System.Reflection.AssemblyFileVersion(\u00220.0.119.0\u0022)]"},{"Ident":"viper.viperscitzencontroller","Path":"Components/CharctorController.cs","FileName":"CharctorController.cs","PackageType":"library","CodeKind":"Game","AssetVersionId":72227,"IsPrivate":false,"Code":"using Sandbox;\r\nusing Sandbox.Citizen;\r\n\r\n\r\npublic sealed class CharacterController1 : Component\r\n{\r\n\t[Property] public float GroundControl { get; set; } = 4.0f;\r\n\t[Property] public float AirControl { get; set; } = 0.1f;\r\n\t[Property] public float MaxForce { get; set; } = 50f;\r\n\t[Property] public float Speed { get; set; } = 160f;\r\n\t[Property] public float RunSpeed { get; set; } = 290f;\r\n\t[Property] public float CrouchSpeed { get; set; } = 90f;\r\n\t[Property] public float JumpForce { get; set; } = 400f;\r\n\t[Property] public GameObject Head { get; set; }\r\n\t[Property] public GameObject Body { get; set; }\r\n\tpublic Vector3 WishVelocity { get; set; }\r\n\tpublic bool IsCrouching = false;\r\n\tpublic bool IsSprinting = false;\r\n\tpublic bool canUnCrouch = false;\r\n\tprivate CharacterController characterController;\r\n\tprivate CitizenAnimationHelper animationHelper;\r\n\tprotected override void OnAwake()\r\n\t{\r\n\t\tbase.OnAwake();\r\n\t\tcharacterController = Components.Get\u003CCharacterController\u003E();\r\n\t\tanimationHelper = Components.Get\u003CCitizenAnimationHelper\u003E();\r\n\t}\r\n\tprotected override void OnUpdate()\r\n\t{\r\n\t\tbase.OnUpdate();\r\n\t\tUpdateCrouch();\r\n\t\tIsSprinting = Input.Down( \u0022Run\u0022 );\r\n\t\tRotateBody();\r\n\t\tif ( Input.Pressed( \u0022Jump\u0022 ) ) Jump();\r\n\t\tUpdateAnimations();\r\n\t}\r\n\tprotected override void OnFixedUpdate()\r\n\t{\r\n\t\tbase.OnFixedUpdate();\r\n\t\tBuildWishVelocity();\r\n\t\tMove();\r\n\t}\r\n\tvoid BuildWishVelocity()\r\n\t{\r\n\t\tWishVelocity = 0;\r\n\r\n\t\tvar rot = Head.Transform.Rotation;\r\n\t\tif ( Input.Down( \u0022Forward\u0022 ) ) WishVelocity \u002B= rot.Forward;\r\n\t\tif ( Input.Down( \u0022Backward\u0022 ) ) WishVelocity \u002B= rot.Backward;\r\n\t\tif ( Input.Down( \u0022Left\u0022 ) ) WishVelocity \u002B= rot.Left;\r\n\t\tif ( Input.Down( \u0022Right\u0022 ) ) WishVelocity \u002B= rot.Right;\r\n\r\n\t\tWishVelocity = WishVelocity.WithZ( 0 );\r\n\r\n\t\tif ( !WishVelocity.IsNearZeroLength ) WishVelocity = WishVelocity.Normal;\r\n\r\n\t\tif ( IsCrouching ) WishVelocity *= CrouchSpeed; // Crouching takes presedence over sprinting\r\n\t\telse if ( IsSprinting ) WishVelocity *= RunSpeed; // Sprinting takes presedence over walking\r\n\t\telse WishVelocity *= Speed;\r\n\t}\r\n\tvoid Move()\r\n\t{\r\n\t\t// Get gravity from our scene\r\n\t\tvar gravity = Scene.PhysicsWorld.Gravity;\r\n\r\n\t\tif ( characterController.IsOnGround )\r\n\t\t{\r\n\t\t\t// Apply Friction/Acceleration\r\n\t\t\tcharacterController.Velocity = characterController.Velocity.WithZ( 0 );\r\n\t\t\tcharacterController.Accelerate( WishVelocity );\r\n\t\t\tcharacterController.ApplyFriction( GroundControl );\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t// Apply Air Control / Gravity\r\n\t\t\tcharacterController.Velocity \u002B= gravity * Time.Delta * 0.5f;\r\n\t\t\tcharacterController.Accelerate( WishVelocity.ClampLength( MaxForce ) );\r\n\t\t\tcharacterController.ApplyFriction( AirControl );\r\n\t\t}\r\n\r\n\t\t// Move the character controller\r\n\t\tcharacterController.Move();\r\n\r\n\t\t// Apply the second half of gravity after movement\r\n\t\tif ( !characterController.IsOnGround )\r\n\t\t{\r\n\t\t\tcharacterController.Velocity \u002B= gravity * Time.Delta * 0.5f;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tcharacterController.Velocity = characterController.Velocity.WithZ( 0 );\r\n\t\t}\r\n\t}\r\n\tvoid RotateBody()\r\n\t{\r\n\t\tif ( Body is null ) return;\r\n\t\tvar targetAngle = new Angles( 0, Head.Transform.Rotation.Yaw(), 0 ).ToRotation();\r\n\t\tfloat rotateDiffrence = Body.Transform.Rotation.Distance( targetAngle );\r\n\t\tif ( rotateDiffrence \u003E 10f || characterController.Velocity.Length \u003E 10f )\r\n\t\t{\r\n\t\t\tBody.Transform.Rotation = Rotation.Lerp( Body.Transform.Rotation, targetAngle, Time.Delta * 2f );\r\n\t\t}\r\n\t}\r\n\tvoid Jump()\r\n\t{\r\n\t\tif ( !characterController.IsOnGround ) return;\r\n\t\tcharacterController.Punch( Vector3.Up * JumpForce );\r\n\t\tanimationHelper?.TriggerJump();\r\n\t}\r\n\tvoid UpdateAnimations()\r\n\t{ \r\n\t\tif(animationHelper is null) return;\r\n\t\tanimationHelper.WithWishVelocity( WishVelocity );\r\n\t\tanimationHelper.WithVelocity( characterController.Velocity );\r\n\t\tanimationHelper.AimAngle = Head.Transform.Rotation;\r\n\t\tanimationHelper.IsGrounded = characterController.IsOnGround;\r\n\t\tanimationHelper.WithLook( Head.Transform.Rotation.Forward, 1f, 0.75f, 0.5f );\r\n\t\tanimationHelper.MoveStyle = CitizenAnimationHelper.MoveStyles.Run;\r\n\t\tanimationHelper.DuckLevel = IsCrouching ? 1f : 0f;\r\n\r\n\t}\r\n\tvoid UpdateCrouch()\r\n\t{ \r\n\t\tif ( characterController is null ) return;\r\n\r\n\t\tif ( Input.Pressed( \u0022Duck\u0022 ) \u0026\u0026 !IsCrouching)\r\n\t\t{ \r\n\t\t\tIsCrouching = true;\r\n\t\t\tcharacterController.Height /= 2f;\r\n\t\t}\r\n\t\tvar duckTrace = characterController.TraceDirection( Vector3.Up * characterController.Height );\r\n\t\tif ( duckTrace.Hit )\r\n\t\t{\r\n\t\t\tcanUnCrouch = false;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tcanUnCrouch = true;\r\n\t\t}\r\n\t\tif ( Input.Released( \u0022Duck\u0022 ) \u0026\u0026 IsCrouching \u0026\u0026 canUnCrouch ) //| IsCrouching \u0026\u0026 !Input.Pressed( \u0022Duck\u0022 ) \u0026\u0026 canUnCrouch \r\n\t\t{ \r\n\t\t\tIsCrouching = false;\r\n\t\t\tcharacterController.Height *= 2f;\r\n\t\t}\r\n\t\tif ( IsCrouching \u0026\u0026 !Input.Down( \u0022Duck\u0022 ) \u0026\u0026 canUnCrouch )\r\n\t\t{\r\n\t\t\tIsCrouching = false;\r\n\t\t\tcharacterController.Height *= 2f;\r\n\t\t}\r\n\t}\r\n}\r\n"},{"Ident":"viper.viperscitzencontroller","Path":"Components/StaticClothing.cs","FileName":"StaticClothing.cs","PackageType":"library","CodeKind":"Game","AssetVersionId":72227,"IsPrivate":false,"Code":"using Sandbox;\r\n\r\npublic sealed class StaticClothing : Component\r\n{\r\n\t[Property] private SkinnedModelRenderer ModelRenderer { get; set; }\r\n\t[Property] private List\u003CSandbox.Clothing\u003E ClothingOutfit { get; set; } = new();\r\n\r\n\tprotected override void OnStart()\r\n\t{\r\n\t\tvar container = new ClothingContainer();\r\n\r\n\t\tforeach ( Sandbox.Clothing item in ClothingOutfit )\r\n\t\t{\r\n\t\t\tcontainer.Toggle( item );\r\n\t\t}\r\n\r\n\t\tcontainer.Apply( ModelRenderer );\r\n\t}\r\n}\r\n"},{"Ident":"viper.viperscitzencontroller","Path":"MyComponent.cs","FileName":"MyComponent.cs","PackageType":"library","CodeKind":"Game","AssetVersionId":72227,"IsPrivate":false,"Code":"\r\npublic sealed class MyComponent : Component\r\n{\r\n\t[Property] public string StringProperty { get; set; }\r\n\r\n\tprotected override void OnUpdate()\r\n\t{\r\n\t}\r\n}\r\n"},{"Ident":"viper.viperscitzencontroller","Path":"Assembly.cs","FileName":"Assembly.cs","PackageType":"library","CodeKind":"Game","AssetVersionId":72227,"IsPrivate":false,"Code":"global using Sandbox;\r\nglobal using System.Collections.Generic;\r\nglobal using System.Linq;\r\n"},{"Ident":"viper.viperscitzencontroller","Path":"MyLibraryComponent.cs","FileName":"MyLibraryComponent.cs","PackageType":"library","CodeKind":"Game","AssetVersionId":72227,"IsPrivate":false,"Code":"using Sandbox;\r\n\r\n/// \u003Csummary\u003E\r\n/// This is a component - in your library!\r\n/// \u003C/summary\u003E\r\n[Title( \u0022Viper\u0027s Citzen Controller - My Component\u0022 )]\r\npublic class MyLibraryComponent : Component\r\n{\r\n\r\n}\r\n"},{"Ident":"viper.viperscitzencontroller","Path":"__gen_RazorNamespace.cs","FileName":"__gen_RazorNamespace.cs","PackageType":"library","CodeKind":"Game","AssetVersionId":72227,"IsPrivate":false,"Code":"global using Microsoft.AspNetCore.Components; \nglobal using Microsoft.AspNetCore.Components.Rendering;\n"},{"Ident":"viper.viperscitzencontroller","Path":"UnitTests/LibraryTest.cs","FileName":"LibraryTest.cs","PackageType":"library","CodeKind":"UnitTest","AssetVersionId":72227,"IsPrivate":false,"Code":"using Sandbox;\r\n\r\n[TestClass]\r\npublic partial class LibraryTests\r\n{\r\n\t[TestMethod]\r\n\tpublic void SceneTest()\r\n\t{\r\n\t\tvar scene = new Scene();\r\n\t\tusing ( scene.Push() )\r\n\t\t{\r\n\t\t\tvar go = new GameObject();\r\n\r\n\t\t\tAssert.AreEqual( 1, scene.Directory.GameObjectCount );\r\n\t\t}\r\n\t}\r\n\r\n}\r\n"}]}