using System; using Sandbox; using Sandbox.Citizen; using ShrimpleCharacterController; public sealed partial class Dedugan : Component { [RequireComponent] public ShrimpleCharacterController.ShrimpleCharacterController Controller { get; set; } [RequireComponent] public CitizenAnimationHelper AnimationHelper { get; set; } // [Property] public SkinnedModelRenderer Anim {get; set;} public SkinnedModelRenderer Renderer { get; set; } [Property] public GameObject Camera { get; set; } [Property] public GameObject CameraPivot { get; set; } [Property][Range(1f, 200f, 1f)] public float CamOffsetX { get; set; } [Property][Range(50f, 1200f, 10f)] public float WalkSpeed { get; set; } = 100f; [Property][Range(100f, 1500f, 20f)] public float RunSpeed { get; set; } = 300f; [Property][Range(25f, 1100f, 5f)] public float DuckSpeed { get; set; } = 50f; [Property][Range(200f, 1500f, 20f)] public float JumpStrength { get; set; } = 350f; [Property][Range(10f, 500f, 10f)] public float InteractDistance { get; set; } = 350f; [Sync] public Angles NetworkedEyeAngles { get; set; } public Angles EyeAngles { get; set; } [Sync] private float IsDucking { get; set; } = 0f; [Sync] public bool IsDancing { get; set; } = false; private RagdollController RagdollController { get; set; } public Vector3 OverrideGravity { get; set; } = Vector3.Zero; private Vector3 _directionToAxis = Vector3.Up; private Vector3 _up = Vector3.Up; private Vector3 _forward = Vector3.Forward; private Vector3 _right = Vector3.Right; private Vector3 _wishDirection; protected override void OnStart() { RagdollController = Components.Get(); Renderer = Components.Get(FindMode.EverythingInSelfAndDescendants); var cameraComponent = Camera.GetComponent(); cameraComponent.Enabled = false; if (!Network.IsOwner) return; cameraComponent.Enabled = true; } protected override void OnUpdate() { if (Network.IsOwner) { EyeAngles += Input.AnalogLook; EyeAngles = EyeAngles.WithPitch(MathX.Clamp(EyeAngles.pitch, -89f, 89f)); NetworkedEyeAngles = EyeAngles; var targetRotation = Rotation.LookAt(Rotation.FromYaw(EyeAngles.yaw).Forward, -_directionToAxis); var currentForward = Renderer.LocalRotation.Forward; float angleDiff = currentForward.Angle(targetRotation.Forward); if (angleDiff > 15f && Controller.Velocity.Length > 10f) { Renderer.LocalRotation = Rotation.Slerp(Renderer.LocalRotation, Rotation.FromYaw(EyeAngles.yaw), Time.Delta * 3f); } RotateCamera(); InteractionsUpdate(); } else { EyeAngles = NetworkedEyeAngles; var targetRotation = Rotation.LookAt(Rotation.FromYaw(EyeAngles.yaw).Forward, -_directionToAxis); var currentForward = Renderer.LocalRotation.Forward; float angleDiff = currentForward.Angle(targetRotation.Forward); if (angleDiff > 15f && Controller.Velocity.Length > 10f) { Renderer.LocalRotation = Rotation.Slerp(Renderer.LocalRotation, Rotation.FromYaw(EyeAngles.yaw), Time.Delta * 3f); } // Renderer.LocalRotation = Rotation.Slerp(Renderer.LocalRotation, Rotation.FromYaw(EyeAngles.yaw), Time.Delta * 5f); Camera.LocalRotation = EyeAngles.ToRotation(); var pivotOffset = CameraPivot.LocalRotation.Backward * CamOffsetX; var localPitchOffset = Camera.LocalRotation.Down * MathF.Max( 0f, EyeAngles.pitch ) * 0.32f + Camera.LocalRotation.Backward * MathF.Max( 0f, EyeAngles.pitch ) * 0.7f + Camera.LocalRotation.Up * MathF.Min( 0f, EyeAngles.pitch ) * 0.5f + Camera.LocalRotation.Backward * MathF.Min( 0f, EyeAngles.pitch ) * 0.8f; var offset = (CameraPivot.LocalPosition + pivotOffset ) * EyeAngles.ToRotation() + localPitchOffset; Camera.LocalPosition = offset; } UpdateCustomAnimations(); } protected override void OnFixedUpdate() { UpdateMovement(); } protected override void DrawGizmos() { DrawDebugGizmos(); } }