196 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			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;
 | |
| 		}
 | |
| 	}
 | |
| }
 |