PlayerVitals.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. using UnityEngine;
  2. namespace HQFPSWeapons
  3. {
  4. /// <summary>
  5. ///
  6. /// </summary>
  7. public class PlayerVitals : EntityVitals
  8. {
  9. public Player Player
  10. {
  11. get
  12. {
  13. if(!m_Player)
  14. m_Player = GetComponent<Player>();
  15. if(!m_Player)
  16. m_Player = GetComponentInParent<Player>();
  17. return m_Player;
  18. }
  19. }
  20. [BHeader("Stamina")]
  21. [SerializeField]
  22. [Clamp(0f, 300f)]
  23. private float m_StaminaDepletionRate = 30f;
  24. [SerializeField]
  25. private StatRegenData m_StaminaRegeneration = null;
  26. [SerializeField]
  27. private SoundPlayer m_BreathingHeavyAudio = null;
  28. [SerializeField]
  29. private float m_BreathingHeavyDuration = 11f;
  30. [SerializeField]
  31. [Clamp(0f, 100f)]
  32. private float m_JumpStaminaTake = 15f;
  33. [BHeader("Player Audio")]
  34. [SerializeField]
  35. private SoundPlayer m_JumpAudio = null;
  36. [SerializeField]
  37. private SoundPlayer m_CrouchAudio = null;
  38. [SerializeField]
  39. private SoundPlayer m_StandUpAudio = null;
  40. [SerializeField]
  41. private SoundPlayer m_EarRingingAudio = null;
  42. [SerializeField]
  43. [Range(0f, 1f)]
  44. private float m_EarRingingAudioVolumeDecrease = 0.5f;
  45. [SerializeField]
  46. private float m_EarRingVolumeGainSpeed = 0.15f;
  47. private Player m_Player;
  48. private float m_LastHeavyBreathTime;
  49. protected override void Update()
  50. {
  51. base.Update();
  52. // Stamina.
  53. if(Player.Run.Active)
  54. {
  55. m_StaminaRegeneration.Pause();
  56. ModifyStamina(-m_StaminaDepletionRate * Time.deltaTime);
  57. }
  58. else if(m_StaminaRegeneration.CanRegenerate && Player.Stamina.Get() < 100f)
  59. ModifyStamina(m_StaminaRegeneration.RegenDelta);
  60. if(!m_StaminaRegeneration.CanRegenerate && Player.Stamina.Is(0f) && Time.time - m_LastHeavyBreathTime > m_BreathingHeavyDuration)
  61. {
  62. m_LastHeavyBreathTime = Time.time;
  63. m_BreathingHeavyAudio.Play2D();
  64. }
  65. //Using equipment stops stamina regen for a moment
  66. if (Player.UseOnce.LastExecutionTime + 0.1f > Time.time && Player.ActiveEquipmentItem.Val.StaminaTakePerUse > 0)
  67. m_StaminaRegeneration.Pause();
  68. AudioListener.volume = Mathf.MoveTowards(AudioListener.volume, 1f, m_EarRingVolumeGainSpeed * Time.deltaTime);
  69. }
  70. protected override bool Try_ChangeHealth(HealthEventData healthEventData)
  71. {
  72. return base.Try_ChangeHealth(healthEventData);
  73. }
  74. protected override void Start()
  75. {
  76. Player.Run.AddStartTryer(()=> { m_StaminaRegeneration.Pause(); return Player.Stamina.Get() > 0f; });
  77. Player.Jump.AddStartListener(OnJump);
  78. Player.Crouch.AddStartListener(OnCrouchStart);
  79. Player.Crouch.AddStopListener(OnCrouchEnd);
  80. ShakeManager.ShakeEvent.AddListener(OnShakeEvent);
  81. }
  82. private void OnDestroy()
  83. {
  84. ShakeManager.ShakeEvent.RemoveListener(OnShakeEvent);
  85. }
  86. private void OnShakeEvent(ShakeEventData shake)
  87. {
  88. if(shake.ShakeType == ShakeType.Explosion)
  89. {
  90. float distToExplosionSqr = (transform.position - shake.Position).sqrMagnitude;
  91. float explosionRadiusSqr = shake.Radius * shake.Radius;
  92. float distanceFactor = 1f - Mathf.Clamp01(distToExplosionSqr / explosionRadiusSqr);
  93. AudioListener.volume = 1f - m_EarRingingAudioVolumeDecrease * distanceFactor;
  94. m_EarRingingAudio.Play(ItemSelection.Method.RandomExcludeLast, m_AudioSource, distanceFactor);
  95. }
  96. }
  97. private void ModifyStamina(float delta)
  98. {
  99. float stamina = Player.Stamina.Get() + delta;
  100. stamina = Mathf.Clamp(stamina, 0f, 100f);
  101. Player.Stamina.Set(stamina);
  102. }
  103. private void OnJump()
  104. {
  105. ModifyStamina(-m_JumpStaminaTake);
  106. m_JumpAudio.Play(ItemSelection.Method.RandomExcludeLast, m_AudioSource);
  107. m_StaminaRegeneration.Pause();
  108. }
  109. private void OnCrouchStart()
  110. {
  111. m_CrouchAudio.Play(ItemSelection.Method.RandomExcludeLast, m_AudioSource);
  112. }
  113. private void OnCrouchEnd()
  114. {
  115. m_StandUpAudio.Play(ItemSelection.Method.RandomExcludeLast, m_AudioSource);
  116. }
  117. }
  118. }