2025-01-17 19:46:17 -05:00
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
|
|
[RequireComponent(typeof(Rigidbody2D))]
|
|
|
|
|
[RequireComponent(typeof(Collider2D))]
|
|
|
|
|
[RequireComponent(typeof(RespawnOnTriggerEnter))]
|
|
|
|
|
public class Damageable : MonoBehaviour
|
|
|
|
|
{
|
|
|
|
|
public float force = 50f;
|
|
|
|
|
public float damage = 0f;
|
2025-02-08 18:54:21 -05:00
|
|
|
public float maxDamage = 1000f;
|
2025-02-26 20:17:19 -05:00
|
|
|
public HealthBar healthBar;
|
|
|
|
|
|
|
|
|
|
private void Start()
|
|
|
|
|
{
|
|
|
|
|
if (healthBar != null)
|
|
|
|
|
{
|
|
|
|
|
healthBar.SetMaxHealth(maxDamage);
|
|
|
|
|
healthBar.SetHealth(maxDamage - damage);
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-01-17 19:46:17 -05:00
|
|
|
|
|
|
|
|
private void OnTriggerEnter2D(Collider2D collision)
|
|
|
|
|
{
|
|
|
|
|
if (collision.gameObject.CompareTag("Punch Hurtbox"))
|
|
|
|
|
{
|
|
|
|
|
print($"{name}: Ouch");
|
2025-02-09 17:18:51 -05:00
|
|
|
Damage(collision.transform.parent.gameObject);
|
2025-01-17 19:46:17 -05:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-09 17:18:51 -05:00
|
|
|
private void Damage(GameObject damageSource)
|
2025-01-17 19:46:17 -05:00
|
|
|
{
|
2025-02-09 17:18:51 -05:00
|
|
|
float actualForce = force;
|
2025-02-26 20:17:19 -05:00
|
|
|
Block blockComponent = GetComponent<Block>();
|
|
|
|
|
if (blockComponent != null && blockComponent.blocking)
|
2025-02-09 17:18:51 -05:00
|
|
|
{
|
2025-02-26 20:17:19 -05:00
|
|
|
if (blockComponent.IsParrying())
|
|
|
|
|
{
|
|
|
|
|
damageSource.GetComponent<Damageable>().SuccessfulParry(gameObject, actualForce);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
actualForce /= 4;
|
|
|
|
|
GetComponent<Rigidbody2D>().AddForce(((transform.position - damageSource.transform.position).normalized + Vector3.up * 2) * actualForce, ForceMode2D.Force);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
GetComponent<Rigidbody2D>().AddForce(((transform.position - damageSource.transform.position).normalized + Vector3.up * 2) * actualForce, ForceMode2D.Force);
|
2025-02-09 17:18:51 -05:00
|
|
|
}
|
|
|
|
|
damage += actualForce;
|
2025-02-08 18:54:21 -05:00
|
|
|
damage = Mathf.Clamp(damage, 0f, maxDamage);
|
2025-02-26 20:17:19 -05:00
|
|
|
if (healthBar != null)
|
|
|
|
|
{
|
|
|
|
|
healthBar.SetHealth(maxDamage - damage);
|
|
|
|
|
}
|
|
|
|
|
if (damage >= maxDamage)
|
|
|
|
|
{
|
|
|
|
|
Die();
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-02-17 14:09:17 -05:00
|
|
|
|
2025-02-26 20:17:19 -05:00
|
|
|
private void SuccessfulParry(GameObject damageSource, float force)
|
|
|
|
|
{
|
|
|
|
|
GetComponent<Rigidbody2D>().AddForce(((transform.position - damageSource.transform.position).normalized + Vector3.up * 2) * force, ForceMode2D.Force);
|
|
|
|
|
damage += force;
|
|
|
|
|
damage = Mathf.Clamp(damage, 0f, maxDamage);
|
|
|
|
|
if (healthBar != null)
|
|
|
|
|
{
|
|
|
|
|
healthBar.SetHealth(maxDamage - damage);
|
|
|
|
|
}
|
2025-02-17 14:09:17 -05:00
|
|
|
if (damage >= maxDamage)
|
|
|
|
|
{
|
|
|
|
|
Die();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void Die()
|
|
|
|
|
{
|
|
|
|
|
PlayerLives playerLives = GetComponent<PlayerLives>(); //add death animation trigger
|
|
|
|
|
if (playerLives != null)
|
|
|
|
|
{
|
|
|
|
|
playerLives.PlayerDied();
|
|
|
|
|
}
|
2025-01-17 19:46:17 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void ResetDamage()
|
|
|
|
|
{
|
|
|
|
|
damage = 0f;
|
2025-02-26 20:17:19 -05:00
|
|
|
if (healthBar != null)
|
|
|
|
|
{
|
|
|
|
|
healthBar.SetHealth(maxDamage);
|
|
|
|
|
}
|
2025-01-17 20:11:04 -05:00
|
|
|
//transform.localScale = Vector3.one;
|
2025-01-17 19:46:17 -05:00
|
|
|
}
|
|
|
|
|
}
|