fixed resources constructors
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 24s
Create tag and build when new code gets to main / Export (push) Successful in 15m37s

This commit is contained in:
2026-01-21 10:13:00 +01:00
parent 494f0cb9ca
commit fa029b9e53
12 changed files with 83 additions and 72 deletions

View File

@@ -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();
}
}

View File

@@ -54,7 +54,7 @@ CDamage = NodePath("CDamageable")
RDamage = ExtResource("2_on7rt")
CKnockback = NodePath("CKnockback")
RKnockback = ExtResource("11_mpa2u")
CMovement = NodePath("CFlyingMovement")
CMovement = NodePath("CMovement")
RMovement = ExtResource("4_dejyg")
[node name="CHealth" type="Node" parent="."]
@@ -67,7 +67,7 @@ script = ExtResource("8_uotso")
DamageModifiers = Array[Object]([SubResource("Resource_jnv07"), SubResource("Resource_53j1c")])
metadata/_custom_type_script = "uid://b0u23nkpaimyc"
[node name="CFlyingMovement" parent="." instance=ExtResource("7_vaeds")]
[node name="CMovement" parent="." instance=ExtResource("7_vaeds")]
RMovement = SubResource("Resource_on7rt")
TerrainCollision = 256

View File

@@ -49,7 +49,7 @@ CDamage = NodePath("CDamageable")
RDamage = ExtResource("2_bn56u")
CKnockback = NodePath("CKnockback")
RKnockback = ExtResource("11_8k3xb")
CMovement = NodePath("CGroundedMovement")
CMovement = NodePath("CMovement")
RMovement = ExtResource("4_na24f")
[node name="CHealth" type="Node" parent="."]
@@ -62,7 +62,7 @@ script = ExtResource("7_1tw73")
DamageModifiers = Array[Object]([SubResource("Resource_qj0ob")])
metadata/_custom_type_script = "uid://b0u23nkpaimyc"
[node name="CGroundedMovement" parent="." node_paths=PackedStringArray("WallInFrontRayCast") instance=ExtResource("7_qyswd")]
[node name="CMovement" parent="." node_paths=PackedStringArray("WallInFrontRayCast") instance=ExtResource("7_qyswd")]
RMovement = SubResource("Resource_6d4gl")
WallInFrontRayCast = NodePath("../WallInFrontRayCast")