ok so this should be the way to go
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 20s
Create tag and build when new code gets to main / Export (push) Successful in 10m24s

This commit is contained in:
2026-01-17 21:51:57 +01:00
parent 7c74b8b5e5
commit 561e026834
14 changed files with 64 additions and 35 deletions

View File

@@ -5,18 +5,18 @@ using Movementtests.interfaces;
[GlobalClass]
public partial class CDamageable : Node, IDamageable
{
[Signal]
public delegate void DamageTakenEventHandler(float damageTaken);
public event Action<IDamageable, float> DamageTaken;
[Export]
public RDamageModifier[] DamageModifiers { get; set; }
public float TakeDamage(RDamage damage)
{
var finalDamage = 0f;
foreach (var damageable in DamageModifiers.ToIDamageables())
finalDamage += damageable.TakeDamage(damage);
EmitSignalDamageTaken(finalDamage);
DamageTaken?.Invoke(this, finalDamage);
return finalDamage;
}
}

View File

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

View File

@@ -17,9 +17,9 @@ metadata/_custom_type_script = "uid://baiapod3csndf"
script = ExtResource("2_r3cnf")
metadata/_custom_type_script = "uid://b6y3ugfydvch0"
[sub_resource type="Resource" id="Resource_s01ng"]
[sub_resource type="Resource" id="Resource_6d4gl"]
script = ExtResource("8_6d4gl")
Speed = 3.0
Speed = 5.0
metadata/_custom_type_script = "uid://dtpxijlnb2c5"
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_62kkh"]
@@ -59,7 +59,7 @@ DamageModifiers = Array[Object]([SubResource("Resource_qj0ob")])
metadata/_custom_type_script = "uid://b0u23nkpaimyc"
[node name="CGroundedMovement" parent="." node_paths=PackedStringArray("WallInFrontRayCast") instance=ExtResource("7_qyswd")]
RMovement = SubResource("Resource_s01ng")
RMovement = SubResource("Resource_6d4gl")
WallInFrontRayCast = NodePath("../WallInFrontRayCast")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]

View File

@@ -23,9 +23,9 @@ script = ExtResource("2_1bsgx")
DamageType = 1
metadata/_custom_type_script = "uid://b6y3ugfydvch0"
[sub_resource type="Resource" id="Resource_ma2bq"]
[sub_resource type="Resource" id="Resource_on7rt"]
script = ExtResource("8_on7rt")
Speed = 2.0
Speed = 3.0
TargetHeight = 10.0
metadata/_custom_type_script = "uid://dtpxijlnb2c5"
@@ -67,7 +67,7 @@ DamageModifiers = Array[Object]([SubResource("Resource_jnv07"), SubResource("Res
metadata/_custom_type_script = "uid://b0u23nkpaimyc"
[node name="CFlyingMovement" parent="." instance=ExtResource("7_vaeds")]
RMovement = SubResource("Resource_ma2bq")
RMovement = SubResource("Resource_on7rt")
TerrainCollision = 256
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]

View File

@@ -5,10 +5,8 @@ using Movementtests.interfaces;
[GlobalClass]
public partial class CHealth : Node, IHealthable
{
[Signal]
public delegate void HealthChangedEventHandler(float health);
[Signal]
public delegate void DeadEventHandler();
public event Action<IHealthable, float> HealthChanged;
public event Action<IHealthable> HealthDepleted;
[Export]
public RHealth HealthResource;
@@ -20,15 +18,15 @@ public partial class CHealth : Node, IHealthable
CurrentHealth = HealthResource.StartingHealth;
}
public void ReduceHealth(float amount)
public void ReduceHealth(IDamageable source, float amount)
{
CurrentHealth -= amount;
EmitSignalHealthChanged(CurrentHealth);
HealthChanged?.Invoke(this, CurrentHealth);
if (CurrentHealth <= 0)
{
CurrentHealth = 0;
EmitSignalDead();
HealthDepleted?.Invoke(this);
}
}
}

View File

@@ -19,7 +19,7 @@ public partial class CFlyingMovement : Node3D, IMoveable
_randomDirection = new Vector3(GD.RandRange(-1, 1), 1, GD.RandRange(-1, 1)).Normalized();
}
public new Vector3 ComputeVelocity(MovementInputs inputs)
public Vector3 ComputeVelocity(MovementInputs inputs)
{
var velocity = inputs.Velocity;
var spaceState = GetWorld3D().DirectSpaceState;

View File

@@ -11,7 +11,7 @@ public partial class CGroundedMovement : Node3D, IMoveable
public RayCast3D WallInFrontRayCast { get; set; }
public new Vector3 ComputeVelocity(MovementInputs inputs)
public Vector3 ComputeVelocity(MovementInputs inputs)
{
var velocity = inputs.Velocity;
var target = inputs.TargetLocation;