using System; using UnityEngine; using UnityEngine.Events; namespace DamageVolumeSystem { [Icon("Assets/Scripts/DamageVolumeSystem/Icon/HealthData.png")] public class HealthData : MonoBehaviour { public int defaultHealth = 5000; public int maxHealth = 5000; public UnityEvent onAid = new(); public UnityEvent onHurt = new(); public UnityEvent onDead = new(); private int _health; public int Health { get => _health; set { var offset = value - _health; var offsetAbs = Mathf.Abs(offset); switch (offset) { case > 0: Aid(new Damage { Group = 12, Force = offsetAbs, Direction = Vector3.zero }); return; case < 0: Hurt(new Damage { Group = 12, Force = offsetAbs, Direction = Vector3.zero }); break; } } } private void Start() { _health = defaultHealth; } private void Reset() { var newHealth = Mathf.Clamp(defaultHealth, 0, maxHealth); SetHealth(newHealth); } public void Aid(Damage damage) { AddHealth(damage.Force); onAid.Invoke(damage); } public void Hurt(Damage damage) { ReduceHealth(damage.Force); onHurt.Invoke(damage); if (_health <= 0) onDead.Invoke(); } public static HealthData operator +(HealthData a, Damage b) { a.Aid(b); return a; } public static HealthData operator -(HealthData a, Damage b) { a.Hurt(b); return a; } private void SetHealth(int newHealth) => _health = Mathf.Clamp(newHealth, 0, maxHealth); private void AddHealth(int newHealth) => _health = Mathf.Clamp(_health + newHealth, 0, maxHealth); private void ReduceHealth(int newHealth) => _health = Mathf.Clamp(_health - newHealth, 0, maxHealth); } }