125 lines
4.4 KiB
C#
125 lines
4.4 KiB
C#
using System;
|
|
using Sandbox;
|
|
using Sandbox.Citizen;
|
|
using Sasalka;
|
|
using ShrimpleCharacterController;
|
|
|
|
public sealed partial class Dedugan : Component, IUseContext, Component.INetworkSpawn
|
|
{
|
|
[RequireComponent] public ShrimpleCharacterController.ShrimpleCharacterController Controller { get; set; }
|
|
[RequireComponent] public CitizenAnimationHelper AnimationHelper { get; set; }
|
|
[Property] public SkinnedModelRenderer Renderer { get; set; }
|
|
[Property] public GameObject Camera { get; set; }
|
|
[Property] public GameObject CameraPivot { get; set; }
|
|
[Property] public GameObject InventoryUI { 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;
|
|
[Sync] public int Health { get; set; } = 100;
|
|
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()
|
|
{
|
|
InventoryStart();
|
|
|
|
RagdollController = Components.Get<RagdollController>();
|
|
// Renderer = Components.Get<SkinnedModelRenderer>( FindMode.EverythingInSelfAndDescendants );
|
|
|
|
var cameraComponent = Camera.GetComponent<CameraComponent>();
|
|
var listener = Components.Get<AudioListener>( true );
|
|
cameraComponent.Enabled = false;
|
|
InventoryUI.Enabled = false;
|
|
listener.Enabled = false;
|
|
|
|
if ( !Network.IsOwner ) return;
|
|
|
|
cameraComponent.Enabled = true;
|
|
listener.Enabled = true;
|
|
InventoryUI.Enabled = true;
|
|
|
|
if ( Renderer is null )
|
|
return;
|
|
|
|
Renderer.OnFootstepEvent += OnFootstepEvent;
|
|
}
|
|
|
|
protected override void OnUpdate()
|
|
{
|
|
UpdateCustomAnimations();
|
|
InventoryUpdate();
|
|
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;
|
|
}
|
|
}
|
|
|
|
protected override void OnFixedUpdate()
|
|
{
|
|
UpdateMovement();
|
|
}
|
|
|
|
protected override void DrawGizmos()
|
|
{
|
|
DrawDebugGizmos();
|
|
}
|
|
}
|