ok so this should be the way to go
This commit is contained in:
@@ -1,9 +1,15 @@
|
||||
using System;
|
||||
using Godot;
|
||||
using Movementtests.interfaces;
|
||||
|
||||
[GlobalClass]
|
||||
public partial class Enemy : CharacterBody3D, IDamageable, IDamageMaker, IHealthable, IKillable
|
||||
{
|
||||
public event Action<IDamageable, float> DamageTaken;
|
||||
|
||||
public event Action<IHealthable, float> HealthChanged;
|
||||
public event Action<IHealthable> HealthDepleted;
|
||||
|
||||
[Export]
|
||||
public Node3D Target { get; set; }
|
||||
|
||||
@@ -11,10 +17,10 @@ public partial class Enemy : CharacterBody3D, IDamageable, IDamageMaker, IHealth
|
||||
public RDamage GetDamageDealt { get; set; }
|
||||
|
||||
[Export]
|
||||
public CHealth CHealth { get; set; }
|
||||
public Node CHealth { get; set; }
|
||||
|
||||
[Export]
|
||||
public CDamageable CDamage { get; set; }
|
||||
public Node CDamage { get; set; }
|
||||
|
||||
[Export]
|
||||
public Node CMovement { get; set; }
|
||||
@@ -29,8 +35,8 @@ public partial class Enemy : CharacterBody3D, IDamageable, IDamageMaker, IHealth
|
||||
_damageBox = GetNode<Area3D>("DamageBox");
|
||||
|
||||
_damageBox.BodyEntered += OnDamageBoxTriggered;
|
||||
CDamage.DamageTaken += ReduceHealth;
|
||||
CHealth.Dead += Kill;
|
||||
if (CDamage is IDamageable damageable) damageable.DamageTaken += ReduceHealth;
|
||||
if (CHealth is IHealthable healthable) healthable.HealthDepleted += Kill;
|
||||
}
|
||||
|
||||
public override void _PhysicsProcess(double delta)
|
||||
@@ -54,25 +60,31 @@ public partial class Enemy : CharacterBody3D, IDamageable, IDamageMaker, IHealth
|
||||
public void OnDamageBoxTriggered(Node3D body)
|
||||
{
|
||||
GD.Print("Take this!");
|
||||
if(body is IDamageable damageable) damageable.TakeDamage(GetDamageDealt);
|
||||
if (body is not IDamageable damageable) return;
|
||||
damageable.TakeDamage(GetDamageDealt);
|
||||
}
|
||||
|
||||
public float TakeDamage(RDamage damage)
|
||||
{
|
||||
GD.Print("Ouch!");
|
||||
return CDamage.TakeDamage(damage);
|
||||
if (CDamage is not IDamageable damageable) return 0;
|
||||
|
||||
var finalDamage = damageable.TakeDamage(damage);
|
||||
DamageTaken?.Invoke(this, damage.DamageDealt);
|
||||
return finalDamage;
|
||||
}
|
||||
|
||||
public void ReduceHealth(float amount)
|
||||
public void ReduceHealth(IDamageable source, float amount)
|
||||
{
|
||||
CHealth.ReduceHealth(amount);
|
||||
if (CHealth is not IHealthable healthable) return;
|
||||
healthable.ReduceHealth(source, amount);
|
||||
}
|
||||
|
||||
public void Kill()
|
||||
public void Kill(IHealthable source)
|
||||
{
|
||||
foreach (var killable in DeathEffects.ToIKillables())
|
||||
{
|
||||
killable.Kill();
|
||||
killable.Kill(source);
|
||||
}
|
||||
QueueFree();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user