Summons
This commit is contained in:
101
Assets/AI/_Summons/SummonDamageReceiver.cs
Normal file
101
Assets/AI/_Summons/SummonDamageReceiver.cs
Normal file
@@ -0,0 +1,101 @@
|
||||
using UnityEngine;
|
||||
using Invector;
|
||||
|
||||
public class SummonDamageReceiver : MonoBehaviour, vIHealthController
|
||||
{
|
||||
[Header("Health")]
|
||||
[SerializeField] private int maxHealth = 40;
|
||||
[SerializeField] private float currentHealth = 40f;
|
||||
|
||||
[Header("Death")]
|
||||
[SerializeField] private bool destroyOnDeath = true;
|
||||
[SerializeField] private float destroyDelay = 0.1f;
|
||||
[SerializeField] private GameObject deathEffect;
|
||||
|
||||
[Header("Debug")]
|
||||
[SerializeField] private bool enableDebug = false;
|
||||
|
||||
[SerializeField] private OnReceiveDamage _onStartReceiveDamage = new OnReceiveDamage();
|
||||
[SerializeField] private OnReceiveDamage _onReceiveDamage = new OnReceiveDamage();
|
||||
[SerializeField] private OnDead _onDead = new OnDead();
|
||||
|
||||
public OnReceiveDamage onStartReceiveDamage => _onStartReceiveDamage;
|
||||
public OnReceiveDamage onReceiveDamage => _onReceiveDamage;
|
||||
public OnDead onDead => _onDead;
|
||||
|
||||
public float currentHealth => this.currentHealth;
|
||||
public int MaxHealth => maxHealth;
|
||||
public bool isDead { get; set; }
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
ResetHealth();
|
||||
}
|
||||
|
||||
public void TakeDamage(vDamage damage)
|
||||
{
|
||||
if (isDead) return;
|
||||
_onStartReceiveDamage.Invoke(damage);
|
||||
|
||||
int dmg = Mathf.RoundToInt(damage.damageValue);
|
||||
if (dmg <= 0) return;
|
||||
|
||||
ChangeHealth(-dmg);
|
||||
_onReceiveDamage.Invoke(damage);
|
||||
|
||||
if (enableDebug)
|
||||
Debug.Log($"[SummonDamageReceiver] {gameObject.name} took {dmg}, HP {currentHealth}/{maxHealth}");
|
||||
}
|
||||
|
||||
public void AddHealth(int value)
|
||||
{
|
||||
if (isDead) return;
|
||||
currentHealth = Mathf.Min(maxHealth, currentHealth + value);
|
||||
}
|
||||
|
||||
public void ChangeHealth(int value)
|
||||
{
|
||||
if (isDead) return;
|
||||
currentHealth = Mathf.Clamp(currentHealth + value, 0f, maxHealth);
|
||||
|
||||
if (currentHealth <= 0f)
|
||||
Die();
|
||||
}
|
||||
|
||||
public void ChangeMaxHealth(int value)
|
||||
{
|
||||
maxHealth = Mathf.Max(1, maxHealth + value);
|
||||
currentHealth = Mathf.Min(currentHealth, maxHealth);
|
||||
}
|
||||
|
||||
public void ResetHealth(float health)
|
||||
{
|
||||
maxHealth = Mathf.Max(1, maxHealth);
|
||||
currentHealth = Mathf.Clamp(health, 0f, maxHealth);
|
||||
isDead = false;
|
||||
}
|
||||
|
||||
public void ResetHealth()
|
||||
{
|
||||
maxHealth = Mathf.Max(1, maxHealth);
|
||||
currentHealth = maxHealth;
|
||||
isDead = false;
|
||||
}
|
||||
|
||||
private void Die()
|
||||
{
|
||||
if (isDead) return;
|
||||
isDead = true;
|
||||
|
||||
_onDead.Invoke(gameObject);
|
||||
|
||||
if (deathEffect != null)
|
||||
{
|
||||
GameObject fx = Instantiate(deathEffect, transform.position, transform.rotation);
|
||||
Destroy(fx, 5f);
|
||||
}
|
||||
|
||||
if (destroyOnDeath)
|
||||
Destroy(gameObject, destroyDelay);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user