2025-09-24 11:24:38 +05:00

196 lines
5.4 KiB
C#

using UnityEngine;
using UnityEngine.InputSystem;
using Fusion;
using Fusion.Addons.KCC;
namespace TPSBR
{
using TPSBR.UI;
public sealed class AirplaneAgent : ContextBehaviour
{
// PUBLIC MEMBERS
[Networked, HideInInspector]
public Airplane Airplane { get; set; }
// PRIVATE MEMBERS
[SerializeField]
private Transform _cameraTransform;
[Networked]
private Quaternion _lookRotation { get; set; }
[Networked]
private GameplayInput _lastKnownInput { get; set; }
private bool _jump;
private bool _isParented;
private Vector2 _lookRotationDelta;
private SmoothVector2 _smoothLookRotationDelta = new SmoothVector2(256);
private UIMobileInputView _mobileInputView;
// NetworkBehaviour INTERFACE
public override void Spawned()
{
_smoothLookRotationDelta.ClearValues();
NetworkEvents networkEvents = Runner.GetComponent<NetworkEvents>();
networkEvents.OnInput.RemoveListener(OnInput);
networkEvents.OnInput.AddListener(OnInput);
_lookRotation = transform.localRotation;
if (HasInputAuthority == true)
{
Context.WaitingAgentTransform = transform;
}
_isParented = false;
}
public override void FixedUpdateNetwork()
{
if (_isParented == false && Airplane != null)
{
transform.SetParent(Airplane.AgentPosition, false);
_isParented = true;
}
if (IsProxy == true)
return;
if (Runner.TryGetInputForPlayer(Object.InputAuthority, out GameplayInput input) == true)
{
_lookRotation = UpdateRotation(_lookRotation, input.LookRotationDelta);
if (EGameplayInputAction.Jump.WasActivated(input, _lastKnownInput) == true)
{
if ((Context.GameplayMode as BattleRoyaleGameplayMode).RequestAirplaneJump(Object.InputAuthority, transform.rotation * Vector3.forward) == true)
return;
}
_lastKnownInput = input;
}
if (HasStateAuthority == true && Runner.IsPlayerValid(Object.InputAuthority) == true)
{
Vector3 lookDirection = _lookRotation * Vector3.forward;
Runner.ClearPlayerAreaOfInterest(Object.InputAuthority);
Runner.AddPlayerAreaOfInterest(Object.InputAuthority, transform.position + lookDirection * 25.0f, 50.0f);
Runner.AddPlayerAreaOfInterest(Object.InputAuthority, transform.position + lookDirection * 100.0f, 75.0f);
Runner.AddPlayerAreaOfInterest(Object.InputAuthority, transform.position + lookDirection * 175.0f, 100.0f);
}
}
public override void Despawned(NetworkRunner runner, bool hasState)
{
if (runner != null)
{
NetworkEvents networkEvents = runner.GetComponent<NetworkEvents>();
networkEvents.OnInput.RemoveListener(OnInput);
}
if (HasInputAuthority == true && Context.WaitingAgentTransform == transform)
{
Context.WaitingAgentTransform = null;
}
}
public override void Render()
{
if (Context.ObservedPlayerRef != Object.InputAuthority)
return;
if (_isParented == false && Airplane != null)
{
transform.SetParent(Airplane.AgentPosition, false);
_isParented = true;
}
UpdateRotation(_lookRotation, _lookRotationDelta);
Context.Camera.transform.position = _cameraTransform.position;
Context.Camera.transform.rotation = _cameraTransform.rotation;
}
// MONOBEHAVIOUR
private void Update()
{
if (HasInputAuthority == false || Context.HasInput == false)
return;
if ((Context.Input.IsCursorVisible == true && Context.Settings.SimulateMobileInput == false) || Context.GameplayMode.State != GameplayMode.EState.Active)
return;
Vector2 mouseDelta = default;
if ((Application.isMobilePlatform == false || Application.isEditor == true) && Context.Settings.SimulateMobileInput == false)
{
mouseDelta = Mouse.current.delta.ReadValue() * 0.075f;
_jump |= Keyboard.current.spaceKey.wasPressedThisFrame;
}
else
{
if (_mobileInputView == null)
{
if (Context.UI != null)
{
_mobileInputView = Context.UI.Get<UIMobileInputView>();
_mobileInputView.Look = default;
}
}
else
{
const float mobileSensitivityMultiplier = 32.0f;
mouseDelta = _mobileInputView.Look * mobileSensitivityMultiplier;
_mobileInputView.Look = default;
_jump |= _mobileInputView.Jump;
}
}
_lookRotationDelta += InputUtility.GetSmoothLookRotationDelta(_smoothLookRotationDelta, new Vector2(-mouseDelta.y, mouseDelta.x), Global.RuntimeSettings.Sensitivity, 0.025f);
}
// PRIVATE METHODS
private void OnInput(NetworkRunner runner, Fusion.NetworkInput networkInput)
{
if (HasInputAuthority == false || Context.HasInput == false)
return;
GameplayInput gameplayInput = new GameplayInput();
gameplayInput.Jump = _jump;
gameplayInput.LookRotationDelta = _lookRotationDelta;
networkInput.Set(gameplayInput);
_jump = default;
_lookRotationDelta = default;
}
private Quaternion UpdateRotation(Quaternion rotation, Vector2 rotationDelta)
{
if (rotationDelta == Vector2.zero)
{
transform.localRotation = rotation;
return rotation;
}
Vector3 rotationEuler = KCCUtility.GetClampedEulerLookRotation(rotation);
float lookRotationDeltaX = Mathf.Clamp(rotationEuler.x + rotationDelta.x, -85f, 85f) - rotationEuler.x;
float lookRotationDeltaY = rotationDelta.y;
var newRotation = Quaternion.Euler(rotationEuler + new Vector3(lookRotationDeltaX, lookRotationDeltaY, 0f));
transform.localRotation = newRotation;
return newRotation;
}
}
}