GenericVitals.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. using UnityEngine;
  2. using System;
  3. namespace HQFPSWeapons
  4. {
  5. [Serializable]
  6. public class DamageResistance
  7. {
  8. [SerializeField]
  9. [Range(0f, 1f)]
  10. private float m_GenericResistance = 0.1f;
  11. [SerializeField]
  12. [Range(0f, 1f)]
  13. private float m_CutResistance = 0.1f;
  14. [SerializeField]
  15. [Range(0f, 1f)]
  16. private float m_HitResistance = 0.1f;
  17. [SerializeField]
  18. [Range(0f, 1f)]
  19. private float m_StabResistance = 0.1f;
  20. [SerializeField]
  21. [Range(0f, 1f)]
  22. private float m_BulletResistance = 0.1f;
  23. public float GetDamageResistance(HealthEventData damageData)
  24. {
  25. if(damageData.DamageType == DamageType.Generic)
  26. return m_GenericResistance;
  27. else if(damageData.DamageType == DamageType.Cut)
  28. return m_CutResistance;
  29. else if(damageData.DamageType == DamageType.Hit)
  30. return m_HitResistance;
  31. else if(damageData.DamageType == DamageType.Stab)
  32. return m_StabResistance;
  33. else if(damageData.DamageType == DamageType.Bullet)
  34. return m_BulletResistance;
  35. return 0f;
  36. }
  37. }
  38. [Serializable]
  39. public class StatRegenData
  40. {
  41. public bool CanRegenerate { get { return m_Enabled && !IsPaused; } }
  42. public bool Enabled { get { return m_Enabled; } }
  43. public bool IsPaused { get { return Time.time < m_NextRegenTime; } }
  44. public float RegenDelta { get { return m_Speed * Time.deltaTime; } }
  45. [SerializeField]
  46. private bool m_Enabled = true;
  47. [SerializeField]
  48. private float m_Pause = 2f;
  49. [SerializeField]
  50. [Clamp(0f, 1000f)]
  51. private float m_Speed = 10f;
  52. private float m_NextRegenTime;
  53. public void Pause()
  54. {
  55. m_NextRegenTime = Time.time + m_Pause;
  56. }
  57. }
  58. public class GenericVitals : LivingEntityComponent
  59. {
  60. [SerializeField]
  61. private DamageResistance m_DamageResistance = null;
  62. [BHeader("Health & Damage")]
  63. [SerializeField]
  64. [Tooltip("The health to start with.")]
  65. private float m_MaxHealth = 100f;
  66. [SerializeField]
  67. private StatRegenData m_HealthRegeneration = null;
  68. [BHeader("Audio")]
  69. [SerializeField]
  70. protected AudioSource m_AudioSource = null;
  71. protected float m_HealthDelta;
  72. protected virtual void Start()
  73. {
  74. Entity.ChangeHealth.SetTryer(Try_ChangeHealth);
  75. SetOriginalMaxHealth();
  76. }
  77. protected virtual void Update()
  78. {
  79. if(m_HealthRegeneration.CanRegenerate && Entity.Health.Get() < 100f && Entity.Health.Get() > 0f)
  80. {
  81. var data = new HealthEventData(m_HealthRegeneration.RegenDelta);
  82. Entity.ChangeHealth.Try(data);
  83. }
  84. }
  85. protected virtual bool Try_ChangeHealth(HealthEventData healthEventData)
  86. {
  87. if(Entity.Health.Get() == 0f)
  88. return false;
  89. if(healthEventData.Delta > 0f && Entity.Health.Get() == 100f)
  90. return false;
  91. float healthDelta = healthEventData.Delta;
  92. if(healthDelta < 0f)
  93. healthDelta *= (1f - m_DamageResistance.GetDamageResistance(healthEventData));
  94. float newHealth = Mathf.Clamp(Entity.Health.Get() + healthDelta, 0f, 100f);
  95. Entity.Health.Set(newHealth);
  96. if(healthDelta < 0f)
  97. m_HealthRegeneration.Pause();
  98. return true;
  99. }
  100. private void SetOriginalMaxHealth()
  101. {
  102. Entity.Health.Set(m_MaxHealth);
  103. }
  104. }
  105. }