From 0dcf4a3f99ae9dc44af5008d7bf7a633f9391cab Mon Sep 17 00:00:00 2001 From: Minimata Date: Sat, 17 Jan 2026 17:47:14 +0100 Subject: [PATCH] fixed damage composition issue --- interfaces/IDamageable.cs | 1 - player_controller/PlayerController.tscn | 28 +++++--------- player_controller/Scripts/PlayerController.cs | 8 +--- resource_definitions/RDamageModifier.cs | 4 -- scenes/damage/CDamageable.cs | 22 +++++++++++ scenes/damage/CDamageable.cs.uid | 1 + scenes/damage/CDamageable.tscn | 6 +++ scenes/enemies/FirstEnemy.cs | 31 +++++---------- scenes/enemies/FlyingEnemy.cs | 23 +++++------ scenes/enemies/first_enemy.tscn | 38 +++++++------------ scenes/enemies/flying_enemy.tscn | 22 +++++++++-- scenes/health/CHealth.cs | 1 - 12 files changed, 92 insertions(+), 93 deletions(-) create mode 100644 scenes/damage/CDamageable.cs create mode 100644 scenes/damage/CDamageable.cs.uid create mode 100644 scenes/damage/CDamageable.tscn diff --git a/interfaces/IDamageable.cs b/interfaces/IDamageable.cs index f32b8a33..8c17492c 100644 --- a/interfaces/IDamageable.cs +++ b/interfaces/IDamageable.cs @@ -4,6 +4,5 @@ namespace Movementtests.interfaces; public interface IDamageable { - event Action DamageTaken; float TakeDamage(RDamage damage); } \ No newline at end of file diff --git a/player_controller/PlayerController.tscn b/player_controller/PlayerController.tscn index 7b6649c4..5cc56119 100644 --- a/player_controller/PlayerController.tscn +++ b/player_controller/PlayerController.tscn @@ -1,9 +1,10 @@ -[gd_scene load_steps=58 format=3 uid="uid://bei4nhkf8lwdo"] +[gd_scene load_steps=56 format=3 uid="uid://bei4nhkf8lwdo"] [ext_resource type="Script" uid="uid://bbbrf5ckydfna" path="res://player_controller/Scripts/PlayerController.cs" id="1_poq2x"] [ext_resource type="PackedScene" uid="uid://cf3rrgr1imvv4" path="res://scenes/path/path.tscn" id="2_6lejt"] [ext_resource type="Script" uid="uid://jitubgv6judn" path="res://resource_definitions/RDamage.cs" id="2_q14ux"] [ext_resource type="Resource" uid="uid://bl5crtu1gkrtr" path="res://systems/inputs/base_mode/base_mode.tres" id="3_cresl"] +[ext_resource type="Script" uid="uid://b0u23nkpaimyc" path="res://scenes/damage/CDamageable.cs" id="4_q7bng"] [ext_resource type="Resource" uid="uid://cpdaw41ah5gic" path="res://systems/inputs/base_mode/rotate_y.tres" id="4_rxwoh"] [ext_resource type="Resource" uid="uid://ccrb5xsnphc8" path="res://systems/inputs/base_mode/rotate_floorplane.tres" id="5_4u7i3"] [ext_resource type="Script" uid="uid://b6y3ugfydvch0" path="res://resource_definitions/RDamageModifier.cs" id="5_q7bng"] @@ -50,23 +51,9 @@ script = ExtResource("2_q14ux") DamageDealt = 3.0 metadata/_custom_type_script = "uid://jitubgv6judn" -[sub_resource type="Resource" id="Resource_q14ux"] -script = ExtResource("5_q7bng") -metadata/_custom_type_script = "uid://b6y3ugfydvch0" - -[sub_resource type="Resource" id="Resource_q7bng"] -script = ExtResource("5_q7bng") -DamageType = 1 -metadata/_custom_type_script = "uid://b6y3ugfydvch0" - [sub_resource type="Resource" id="Resource_jb43f"] script = ExtResource("5_q7bng") -DamageType = 2 -metadata/_custom_type_script = "uid://b6y3ugfydvch0" - -[sub_resource type="Resource" id="Resource_cmijs"] -script = ExtResource("5_q7bng") -DamageType = 3 +Modifier = 3.0 metadata/_custom_type_script = "uid://b6y3ugfydvch0" [sub_resource type="CapsuleMesh" id="CapsuleMesh_xc2g5"] @@ -98,11 +85,11 @@ radius = 0.4 [sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_2q0ik"] blend_mode = 1 -[node name="Player" type="CharacterBody3D"] +[node name="Player" type="CharacterBody3D" node_paths=PackedStringArray("CDamage")] collision_mask = 272 script = ExtResource("1_poq2x") GetDamageDealt = SubResource("Resource_m8gvy") -DamageModifiers = Array[Object]([SubResource("Resource_q14ux"), SubResource("Resource_q7bng"), SubResource("Resource_jb43f"), SubResource("Resource_cmijs")]) +CDamage = NodePath("CDamageable") WalkSpeed = 7.5 AccelerationFloor = 4.0 DecelerationFloor = 3.0 @@ -140,6 +127,11 @@ WallHugGravityLesseningFactor = 15.0 WallHugDownwardMaxSpeed = 4.0 WallHugHorizontalDeceleration = 1.0 +[node name="CDamageable" type="Node" parent="."] +script = ExtResource("4_q7bng") +DamageModifiers = Array[Object]([SubResource("Resource_jb43f")]) +metadata/_custom_type_script = "uid://b0u23nkpaimyc" + [node name="WallRunSnapper" type="RayCast3D" parent="."] unique_name_in_owner = true transform = Transform3D(0.99999994, 0, 0, 0, 1, 0, 0, 0, 0.99999994, 0, 0, 0) diff --git a/player_controller/Scripts/PlayerController.cs b/player_controller/Scripts/PlayerController.cs index 91bc2c61..79325dae 100644 --- a/player_controller/Scripts/PlayerController.cs +++ b/player_controller/Scripts/PlayerController.cs @@ -70,7 +70,7 @@ public partial class PlayerController : CharacterBody3D, IDamageable, IKnockback [Export] public RDamage GetDamageDealt { get; set; } [Export] - public RDamageModifier[] DamageModifiers { get; set; } + public CDamageable CDamage { get; set; } [ExportCategory("Movement")] [ExportGroup("Ground")] @@ -1737,11 +1737,7 @@ public partial class PlayerController : CharacterBody3D, IDamageable, IKnockback public float TakeDamage(RDamage damage) { - float damageTaken = 0; - foreach (var damageable in DamageModifiers.ToIDamageables()) - damageTaken += damageable.TakeDamage(damage); - DamageTaken?.Invoke(damageTaken); - return damageTaken; + return CDamage.TakeDamage(damage); } /////////////////////////// diff --git a/resource_definitions/RDamageModifier.cs b/resource_definitions/RDamageModifier.cs index 37ef33dd..8755fca2 100644 --- a/resource_definitions/RDamageModifier.cs +++ b/resource_definitions/RDamageModifier.cs @@ -6,8 +6,6 @@ using Movementtests.systems.damage; [GlobalClass] public partial class RDamageModifier : Resource, IDamageable { - public event Action DamageTaken; - [Export] public EDamageTypes DamageType = EDamageTypes.Normal; [Export] @@ -27,9 +25,7 @@ public partial class RDamageModifier : Resource, IDamageable public float TakeDamage(RDamage damage) { if (damage.DamageType != DamageType) return 0; - var finalDamage = damage.DamageDealt * Modifier; - DamageTaken?.Invoke(finalDamage); return finalDamage; } } diff --git a/scenes/damage/CDamageable.cs b/scenes/damage/CDamageable.cs new file mode 100644 index 00000000..eaeca291 --- /dev/null +++ b/scenes/damage/CDamageable.cs @@ -0,0 +1,22 @@ +using Godot; +using System; +using Movementtests.interfaces; + +[GlobalClass] +public partial class CDamageable : Node, IDamageable +{ + [Signal] + public delegate void DamageTakenEventHandler(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); + return finalDamage; + } +} diff --git a/scenes/damage/CDamageable.cs.uid b/scenes/damage/CDamageable.cs.uid new file mode 100644 index 00000000..bfa50b7e --- /dev/null +++ b/scenes/damage/CDamageable.cs.uid @@ -0,0 +1 @@ +uid://b0u23nkpaimyc diff --git a/scenes/damage/CDamageable.tscn b/scenes/damage/CDamageable.tscn new file mode 100644 index 00000000..3b3fe712 --- /dev/null +++ b/scenes/damage/CDamageable.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://hpsg4fqwrx1u"] + +[ext_resource type="Script" uid="uid://b0u23nkpaimyc" path="res://scenes/damage/CDamageable.cs" id="1_qp8bd"] + +[node name="CDamageable" type="Node"] +script = ExtResource("1_qp8bd") diff --git a/scenes/enemies/FirstEnemy.cs b/scenes/enemies/FirstEnemy.cs index 22e20b64..78b73566 100644 --- a/scenes/enemies/FirstEnemy.cs +++ b/scenes/enemies/FirstEnemy.cs @@ -14,11 +14,11 @@ public partial class FirstEnemy : CharacterBody3D, IDamageable, IDamageMaker, IH [Export] public RDamage GetDamageDealt { get; set; } - [Export] - public RDamageModifier[] DamageModifiers { get; set; } [Export] - public CHealth Health { get; set; } + public CHealth CHealth { get; set; } + [Export] + public CDamageable CDamage { get; set; } [Export] public RDeathEffect[] DeathEffects { get; set; } @@ -33,19 +33,12 @@ public partial class FirstEnemy : CharacterBody3D, IDamageable, IDamageMaker, IH _damageBox.BodyEntered += OnDamageBoxTriggered; - foreach (var damageable in DamageModifiers) - damageable.DamageTaken += ReduceHealth; - - Health.Dead += Kill; + CDamage.DamageTaken += ReduceHealth; + CHealth.Dead += Kill; } public override void _PhysicsProcess(double delta) { - if (Engine.IsEditorHint()) - { - return; - } - var target = Target.GlobalPosition; var direction = (target - GlobalPosition).Normalized(); @@ -70,26 +63,20 @@ public partial class FirstEnemy : CharacterBody3D, IDamageable, IDamageMaker, IH if(body is IDamageable damageable) damageable.TakeDamage(GetDamageDealt); } - public event Action DamageTaken; - public float TakeDamage(RDamage damage) { - var finalDamage = 0f; - foreach (var damageable in DamageModifiers.ToIDamageables()) - finalDamage += damageable.TakeDamage(damage); - DamageTaken?.Invoke(finalDamage); - return finalDamage; + return CDamage.TakeDamage(damage); } public float CurrentHealth { - get => Health.CurrentHealth; - set => Health.CurrentHealth = value; + get => CHealth.CurrentHealth; + set => CHealth.CurrentHealth = value; } public void ReduceHealth(float amount) { - Health.ReduceHealth(amount); + CHealth.ReduceHealth(amount); } public void Kill() diff --git a/scenes/enemies/FlyingEnemy.cs b/scenes/enemies/FlyingEnemy.cs index db205b77..3307606d 100644 --- a/scenes/enemies/FlyingEnemy.cs +++ b/scenes/enemies/FlyingEnemy.cs @@ -13,12 +13,12 @@ public partial class FlyingEnemy : CharacterBody3D, IDamageable, IHealthable, IK [Export] public RDamage GetDamageDealt { get; set; } - - [Export] - public RDamageModifier[] DamageModifiers { get; set; } [Export] - public CHealth Health { get; set; } + public CHealth CHealth { get; set; } + [Export] + public CDamageable CDamage { get; set; } + [Export] public RDeathEffect[] DeathEffects { get; set; } @@ -38,9 +38,8 @@ public partial class FlyingEnemy : CharacterBody3D, IDamageable, IHealthable, IK _randomDirection = new Vector3(GD.RandRange(-1, 1), 1, GD.RandRange(-1, 1)).Normalized(); - foreach (var damageable in DamageModifiers) - damageable.DamageTaken += ReduceHealth; - Health.Dead += Kill; + CDamage.DamageTaken += ReduceHealth; + CHealth.Dead += Kill; } public override void _PhysicsProcess(double delta) @@ -95,19 +94,15 @@ public partial class FlyingEnemy : CharacterBody3D, IDamageable, IHealthable, IK public event Action DamageTaken; + public float TakeDamage(RDamage damage) { - var finalDamage = 0f; - foreach (var damageable in DamageModifiers.ToIDamageables()) - finalDamage += damageable.TakeDamage(damage); - DamageTaken?.Invoke(finalDamage); - return finalDamage; + return CDamage.TakeDamage(damage); } public void ReduceHealth(float amount) { - GD.Print("Reducing health by " + amount); - Health.ReduceHealth(amount); + CHealth.ReduceHealth(amount); } public void Kill() diff --git a/scenes/enemies/first_enemy.tscn b/scenes/enemies/first_enemy.tscn index a7f8b58e..d539e12f 100644 --- a/scenes/enemies/first_enemy.tscn +++ b/scenes/enemies/first_enemy.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=21 format=3 uid="uid://dxt0e2ugmttqq"] +[gd_scene load_steps=19 format=3 uid="uid://dxt0e2ugmttqq"] [ext_resource type="Script" uid="uid://bn7sc6id7n166" path="res://scenes/enemies/FirstEnemy.cs" id="1_4yfjf"] [ext_resource type="Script" uid="uid://b2vdwkiqauhk3" path="res://scenes/enemies/EnemyInitInputs.cs" id="2_42xu3"] @@ -7,6 +7,7 @@ [ext_resource type="Script" uid="uid://jitubgv6judn" path="res://resource_definitions/RDamage.cs" id="3_1tw73"] [ext_resource type="Script" uid="uid://b4cwruitopcee" path="res://resource_definitions/RDeathEffect.cs" id="3_onjoj"] [ext_resource type="Script" uid="uid://baiapod3csndf" path="res://resource_definitions/RHealth.cs" id="3_pvbr4"] +[ext_resource type="Script" uid="uid://b0u23nkpaimyc" path="res://scenes/damage/CDamageable.cs" id="7_1tw73"] [sub_resource type="Resource" id="Resource_66m7n"] script = ExtResource("2_42xu3") @@ -17,26 +18,6 @@ metadata/_custom_type_script = "uid://b2vdwkiqauhk3" script = ExtResource("3_1tw73") metadata/_custom_type_script = "uid://jitubgv6judn" -[sub_resource type="Resource" id="Resource_42xu3"] -script = ExtResource("2_r3cnf") -metadata/_custom_type_script = "uid://b6y3ugfydvch0" - -[sub_resource type="Resource" id="Resource_1tw73"] -script = ExtResource("2_r3cnf") -DamageType = 1 -metadata/_custom_type_script = "uid://b6y3ugfydvch0" - -[sub_resource type="Resource" id="Resource_qj0ob"] -script = ExtResource("2_r3cnf") -DamageType = 2 -metadata/_custom_type_script = "uid://b6y3ugfydvch0" - -[sub_resource type="Resource" id="Resource_d7vrc"] -script = ExtResource("2_r3cnf") -DamageType = 3 -Modifier = 2.0 -metadata/_custom_type_script = "uid://b6y3ugfydvch0" - [sub_resource type="Resource" id="Resource_7gyf3"] script = ExtResource("3_onjoj") metadata/_custom_type_script = "uid://b4cwruitopcee" @@ -45,6 +26,10 @@ metadata/_custom_type_script = "uid://b4cwruitopcee" script = ExtResource("3_pvbr4") metadata/_custom_type_script = "uid://baiapod3csndf" +[sub_resource type="Resource" id="Resource_qj0ob"] +script = ExtResource("2_r3cnf") +metadata/_custom_type_script = "uid://b6y3ugfydvch0" + [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_62kkh"] [sub_resource type="CapsuleMesh" id="CapsuleMesh_3uydm"] @@ -61,14 +46,14 @@ albedo_color = Color(0.06469653, 0.06469653, 0.06469653, 1) [sub_resource type="BoxShape3D" id="BoxShape3D_4yfjf"] size = Vector3(1, 2, 2) -[node name="FirstEnemy" type="CharacterBody3D" node_paths=PackedStringArray("Health")] +[node name="FirstEnemy" type="CharacterBody3D" node_paths=PackedStringArray("CHealth", "CDamage")] collision_layer = 16 collision_mask = 273 script = ExtResource("1_4yfjf") Inputs = SubResource("Resource_66m7n") GetDamageDealt = SubResource("Resource_a6xb8") -DamageModifiers = Array[Object]([SubResource("Resource_42xu3"), SubResource("Resource_1tw73"), SubResource("Resource_qj0ob"), SubResource("Resource_d7vrc")]) -Health = NodePath("CHealth") +CHealth = NodePath("CHealth") +CDamage = NodePath("CDamageable") DeathEffects = Array[Object]([SubResource("Resource_7gyf3")]) [node name="CHealth" type="Node" parent="."] @@ -76,6 +61,11 @@ script = ExtResource("2_gsmti") HealthResource = SubResource("Resource_r3cnf") metadata/_custom_type_script = "uid://bjwrpv3jpsc1e" +[node name="CDamageable" type="Node" parent="."] +script = ExtResource("7_1tw73") +DamageModifiers = Array[Object]([SubResource("Resource_qj0ob")]) +metadata/_custom_type_script = "uid://b0u23nkpaimyc" + [node name="CollisionShape3D" type="CollisionShape3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) shape = SubResource("CapsuleShape3D_62kkh") diff --git a/scenes/enemies/flying_enemy.tscn b/scenes/enemies/flying_enemy.tscn index d99924b0..0d22f126 100644 --- a/scenes/enemies/flying_enemy.tscn +++ b/scenes/enemies/flying_enemy.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=21 format=3 uid="uid://cmlud1hwkd6sv"] +[gd_scene load_steps=24 format=3 uid="uid://cmlud1hwkd6sv"] [ext_resource type="Script" uid="uid://cmvep0qi7qlvf" path="res://scenes/enemies/FlyingEnemy.cs" id="1_b46rq"] [ext_resource type="Script" uid="uid://b6y3ugfydvch0" path="res://resource_definitions/RDamageModifier.cs" id="2_1bsgx"] @@ -7,6 +7,7 @@ [ext_resource type="Script" uid="uid://b4cwruitopcee" path="res://resource_definitions/RDeathEffect.cs" id="4_12h4s"] [ext_resource type="Script" uid="uid://bjwrpv3jpsc1e" path="res://scenes/health/CHealth.cs" id="4_ys4jv"] [ext_resource type="Script" uid="uid://baiapod3csndf" path="res://resource_definitions/RHealth.cs" id="5_irbqc"] +[ext_resource type="Script" uid="uid://b0u23nkpaimyc" path="res://scenes/damage/CDamageable.cs" id="8_uotso"] [sub_resource type="Resource" id="Resource_7nxyi"] script = ExtResource("2_aarbi") @@ -50,6 +51,15 @@ script = ExtResource("5_irbqc") StartingHealth = 50.0 metadata/_custom_type_script = "uid://baiapod3csndf" +[sub_resource type="Resource" id="Resource_jnv07"] +script = ExtResource("2_1bsgx") +metadata/_custom_type_script = "uid://b6y3ugfydvch0" + +[sub_resource type="Resource" id="Resource_53j1c"] +script = ExtResource("2_1bsgx") +DamageType = 1 +metadata/_custom_type_script = "uid://b6y3ugfydvch0" + [sub_resource type="SphereShape3D" id="SphereShape3D_b46rq"] [sub_resource type="SphereMesh" id="SphereMesh_1bsgx"] @@ -66,7 +76,7 @@ albedo_color = Color(0.06469653, 0.06469653, 0.06469653, 1) [sub_resource type="BoxShape3D" id="BoxShape3D_4yfjf"] size = Vector3(1, 1, 1.5) -[node name="FlyingEnemy" type="CharacterBody3D" node_paths=PackedStringArray("Health")] +[node name="FlyingEnemy" type="CharacterBody3D" node_paths=PackedStringArray("CHealth", "CDamage")] collision_layer = 16 collision_mask = 273 motion_mode = 1 @@ -74,7 +84,8 @@ script = ExtResource("1_b46rq") Inputs = SubResource("Resource_7nxyi") GetDamageDealt = SubResource("Resource_o3msb") DamageModifiers = Array[Object]([SubResource("Resource_2pnje"), SubResource("Resource_1bsgx"), SubResource("Resource_irbqc"), SubResource("Resource_uotso")]) -Health = NodePath("CHealth") +CHealth = NodePath("CHealth") +CDamage = NodePath("CDamageable") DeathEffects = Array[Object]([SubResource("Resource_ys4jv")]) [node name="CHealth" type="Node" parent="."] @@ -82,6 +93,11 @@ script = ExtResource("4_ys4jv") HealthResource = SubResource("Resource_aarbi") metadata/_custom_type_script = "uid://bjwrpv3jpsc1e" +[node name="CDamageable" type="Node" parent="."] +script = ExtResource("8_uotso") +DamageModifiers = Array[Object]([SubResource("Resource_jnv07"), SubResource("Resource_53j1c")]) +metadata/_custom_type_script = "uid://b0u23nkpaimyc" + [node name="CollisionShape3D" type="CollisionShape3D" parent="."] shape = SubResource("SphereShape3D_b46rq") diff --git a/scenes/health/CHealth.cs b/scenes/health/CHealth.cs index 85674d69..ea78fb3a 100644 --- a/scenes/health/CHealth.cs +++ b/scenes/health/CHealth.cs @@ -28,7 +28,6 @@ public partial class CHealth : Node, IHealthable if (CurrentHealth <= 0) { CurrentHealth = 0; - GD.Print("Dead!"); EmitSignalDead(); } }