From 4fd31d7988013bf35f863e04afa5ccace10fb86f Mon Sep 17 00:00:00 2001 From: Marco Date: Sun, 23 Feb 2025 18:08:57 +0100 Subject: [PATCH] Damage actor handler --- Scenes/Actors/4WayActorEnemyTest.tscn | 20 +++++- Scripts/Components/Actors/Actor.cs | 2 + .../Components/Actors/ActorFreeMovement.cs | 4 ++ Scripts/Components/Actors/AnimationHandler.cs | 5 +- .../Actors/DamageReceiverActorModule.cs | 66 +++++++++++++++++++ .../Actors/EnemyNavigationMovement.cs | 4 +- .../Actors/EnemyPossessionMovement.cs | 3 +- 7 files changed, 100 insertions(+), 4 deletions(-) create mode 100644 Scripts/Components/Actors/DamageReceiverActorModule.cs diff --git a/Scenes/Actors/4WayActorEnemyTest.tscn b/Scenes/Actors/4WayActorEnemyTest.tscn index a9772287..f929c6e3 100644 --- a/Scenes/Actors/4WayActorEnemyTest.tscn +++ b/Scenes/Actors/4WayActorEnemyTest.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=14 format=3 uid="uid://bc054js8ep2b"] +[gd_scene load_steps=16 format=3 uid="uid://bc054js8ep2b"] [ext_resource type="Script" path="res://Scripts/Components/Actors/Actor.cs" id="1_ugrra"] [ext_resource type="SpriteFrames" uid="uid://ch2ll1on8im2p" path="res://Resources/Sprites/FairyGuard.tres" id="2_i2plx"] @@ -11,6 +11,7 @@ [ext_resource type="Script" path="res://Scripts/Components/Actors/ActorResourceProvider.cs" id="9_fyr27"] [ext_resource type="PackedScene" uid="uid://cj63k0dmk7tl1" path="res://Scenes/Weapons/enemy_weapon_base.tscn" id="10_yktta"] [ext_resource type="Resource" uid="uid://cdfmedtgp2rcn" path="res://Resources/Weapons/EnemyWeapon.tres" id="11_kuimj"] +[ext_resource type="Script" path="res://Scripts/Components/Actors/DamageReceiverActorModule.cs" id="12_fu5g7"] [sub_resource type="CircleShape2D" id="CircleShape2D_2b36v"] radius = 5.0 @@ -18,6 +19,9 @@ radius = 5.0 [sub_resource type="CircleShape2D" id="CircleShape2D_sthwe"] radius = 85.0529 +[sub_resource type="CircleShape2D" id="CircleShape2D_0tkae"] +radius = 5.09902 + [node name="ActorEnemyTest" type="CharacterBody2D"] collision_layer = 16 collision_mask = 113 @@ -71,10 +75,24 @@ debug_path_custom_color = Color(1, 0, 0, 1) [node name="HealthProvider" type="Node2D" parent="."] script = ExtResource("9_fyr27") ResourceName = "Health" +MaxResource = 4.0 [node name="EnemyWeapon" parent="." instance=ExtResource("10_yktta")] WeaponData = ExtResource("11_kuimj") +[node name="DamageReceiver" type="Node2D" parent="." node_paths=PackedStringArray("HealthProvider")] +script = ExtResource("12_fu5g7") +HealthProvider = NodePath("../HealthProvider") +BulletGroup = 2 + +[node name="Area2D" type="Area2D" parent="DamageReceiver"] +collision_layer = 16 +collision_mask = 8 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="DamageReceiver/Area2D"] +shape = SubResource("CircleShape2D_0tkae") + [connection signal="area_entered" from="PlayerDetection" to="PlayerDetection" method="_on_area_entered"] [connection signal="area_exited" from="PlayerDetection" to="PlayerDetection" method="_on_area_exited"] [connection signal="velocity_computed" from="NavigationAgent2D" to="NavigationMovementProvider" method="_on_navigation_agent_2d_velocity_computed"] +[connection signal="area_entered" from="DamageReceiver/Area2D" to="DamageReceiver" method="_on_damage_hitbox_area_entered"] diff --git a/Scripts/Components/Actors/Actor.cs b/Scripts/Components/Actors/Actor.cs index a3bfe18f..77b0124c 100644 --- a/Scripts/Components/Actors/Actor.cs +++ b/Scripts/Components/Actors/Actor.cs @@ -15,6 +15,8 @@ public partial class Actor : CharacterBody2D private GameManager _gameManager; private List _modules = new(); + + public bool IsDestroyed { get; set; } public override void _Ready() { diff --git a/Scripts/Components/Actors/ActorFreeMovement.cs b/Scripts/Components/Actors/ActorFreeMovement.cs index de0ebfc4..d7de970b 100644 --- a/Scripts/Components/Actors/ActorFreeMovement.cs +++ b/Scripts/Components/Actors/ActorFreeMovement.cs @@ -16,6 +16,8 @@ public partial class ActorFreeMovement : MovementHandler get => _parent.MovementDirection; set => _parent.MovementDirection = value; } + + public bool IsDestroyed => _parent.IsDestroyed; public override void Init(Actor parent) { @@ -32,6 +34,8 @@ public partial class ActorFreeMovement : MovementHandler public override void PhysicsUpdate(double delta) { + if (IsDestroyed) return; + MovementDirection = AggregateInputProviders().Normalized(); var aimingDirection = GetAimingDirection().Normalized(); diff --git a/Scripts/Components/Actors/AnimationHandler.cs b/Scripts/Components/Actors/AnimationHandler.cs index e85de59d..c69ddcbd 100644 --- a/Scripts/Components/Actors/AnimationHandler.cs +++ b/Scripts/Components/Actors/AnimationHandler.cs @@ -10,6 +10,8 @@ public partial class AnimationHandler : ActorModule protected Actor _parent; + public bool IsDestroyed => _parent.IsDestroyed; + public override void Init(Actor parent) { _parent = parent; @@ -25,6 +27,8 @@ public partial class AnimationHandler : ActorModule public override void Update(double delta) { + if (IsDestroyed) return; + var direction = _parent.FacingDirection; //GetSnappedDirection(); if (_parent.Velocity.Length() > 0) @@ -38,7 +42,6 @@ public partial class AnimationHandler : ActorModule _animatedSprite.Play("walk_" + DirectionToString(direction)); _animatedSprite.SpeedScale = 0; } - } public override void PhysicsUpdate(double delta) diff --git a/Scripts/Components/Actors/DamageReceiverActorModule.cs b/Scripts/Components/Actors/DamageReceiverActorModule.cs new file mode 100644 index 00000000..00d257a3 --- /dev/null +++ b/Scripts/Components/Actors/DamageReceiverActorModule.cs @@ -0,0 +1,66 @@ +using Godot; + +namespace Cirno.Scripts.Components.Actors; + +public partial class DamageReceiverActorModule : ActorModule +{ + protected Actor _actor; + + [Export] + public ActorResourceProvider HealthProvider { get; private set; } + + [Export] + public bool Invulnerable { get; private set; } = false; + + [Export] protected BulletOwner BulletGroup { get; set; } = BulletOwner.None; + + public override void Init(Actor actor) + { + _actor = actor; + + HealthProvider.ResourceDepleted += OnDeath; + } + + public override void Update(double delta) + { + + } + + public override void PhysicsUpdate(double delta) + { + + } + + private void _on_damage_hitbox_area_entered(Area2D area) + { + if (_actor.IsDestroyed) return; + if (Invulnerable) return; + if (area is not Bullet bullet) return; + + if (BulletGroup is BulletOwner.None) + { + this.Hit(bullet.Damage); + bullet.RequestCollisionDestruction(); + return; + } + + if (bullet.BulletInfo.Owner == BulletGroup) return; + + this.Hit(bullet.Damage); + bullet.RequestCollisionDestruction(); + } + + public void Hit(float damage, DamageType damageType = DamageType.Neutral) + { + if (_actor.IsDestroyed) return; + if (Invulnerable) return; + + HealthProvider.CurrentResource -= damage; + } + + protected void OnDeath() + { + _actor.IsDestroyed = true; + GD.Print("Actor dead"); + } +} \ No newline at end of file diff --git a/Scripts/Components/Actors/EnemyNavigationMovement.cs b/Scripts/Components/Actors/EnemyNavigationMovement.cs index bf3bae74..bcee4ddc 100644 --- a/Scripts/Components/Actors/EnemyNavigationMovement.cs +++ b/Scripts/Components/Actors/EnemyNavigationMovement.cs @@ -19,6 +19,8 @@ public partial class EnemyNavigationMovement : MovementHandler set => _parent.MovementDirection = value; } + public bool IsDestroyed => _parent.IsDestroyed; + [Export] private bool _navigationEnabled = false; [Export] public float AlarmReactRange = 200f; @@ -83,6 +85,7 @@ public partial class EnemyNavigationMovement : MovementHandler public override void PhysicsUpdate(double delta) { + if (IsDestroyed) return; if (_actorAi.Ai is not AiState.Enabled) return; @@ -149,7 +152,6 @@ public partial class EnemyNavigationMovement : MovementHandler Shoot(); } } - break; } } diff --git a/Scripts/Components/Actors/EnemyPossessionMovement.cs b/Scripts/Components/Actors/EnemyPossessionMovement.cs index 60bcfe8a..9f352685 100644 --- a/Scripts/Components/Actors/EnemyPossessionMovement.cs +++ b/Scripts/Components/Actors/EnemyPossessionMovement.cs @@ -4,7 +4,7 @@ public partial class EnemyPossessionMovement : ActorFreeMovement { private ActorAi _actorAi; - + public bool IsDestroyed => _parent.IsDestroyed; // State accessor public override void Init(Actor parent) @@ -16,6 +16,7 @@ public partial class EnemyPossessionMovement : ActorFreeMovement public override void PhysicsUpdate(double delta) { + if (IsDestroyed) return; if (_actorAi.Ai is AiState.Controlled) base.PhysicsUpdate(delta); }