using System.Collections; using System.Collections.Generic; //using UnityEditor.PackageManager; using UnityEngine; using UnityEngine.Events; public class HealthSystem : MonoBehaviour { private StatusEffects statusEffects; private float hp; private bool dead = false; [SerializeField] private List<string> bannedTags; [SerializeField] private UnityEvent OnDamageTaken; [SerializeField] private UnityEvent OnRegenerate; [SerializeField] private UnityEvent OnDeath; private UpdateManager updateManager; private IUpdatable[] updatables; public bool immortal = false; void Start() { statusEffects = GetComponent<StatusEffects>(); updatables = GetComponents<IUpdatable>(); if (statusEffects == null) { Debug.LogWarning("No status efffect script in this object!"); return; } hp = statusEffects.maxHp; GameObject t = GameObject.Find("UpdateManager"); if (t) { updateManager = t.GetComponent<UpdateManager>(); } } public float GetHealth() { return hp; } public void EditHealth(float value) { hp = value; } public void TakeDamage(float value, GameObject source) { if(value < 0) { Debug.LogError("Take damage only accepts positive values"); return; } if (immortal) return; foreach(string t in bannedTags) { if (source) { if (t == source.tag) return; } } if(statusEffects.shield > 0) { if(statusEffects.shield >= value ) statusEffects.shield -= value; else { hp += statusEffects.shield - value; statusEffects.shield = 0; } } else { hp -= value; } if(hp <= 0) { Die(); } OnDamageTaken.Invoke(); } public void Die() { dead = true; //Debug.Log("The player went to sleep... Forever."); OnDeath.Invoke(); } public void Destroy() { if (updateManager != null) { foreach (IUpdatable i in updatables) { updateManager.RemoveFromList(i); } } Destroy(gameObject); } public void Regenerate(float value) { if (value < 0) { Debug.LogError("Regenerate only accepts positive values"); return; } hp += value; OnRegenerate.Invoke(); } public float GetHealthPercentage() { return (hp / statusEffects.maxHp); } public float GetMaxHealth() { return statusEffects.maxHp; } }