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; } public SkinnedModelRenderer Renderer { get; set; } 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; 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); if (!Network.IsOwner) return; var cameraComponent = Scene.Camera; Camera = cameraComponent.GameObject; Camera.SetParent(GameObject); cameraComponent.ZFar = 32768f; cameraComponent.FieldOfView = 100f; } protected override void OnUpdate() { if (Network.IsOwner) { EyeAngles += Input.AnalogLook; EyeAngles = EyeAngles.WithPitch(MathX.Clamp(EyeAngles.pitch, -89f, 89f)); 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) { NetworkedEyeAngles = EyeAngles; Renderer.LocalRotation = Rotation.Slerp(Renderer.LocalRotation, Rotation.FromYaw(EyeAngles.yaw), Time.Delta * 3f); } RotateCamera(); UpdateLookAt(); // UpdatePressed(); } else { EyeAngles = NetworkedEyeAngles; Renderer.LocalRotation = Rotation.Slerp(Renderer.LocalRotation, Rotation.FromYaw(EyeAngles.yaw), Time.Delta * 5f); } } protected override void OnFixedUpdate() { UpdateMovement(); } protected override void DrawGizmos() { DrawDebugGizmos(); } }