{"TotalCount":7,"Files":[{"Ident":"harper.topdownplayercontroller","Path":"UnitTests/LibraryTest.cs","FileName":"LibraryTest.cs","PackageType":"library","CodeKind":"UnitTest","AssetVersionId":71868,"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"},{"Ident":"harper.topdownplayercontroller","Path":".obj/__compiler_extra.cs","FileName":"__compiler_extra.cs","PackageType":"library","CodeKind":"Game","AssetVersionId":71868,"Code":"global using static Sandbox.Internal.GlobalGameNamespace;\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022AddonTitle\u0022, \u0022Top Down Player Controller\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022AddonIdent\u0022, \u0022topdownplayercontroller\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022OrgIdent\u0022, \u0022harper\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022Ident\u0022, \u0022harper.topdownplayercontroller\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022CompileTime\u0022, \u00228/28/2024 10:44:44 PM\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.109.0\u0022)]\r\n[assembly: global::System.Reflection.AssemblyFileVersion(\u00220.0.109.0\u0022)]"},{"Ident":"harper.topdownplayercontroller","Path":"TopDownPlayerController.cs","FileName":"TopDownPlayerController.cs","PackageType":"library","CodeKind":"Game","AssetVersionId":71868,"Code":"using System.Linq;\r\nusing Sandbox;\r\nusing Sandbox.Citizen;\r\n\r\n[Title( \u0022Top Down Player Controller\u0022 )]\r\npublic class TopDownPlayerController : Component\r\n{\r\n    [Property] public CharacterController CharacterController { get; set; }\r\n\t[Property] public CitizenAnimationHelper AnimationHelper { get; set; }\r\n\t[Property] public float WalkSpeed { get; set; } = 198f;\r\n\t[Property] public float RunSpeed { get; set; } = 320f;\r\n\t[Property] public float CameraDistance { get; set; } = 600f;\r\n\r\n\tprotected override void OnUpdate()\r\n\t{\r\n\t\t\r\n\t}\r\n\r\n\tprotected override void OnFixedUpdate()\r\n\t{\r\n\t\tbase.OnFixedUpdate();\r\n\t\tMovementInput();\r\n\t\tUpdateAnimations();\r\n\t}\r\n\r\n\tprotected override void OnPreRender()\r\n\t{\r\n\t\t//UpdateCamera();\r\n\t}\r\n\r\n\r\n\tprivate void MovementInput()\r\n\t{\r\n\t\tif (CharacterController is null) return;\r\n\r\n\t\tAngles currentAngles = Transform.Rotation.Angles();\t\r\n\r\n\t\tVector3 analogMove = Input.AnalogMove;\r\n\t\tfloat speed = Input.Down(\u0022Run\u0022) ? RunSpeed : WalkSpeed;\r\n\t\tVector3 wishVelocity = new Vector3(-analogMove.y, analogMove.x, analogMove.z).Normal * speed;\r\n\r\n\t\tif (!wishVelocity.IsNearlyZero())\r\n\t\t{\r\n\r\n\t\t\tcurrentAngles.yaw = Rotation.LookAt(wishVelocity).Angles().yaw;\r\n\t\t\tTransform.Rotation = Rotation.From(currentAngles);\r\n\t\t}\r\n\t\tif (!CharacterController.IsOnGround) {\r\n\t\t\twishVelocity \u002B= Scene.PhysicsWorld.Gravity;\r\n\t\t}\r\n\r\n\t\tCharacterController.Velocity = wishVelocity;\r\n\t\tCharacterController.Move();\r\n\t\tTransform.Rotation = currentAngles;\r\n\t}\r\n\r\n\tprivate void UpdateAnimations()\r\n\t{\r\n\t\tif (AnimationHelper is null) return;\r\n\r\n\t\tAnimationHelper.WithVelocity(CharacterController.Velocity);\r\n\t}\r\n\r\n\tprivate void UpdateCamera()\r\n\t{\r\n\t\tCameraComponent camera = Scene.GetAllComponents\u003CCameraComponent\u003E().Where( x =\u003E x.IsMainCamera ).FirstOrDefault();\r\n\t\tif ( camera is null || CharacterController is null ) return;\r\n\r\n\t\tVector3 characterPostion = CharacterController.Transform.Position;\r\n\t\tVector3 newCameraPosition = new Vector3(characterPostion.x, characterPostion.y, characterPostion.z \u002B CharacterController.Height \u002B CameraDistance);\r\n\r\n\t\tcamera.Transform.Position = newCameraPosition;\r\n\t}\r\n}\r\n"},{"Ident":"harper.topdownplayercontroller","Path":"Editor/MyEditorMenu.cs","FileName":"MyEditorMenu.cs","PackageType":"library","CodeKind":"Editor","AssetVersionId":71868,"Code":"using Editor;\r\n\r\npublic static class MyEditorMenu\r\n{\r\n\t[Menu( \u0022Editor\u0022, \u0022Top Down Player 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":"harper.topdownplayercontroller","Path":"Code/TopDownPlayerController.cs","FileName":"TopDownPlayerController.cs","PackageType":"library","CodeKind":"Game","AssetVersionId":71868,"Code":"using System;\r\nusing System.Collections.Specialized;\r\nusing System.Linq;\r\nusing Sandbox;\r\nusing Sandbox.Citizen;\r\n\r\n[Title( \u0022Top Down Player Controller\u0022 )]\r\npublic class TopDownPlayerController : Component\r\n{\r\n    [Property] public CharacterController CharacterController { get; set; }\r\n\t[Property] public CitizenAnimationHelper AnimationHelper { get; set; }\r\n\t[Property, Group(\u0022Speed\u0022)] public float Walk { get; set; } = 198f;\r\n\t[Property, Group(\u0022Speed\u0022)] public float Run { get; set; } = 320f;\r\n\t[Property, Group(\u0022Camera\u0022)] public float Distance { get; set; } = 600f;\r\n\t[Property, Group(\u0022Camera\u0022), Range(0f, 90f)] public float VerticalAxis { get; set; } = 90;\r\n\t[Property, Group(\u0022Camera\u0022), Range(0f, 360f)] public float HorizontalAxis { get; set; } = 90;\r\n\r\n\tprotected override void OnUpdate()\r\n\t{\r\n\t\t\r\n\t}\r\n\r\n\tprotected override void OnFixedUpdate()\r\n\t{\r\n\t\tbase.OnFixedUpdate();\r\n\t\tMovementInput();\r\n\t\tUpdateAnimations();\r\n\t}\r\n\r\n\tprotected override void OnPreRender()\r\n\t{\r\n\t\tUpdateCamera();\r\n\t}\r\n\r\n\r\n\tprivate void MovementInput()\r\n\t{\r\n\t\tif (CharacterController is null) return;\r\n\r\n\t\tAngles currentAngles = Transform.Rotation.Angles();\t\r\n\r\n\t\tVector3 analogMove = Input.AnalogMove;\r\n\t\tfloat speed = Input.Down(\u0022Run\u0022) ? Run : Walk;\r\n\r\n\t\tfloat angleInRadians = MathX.DegreeToRadian(HorizontalAxis);\r\n\t\tfloat cosAngle = MathF.Cos(angleInRadians);\r\n\t\tfloat sinAngle = MathF.Sin(angleInRadians);\r\n\t\tVector3 wishVelocity = new Vector3(\r\n\t\t\tanalogMove.x * cosAngle - analogMove.y * sinAngle,\r\n\t\t\tanalogMove.x * sinAngle \u002B analogMove.y * cosAngle,\r\n\t\t\tanalogMove.z\r\n\t\t).Normal * speed;\r\n\r\n\t\tif (!wishVelocity.IsNearlyZero())\r\n\t\t{\r\n\t\t\tcurrentAngles.yaw = Rotation.LookAt(wishVelocity).Angles().yaw;\r\n\t\t\tTransform.Rotation = Rotation.From(currentAngles);\r\n\t\t}\r\n\t\tif (!CharacterController.IsOnGround) {\r\n\t\t\twishVelocity \u002B= Scene.PhysicsWorld.Gravity;\r\n\t\t}\r\n\r\n\t\tCharacterController.Velocity = wishVelocity;\r\n\t\tCharacterController.Move();\r\n\t\tTransform.Rotation = currentAngles;\r\n\t}\r\n\r\n\tprivate void UpdateAnimations()\r\n\t{\r\n\t\tif (AnimationHelper is null) return;\r\n\r\n\t\tAnimationHelper.WithVelocity(CharacterController.Velocity);\r\n\t}\r\n\r\n\tprivate void UpdateCamera()\r\n\t{\r\n\t\tCameraComponent camera = Scene.GetAllComponents\u003CCameraComponent\u003E().Where( x =\u003E x.IsMainCamera ).FirstOrDefault();\r\n\t\tif ( camera is null || CharacterController is null ) return;\r\n\r\n\t\tVector3 characterPostion = CharacterController.Transform.Position;\r\n\r\n\t\tfloat angleInRadians = MathX.DegreeToRadian(VerticalAxis);\r\n\t\tfloat verticalCos = MathF.Cos(angleInRadians);\r\n\t\tfloat verticalSin = MathF.Sin(angleInRadians);\r\n\r\n\t\tangleInRadians = MathX.DegreeToRadian(HorizontalAxis);\r\n\t\tfloat horizontalCos = MathF.Cos(angleInRadians);\r\n\t\tfloat horizontalSin = MathF.Sin(angleInRadians);\r\n\r\n\t\tcamera.Transform.Position = new Vector3(\r\n\t\t\tcharacterPostion.x - verticalCos * horizontalCos * Distance,\r\n\t\t\tcharacterPostion.y - verticalCos * horizontalSin * Distance,\r\n\t\t\tcharacterPostion.z \u002B CharacterController.Height \u002B verticalSin * Distance\r\n\t\t);\r\n\t\tcamera.Transform.Rotation = new Angles(VerticalAxis, HorizontalAxis, 0);\r\n\t}\r\n}\r\n"},{"Ident":"harper.topdownplayercontroller","Path":"UnitTests/UnitTest.cs","FileName":"UnitTest.cs","PackageType":"library","CodeKind":"UnitTest","AssetVersionId":71868,"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":"harper.topdownplayercontroller","Path":"__gen_RazorNamespace.cs","FileName":"__gen_RazorNamespace.cs","PackageType":"library","CodeKind":"Game","AssetVersionId":71868,"Code":"global using Microsoft.AspNetCore.Components; \nglobal using Microsoft.AspNetCore.Components.Rendering;\n"}]}