using Fusion;
using StarterAssets;
using UnityEngine;
using UnityEngine.InputSystem;
///
/// Tracks player input.
///
[DefaultExecutionOrder(-10)]
public sealed class TopDownPlayerInput : NetworkBehaviour, IBeforeUpdate, IBeforeTick, INetworkInput
{
public NetworkedInput CurrentInput => _currentInput;
public NetworkedInput PreviousInput => _previousInput;
//===================================================
// PRIVATE FIELDS
//===================================================
private UICanvasControllerInput _mobileInput = null;
[Networked]
private NetworkedInput _currentInput { get; set; }
private bool _resetAccumulatedInput;
private NetworkedInput _accumulatedInput;
private NetworkedInput _previousInput;
//===================================================
// METHODS
//===================================================
public override void Spawned()
{
// Reset to default state.
_currentInput = default;
_previousInput = default;
_accumulatedInput = default;
_resetAccumulatedInput = default;
if (Object.HasInputAuthority == true)
{
Runner.GetComponent().OnInputAction += OnInput;
if(Application.isMobilePlatform)
{
_mobileInput = Runner.GetComponent().MobileInput;
}//if end
// else if(Application.isEditor)
// {
// Cursor.lockState = CursorLockMode.Locked;
// Cursor.visible = false;
// }//if end
}//if end
ReplicateToAll(false);
ReplicateTo(Object.InputAuthority, true);
}//Spawned() end
void IBeforeUpdate.BeforeUpdate()
{
if (HasInputAuthority == false)
return;
if (_resetAccumulatedInput == true)
{
_resetAccumulatedInput = false;
_accumulatedInput = default;
}//if end
if(Application.isMobilePlatform)
{
MobileInput();
}//if end
else
{
// if (Cursor.lockState != CursorLockMode.Locked)
// return;
StandaloneInput();
}//if end
}//BeforeUpdate() end
void IBeforeTick.BeforeTick()
{
if (Object == null)
return;
_previousInput = _currentInput;
NetworkedInput currentInput = _currentInput;
_currentInput = currentInput;
if (Object.InputAuthority != PlayerRef.None)
{
if (GetInput(out NetworkedInput input) == true)
_currentInput = input;
}//if end
}//BeforeTick() end
private void OnInput(NetworkRunner runner, NetworkInput networkInput)
{
networkInput.Set(_accumulatedInput);
_resetAccumulatedInput = true;
}//OnInput() end
private void StandaloneInput()
{
Keyboard keyboard = Keyboard.current;
if (keyboard != null)
{
Vector2 moveDirection = Vector2.zero;
if (keyboard.wKey.isPressed == true) { moveDirection += Vector2.up ; }
if (keyboard.sKey.isPressed == true) { moveDirection += Vector2.down ; }
if (keyboard.aKey.isPressed == true) { moveDirection += Vector2.left ; }
if (keyboard.dKey.isPressed == true) { moveDirection += Vector2.right; }
_accumulatedInput.MoveDirection = moveDirection.normalized;
_accumulatedInput.Sprint = keyboard.leftShiftKey.isPressed;
_accumulatedInput.JumpAction.Set(NetworkedInput.JUMP_BUTTON, keyboard.spaceKey.isPressed);
}//if end
if(Mouse.current != null)
_accumulatedInput.AttackAction.Set(NetworkedInput.ATTACK_BUTTON, Mouse.current.leftButton.isPressed);
}//StandaloneInput() end
private void MobileInput()
{
if(_mobileInput is null)
return;
_accumulatedInput.MoveDirection = _mobileInput.Move;
_accumulatedInput.Sprint = _mobileInput.Sprint;
_accumulatedInput.JumpAction.Set(NetworkedInput.JUMP_BUTTON, _mobileInput.Jump);
_accumulatedInput.AttackAction.Set(NetworkedInput.ATTACK_BUTTON, _mobileInput.Attack);
}//MobileInput() end
}//class end