| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 | using UnityEngine;namespace HQFPSWeapons{	/// <summary>	/// 	/// </summary>	public class PlayerVitals : EntityVitals 	{		public Player Player		{			get 			{				if(!m_Player)					m_Player = GetComponent<Player>();				if(!m_Player)					m_Player = GetComponentInParent<Player>();								return m_Player;			}		}		[BHeader("Stamina")]		[SerializeField]		[Clamp(0f, 300f)]		private float m_StaminaDepletionRate = 30f;		[SerializeField]		private StatRegenData m_StaminaRegeneration = null;		[SerializeField]		private SoundPlayer m_BreathingHeavyAudio = null;		[SerializeField]		private float m_BreathingHeavyDuration = 11f;		[SerializeField]		[Clamp(0f, 100f)]		private float m_JumpStaminaTake = 15f;		[BHeader("Player Audio")]		[SerializeField]		private SoundPlayer m_JumpAudio = null;		[SerializeField]		private SoundPlayer m_CrouchAudio = null;		[SerializeField]		private SoundPlayer m_StandUpAudio = null;		[SerializeField]		private SoundPlayer m_EarRingingAudio = null;		[SerializeField]		[Range(0f, 1f)]		private float m_EarRingingAudioVolumeDecrease = 0.5f;		[SerializeField]		private float m_EarRingVolumeGainSpeed = 0.15f;		private Player m_Player;		private float m_LastHeavyBreathTime;		protected override void Update()		{			base.Update();			// Stamina.			if(Player.Run.Active)			{				m_StaminaRegeneration.Pause();				ModifyStamina(-m_StaminaDepletionRate * Time.deltaTime);			}			else if(m_StaminaRegeneration.CanRegenerate && Player.Stamina.Get() < 100f)				ModifyStamina(m_StaminaRegeneration.RegenDelta);			if(!m_StaminaRegeneration.CanRegenerate && Player.Stamina.Is(0f) && Time.time - m_LastHeavyBreathTime > m_BreathingHeavyDuration)			{				m_LastHeavyBreathTime = Time.time;				m_BreathingHeavyAudio.Play2D();			}			//Using equipment stops stamina regen for a moment 			if (Player.UseOnce.LastExecutionTime + 0.1f > Time.time && Player.ActiveEquipmentItem.Val.StaminaTakePerUse > 0)				m_StaminaRegeneration.Pause();			AudioListener.volume = Mathf.MoveTowards(AudioListener.volume, 1f, m_EarRingVolumeGainSpeed * Time.deltaTime);		}		protected override bool Try_ChangeHealth(HealthEventData healthEventData)		{			return base.Try_ChangeHealth(healthEventData);		}		protected override void Start()		{			Player.Run.AddStartTryer(()=> { m_StaminaRegeneration.Pause(); return Player.Stamina.Get() > 0f; });			Player.Jump.AddStartListener(OnJump);			Player.Crouch.AddStartListener(OnCrouchStart);			Player.Crouch.AddStopListener(OnCrouchEnd);			ShakeManager.ShakeEvent.AddListener(OnShakeEvent);		}		private void OnDestroy()		{			ShakeManager.ShakeEvent.RemoveListener(OnShakeEvent);		}		private void OnShakeEvent(ShakeEventData shake)		{			if(shake.ShakeType == ShakeType.Explosion)			{				float distToExplosionSqr = (transform.position - shake.Position).sqrMagnitude;				float explosionRadiusSqr = shake.Radius * shake.Radius;				float distanceFactor = 1f - Mathf.Clamp01(distToExplosionSqr / explosionRadiusSqr);				AudioListener.volume = 1f - m_EarRingingAudioVolumeDecrease * distanceFactor;				m_EarRingingAudio.Play(ItemSelection.Method.RandomExcludeLast, m_AudioSource, distanceFactor);			}		}		private void ModifyStamina(float delta)		{			float stamina = Player.Stamina.Get() + delta;			stamina = Mathf.Clamp(stamina, 0f, 100f);			Player.Stamina.Set(stamina);		}		private void OnJump()		{			ModifyStamina(-m_JumpStaminaTake);			m_JumpAudio.Play(ItemSelection.Method.RandomExcludeLast, m_AudioSource);			m_StaminaRegeneration.Pause();		}		private void OnCrouchStart()		{			m_CrouchAudio.Play(ItemSelection.Method.RandomExcludeLast, m_AudioSource);		}		private void OnCrouchEnd()		{			m_StandUpAudio.Play(ItemSelection.Method.RandomExcludeLast, m_AudioSource);		}	}}
 |