fixed resources constructors
This commit is contained in:
@@ -23,28 +23,24 @@ public partial class Enemy : CharacterBody3D,
|
||||
|
||||
[ExportGroup("Health")]
|
||||
[Export]
|
||||
public Node CHealth { get; set; }
|
||||
[Export]
|
||||
public RHealth RHealth { get; set; }
|
||||
|
||||
[Export]
|
||||
public RDeathEffect[] DeathEffects { get; set; }
|
||||
public IHealthable CHealth { get; set; }
|
||||
|
||||
[ExportGroup("Damage")]
|
||||
[Export]
|
||||
public Node CDamage { get; set; }
|
||||
[Export]
|
||||
public RDamage RDamage { get; set; }
|
||||
[Export]
|
||||
public Node CKnockback { get; set; }
|
||||
public IDamageable CDamageable { get; set; }
|
||||
|
||||
[Export]
|
||||
public RKnockback RKnockback { get; set; }
|
||||
public IKnockbackable CKnockback { get; set; }
|
||||
|
||||
[ExportGroup("Movement")]
|
||||
[Export]
|
||||
public Node CMovement { get; set; }
|
||||
[Export]
|
||||
public RMovement RMovement { get; set; }
|
||||
public IMoveable CMovement { get; set; }
|
||||
|
||||
// Public stuff
|
||||
public float CurrentHealth { get; set; }
|
||||
@@ -62,29 +58,35 @@ public partial class Enemy : CharacterBody3D,
|
||||
{
|
||||
_damageBox = GetNode<Area3D>("DamageBox");
|
||||
|
||||
if (CMovement is IMoveable moveable && RMovement != null) moveable.RMovement = RMovement;
|
||||
if (CHealth is IHealthable healthable && RHealth != null)
|
||||
CDamageable = GetNode<Node>("CDamageable") as IDamageable;
|
||||
CMovement = GetNode<Node>("CMovement") as IMoveable;
|
||||
CHealth = GetNode<Node>("CHealth") as IHealthable;
|
||||
CKnockback = GetNode<Node>("CKnockback") as IKnockbackable;
|
||||
if (CDamageable is null) GD.PrintErr("This node needs a 'CDamage' child of type IDamageable!");
|
||||
if (CMovement is null) GD.PrintErr("This node needs a 'CMovement' child of type IMoveable!");
|
||||
if (CHealth is null) GD.PrintErr("This node needs a 'CHealth' child of type IHealthable!");
|
||||
if (CKnockback is null) GD.PrintErr("This node needs a 'CKnockback' child of type IKnockbackable!");
|
||||
|
||||
if (RMovement != null) CMovement!.RMovement = RMovement;
|
||||
if (RHealth != null)
|
||||
{
|
||||
healthable.RHealth = RHealth;
|
||||
healthable.CurrentHealth = RHealth.StartingHealth;
|
||||
CHealth!.RHealth = RHealth;
|
||||
CHealth.CurrentHealth = RHealth.StartingHealth;
|
||||
}
|
||||
if (CKnockback is IKnockbackable knockbackable && RKnockback != null) knockbackable.RKnockback = RKnockback;
|
||||
if (RKnockback != null) CKnockback!.RKnockback = RKnockback;
|
||||
}
|
||||
|
||||
public void SetupSignals()
|
||||
{
|
||||
if (CDamage is IDamageable damageable)
|
||||
{
|
||||
damageable.DamageTaken += ReduceHealth;
|
||||
damageable.DamageTaken += RegisterKnockback;
|
||||
}
|
||||
if (CHealth is IHealthable healthable) healthable.HealthDepleted += Kill;
|
||||
CDamageable.DamageTaken += ReduceHealth;
|
||||
CDamageable.DamageTaken += RegisterKnockback;
|
||||
CHealth.HealthDepleted += Kill;
|
||||
}
|
||||
|
||||
public override void _PhysicsProcess(double delta)
|
||||
{
|
||||
// Only trigger gameplay related effects 4 times per second
|
||||
if(Engine.GetPhysicsFrames() % 15 == 0) ProcessGameplay(delta);
|
||||
// Only trigger gameplay related effects on specific frames
|
||||
if(Engine.GetPhysicsFrames() % 10 == 0) ProcessGameplay(delta);
|
||||
|
||||
var targetPlanar = new Vector3(Target.GlobalPosition.X, GlobalPosition.Y, Target.GlobalPosition.Z);
|
||||
LookAt(targetPlanar);
|
||||
@@ -113,25 +115,25 @@ public partial class Enemy : CharacterBody3D,
|
||||
|
||||
public Vector3 ComputeVelocity(MovementInputs inputs)
|
||||
{
|
||||
if (CMovement is not IMoveable movement) return Vector3.Zero;
|
||||
return movement!.ComputeVelocity(inputs);
|
||||
if (CMovement is null) return Vector3.Zero;
|
||||
return CMovement.ComputeVelocity(inputs);
|
||||
}
|
||||
|
||||
public DamageRecord TakeDamage(DamageRecord damageRecord)
|
||||
{
|
||||
if (CDamage is not IDamageable damageable)
|
||||
if (CDamageable is null)
|
||||
return damageRecord with { Damage = new RDamage(0, damageRecord.Damage.DamageType) };
|
||||
|
||||
var finalDamage = damageable.TakeDamage(damageRecord);
|
||||
var finalDamage = CDamageable.TakeDamage(damageRecord);
|
||||
DamageTaken?.Invoke(this, finalDamage);
|
||||
return finalDamage;
|
||||
}
|
||||
|
||||
public void ReduceHealth(IDamageable source, DamageRecord damageRecord)
|
||||
{
|
||||
if (CHealth is not IHealthable healthable) return;
|
||||
healthable.ReduceHealth(source, damageRecord);
|
||||
HealthChanged?.Invoke(this, healthable.CurrentHealth);
|
||||
if (CHealth is null) return;
|
||||
CHealth.ReduceHealth(source, damageRecord);
|
||||
HealthChanged?.Invoke(this, CHealth.CurrentHealth);
|
||||
}
|
||||
|
||||
public void Kill(IHealthable source)
|
||||
@@ -145,13 +147,13 @@ public partial class Enemy : CharacterBody3D,
|
||||
|
||||
public void RegisterKnockback(IDamageable source, DamageRecord damageRecord)
|
||||
{
|
||||
if (CKnockback is not IKnockbackable knockbackable) return;
|
||||
knockbackable.RegisterKnockback(source, damageRecord);
|
||||
if (CKnockback is null) return;
|
||||
CKnockback.RegisterKnockback(source, damageRecord);
|
||||
}
|
||||
|
||||
public Vector3 ComputeKnockback()
|
||||
{
|
||||
if (CKnockback is not IKnockbackable knockbackable) return Vector3.Zero;
|
||||
return knockbackable.ComputeKnockback();
|
||||
if (CKnockback is null) return Vector3.Zero;
|
||||
return CKnockback.ComputeKnockback();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user