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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user