kakozuzo/Code/Kal.cs

106 lines
3.5 KiB
C#
Raw Normal View History

2024-10-29 18:52:47 +03:00
using Sandbox.Citizen;
2024-10-29 19:54:53 +03:00
using Sandbox.Network;
2024-10-29 18:52:47 +03:00
using ShrimpleCharacterController;
public sealed class Kal : Component
{
2024-10-30 01:01:41 +03:00
[RequireComponent] public ShrimpleCharacterController.ShrimpleCharacterController Controller { get; set; }
[RequireComponent] public CitizenAnimationHelper AnimationHelper { get; set; }
2024-10-29 18:52:47 +03:00
public SkinnedModelRenderer Renderer { get; set; }
2024-10-30 01:01:41 +03:00
[Property] public GameObject Body { get; set; }
2024-10-29 18:52:47 +03:00
public GameObject Camera { get; set; }
2024-10-30 01:01:41 +03:00
[Property] [Range(1f, 200f, 1f)] public float CamOffsetX { get; set; }
[Property] [Range(1f, 200f, 1f)] public float CamOffsetZ { get; set; }
[Property] [Range(50f, 200f, 10f)] public float WalkSpeed { get; set; } = 100f;
[Property] [Range(100f, 500f, 20f)] public float RunSpeed { get; set; } = 300f;
[Property] [Range(25f, 100f, 5f)] public float DuckSpeed { get; set; } = 50f;
[Property] [Range(200f, 500f, 20f)] public float JumpStrength { get; set; } = 350f;
[Sync] public Angles EyeAngles { get; set; }
[Sync] public bool isDucking { get; set; } = false;
[Sync] public bool isRunning { get; set; } = false;
protected override void OnStart()
2024-10-29 18:52:47 +03:00
{
base.OnStart();
if ( !Network.IsOwner ) return;
Renderer = Components.Get<SkinnedModelRenderer>(FindMode.EverythingInSelfAndDescendants);
Camera = new GameObject(true, "Camera");
Camera.SetParent(GameObject);
var cameraComponent = Camera.Components.Create<CameraComponent>();
cameraComponent.ZFar = 32768f;
}
protected override void OnFixedUpdate()
{
base.OnFixedUpdate();
2024-10-30 01:01:41 +03:00
if ( Network.IsOwner )
{
var wishDirection = Input.AnalogMove.Normal * Rotation.FromYaw( EyeAngles.yaw );
isDucking = Input.Down( "Duck" );
isRunning = Input.Down( "Run" );
var wishSpeed = isDucking ? DuckSpeed :
isRunning ? RunSpeed : WalkSpeed;
2024-10-29 18:52:47 +03:00
2024-10-30 01:01:41 +03:00
Controller.WishVelocity = wishDirection * wishSpeed;
2024-10-29 18:52:47 +03:00
2024-10-30 01:01:41 +03:00
Controller.Move();
2024-10-29 18:52:47 +03:00
2024-10-30 01:01:41 +03:00
if ( Input.Pressed( "Jump" ) && Controller.IsOnGround )
{
Controller.Punch( Vector3.Up * JumpStrength * 2f );
AnimationHelper?.TriggerJump();
}
2024-10-29 18:52:47 +03:00
2024-10-30 01:01:41 +03:00
if ( !AnimationHelper.IsValid() ) return;
}
UpdateAnimations();
}
2024-10-29 18:52:47 +03:00
2024-10-30 01:01:41 +03:00
void UpdateAnimations()
{
AnimationHelper.WithWishVelocity(Controller.WishVelocity);
AnimationHelper.WithVelocity(Controller.Velocity);
AnimationHelper.IsGrounded = Controller.IsOnGround;
AnimationHelper.DuckLevel = isDucking ? 1f : 0f;
2024-10-29 18:52:47 +03:00
}
protected override void OnUpdate()
{
base.OnUpdate();
2024-10-30 01:01:41 +03:00
if ( Network.IsOwner )
{
EyeAngles += Input.AnalogLook;
EyeAngles = EyeAngles.WithPitch(MathX.Clamp(EyeAngles.pitch, -10f, 40f));
// Renderer.WorldRotation = Rotation.Slerp(Renderer.WorldRotation, Rotation.FromYaw(EyeAngles.yaw), Time.Delta * 5f);
var cameraOffset = Vector3.Up * CamOffsetZ + Vector3.Backward * CamOffsetX;
Camera.WorldRotation = EyeAngles.ToRotation();
Camera.LocalPosition = cameraOffset * Camera.WorldRotation;
}
2024-10-29 18:52:47 +03:00
2024-10-30 01:01:41 +03:00
RotateBody();
}
void RotateBody()
{
if(Body is null) return;
2024-10-29 18:52:47 +03:00
2024-10-30 01:01:41 +03:00
var targetAngle = new Angles(0, EyeAngles.yaw, 0).ToRotation();
float rotateDifference = Body.WorldRotation.Distance(targetAngle);
2024-10-29 18:52:47 +03:00
2024-10-30 01:01:41 +03:00
if(rotateDifference > 30f || Controller.Velocity.Length > 10f)
{
Body.WorldRotation = Rotation.Lerp(Body.WorldRotation, targetAngle, Time.Delta * 2f);
}
2024-10-29 18:52:47 +03:00
}
}