using UnityEngine;
namespace HQFPSWeapons
{
///
///
///
public class PlayerVitals : EntityVitals
{
public Player Player
{
get
{
if(!m_Player)
m_Player = GetComponent();
if(!m_Player)
m_Player = GetComponentInParent();
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);
}
}
}