This commit is contained in:
2026-04-30 16:52:19 +07:00
parent 0542f5656f
commit 4709fa0c55
6 changed files with 95 additions and 29 deletions

View File

@@ -29,9 +29,15 @@ namespace OnlyScove.Scripts
// Pass-through properties for State Compatibility
public Vector2 MoveInput { get; private set; }
public bool IsSprintHeld { get; private set; }
public float VelocityY { get => Movement.VelocityY; set => Movement.VelocityY = value; }
public bool IsGrounded => Movement.IsGrounded;
public bool WasGrounded => Movement.WasGrounded;
public float VelocityY
{
get => (Object != null && Object.IsValid && Movement != null) ? Movement.VelocityY : 0f;
set { if (Object != null && Object.IsValid && Movement != null) Movement.VelocityY = value; }
}
public bool IsGrounded => (Object != null && Object.IsValid && Movement != null) ? Movement.IsGrounded : true;
public bool WasGrounded => (Object != null && Object.IsValid && Movement != null) ? Movement.WasGrounded : true;
public float WalkSpeed => Movement.WalkSpeed;
public float RunSpeed => Movement.RunSpeed;
@@ -48,11 +54,11 @@ namespace OnlyScove.Scripts
public static PlayerStateMachine Local { get; private set; }
public string CurrentStateName => currentState != null ? currentState.GetType().Name : "None";
public Quaternion CameraRotation
public Quaternion CameraRotation
{
get
get
{
if (Runner != null && Runner.IsRunning && Object != null) return NetworkedCameraRotation;
if (Runner != null && Runner.IsRunning && Object != null && Object.IsValid) return NetworkedCameraRotation;
return Cam != null ? Cam.PlanarRotation : transform.rotation;
}
}
@@ -67,7 +73,7 @@ namespace OnlyScove.Scripts
Input = GetComponent<InputReader>();
Anim = GetComponentInChildren<Animator>();
Scanner = GetComponent<EnvironmentScanner>();
Stats = GetComponent<PlayerStats>();
Interaction = GetComponent<PlayerInteraction>();
Movement = GetComponent<PlayerMovement>();
@@ -107,12 +113,28 @@ namespace OnlyScove.Scripts
Cam.followTarget = transform;
Cam.inputReader = Input;
}
Input.OnNextInteractEvent += Interaction.NextInteract;
Input.OnPreviousInteractEvent += Interaction.PreviousInteract;
if (Input != null)
{
Input.OnNextInteractEvent -= Interaction.NextInteract;
Input.OnNextInteractEvent += Interaction.NextInteract;
Input.OnPreviousInteractEvent -= Interaction.PreviousInteract;
Input.OnPreviousInteractEvent += Interaction.PreviousInteract;
}
if (Controller != null) Controller.enabled = true;
}
}
private void OnDestroy()
{
if (Input != null && Interaction != null)
{
Input.OnNextInteractEvent -= Interaction.NextInteract;
Input.OnPreviousInteractEvent -= Interaction.PreviousInteract;
}
}
public void Rotate(Vector3 moveDirection, float deltaTime)
{
Movement.Rotate(transform, moveDirection, deltaTime);
@@ -120,13 +142,13 @@ namespace OnlyScove.Scripts
public void Move(Vector3 velocity, float animatorSpeed, float deltaTime)
{
bool canMove = (Runner == null || !Runner.IsRunning) || Object.HasInputAuthority || Runner.IsServer;
bool canMove = (Runner == null || !Runner.IsRunning) || (Object != null && Object.IsValid && (Object.HasInputAuthority || Runner.IsServer));
if (!canMove) return;
Movement.Move(Controller, velocity, deltaTime);
localAnimatorSpeed = animatorSpeed;
if (Object != null && Object.HasStateAuthority)
if (Object != null && Object.IsValid && Object.HasStateAuthority)
{
NetworkedSpeed = animatorSpeed;
NetworkedMoveInput = MoveInput;
@@ -136,20 +158,21 @@ namespace OnlyScove.Scripts
private void UpdateAnimator(float deltaTime)
{
float speedValue = (Runner == null || !Runner.IsRunning || Object.HasInputAuthority) ? localAnimatorSpeed : NetworkedSpeed;
Vector2 inputVector = (Runner == null || !Runner.IsRunning || Object.HasInputAuthority) ? MoveInput : NetworkedMoveInput;
bool isNetworked = Runner != null && Runner.IsRunning && Object != null && Object.IsValid;
float speedValue = (!isNetworked || Object.HasInputAuthority) ? localAnimatorSpeed : NetworkedSpeed;
Vector2 inputVector = (!isNetworked || Object.HasInputAuthority) ? MoveInput : NetworkedMoveInput;
AnimationHandler.UpdateAnimator(speedValue, inputVector, deltaTime);
}
public override void FixedUpdateNetwork()
{
bool isRunning = Runner != null && Runner.IsRunning;
if (Object == null && isRunning) return;
if (isRunning && (Object == null || !Object.IsValid)) return;
if (GetInput(out PlayerInputData data))
{
MoveInput = data.Direction;
IsSprintHeld = data.sprint;
IsSprintHeld = (bool)data.sprint;
if (isRunning) NetworkedCameraRotation = data.rot;
}
else if (!isRunning)
@@ -158,7 +181,7 @@ namespace OnlyScove.Scripts
IsSprintHeld = UnityEngine.Input.GetKey(KeyCode.LeftShift);
}
if (!isRunning || Object.HasInputAuthority || Runner.IsServer)
if (!isRunning || (Object != null && Object.IsValid && (Object.HasInputAuthority || Runner.IsServer)))
{
if (hasControl)
{
@@ -172,7 +195,7 @@ namespace OnlyScove.Scripts
public override void Render()
{
bool isRunning = Runner != null && Runner.IsRunning;
if (isRunning && !Object.HasInputAuthority)
if (isRunning && Object != null && Object.IsValid && !Object.HasInputAuthority)
{
// Smooth interpolation for proxies
if (Movement.NetworkedPosition != Vector3.zero)