From a257306999153c950d9cb805ea58a79f027139a9 Mon Sep 17 00:00:00 2001 From: Minimata Date: Tue, 20 Jan 2026 12:23:26 +0100 Subject: [PATCH] reorganizing stuff --- player_controller/Scripts/PlayerController.cs | 92 +++++++++---------- .../resources/player_health.tres | 1 - 2 files changed, 44 insertions(+), 49 deletions(-) diff --git a/player_controller/Scripts/PlayerController.cs b/player_controller/Scripts/PlayerController.cs index 4792413d..b88c7c0f 100644 --- a/player_controller/Scripts/PlayerController.cs +++ b/player_controller/Scripts/PlayerController.cs @@ -40,6 +40,8 @@ public partial class PlayerController : CharacterBody3D, /////////////////////////// public event Action DamageTaken; + public event Action HealthChanged; + public event Action HealthDepleted; /////////////////////////// // Public stuff // @@ -72,8 +74,14 @@ public partial class PlayerController : CharacterBody3D, [ExportGroup("Damage")] [Export] public RDamage RDamage { get; set; } - public Node CDamageable { get; set; } + [Export] + public RKnockback RKnockback { get; set; } + + [Export] + public RHealth RHealth { get; set; } + + // Movement stuff [ExportCategory("Movement")] [ExportGroup("Ground")] [Export(PropertyHint.Range, "0,20,0.1,or_greater")] @@ -175,7 +183,6 @@ public partial class PlayerController : CharacterBody3D, [Export(PropertyHint.Range, "1,10,0.1,or_greater")] public float GroundSlideSlopeMagnetism = 2f; - [ExportSubgroup("Air glide")] [Export] public bool AllowForVelocityRedirection = true; @@ -211,8 +218,7 @@ public partial class PlayerController : CharacterBody3D, [Export(PropertyHint.Range, "1,20,0.1,or_greater")] public float WallRunSpeedThreshold { get; set; } = 8f; - - + /////////////////////////// // Private stuff // /////////////////////////// @@ -322,7 +328,15 @@ public partial class PlayerController : CharacterBody3D, private Transition _onGroundSlideJump; private Transition _onAirGlideDoubleJump; - private List _hitEnemies = new List(); + // Damage + public CDamageable CDamageable { get; set; } + public CHealth CHealth { get; set; } + public CKnockback CKnockback { get; set; } + public float CurrentHealth { get; set; } + + private bool _isInvincible; + private bool _canAttack = true; + private readonly List _hitEnemies = new List(); public override void _Ready() { @@ -379,23 +393,23 @@ public partial class PlayerController : CharacterBody3D, WeaponHitbox.Monitoring = false; WeaponHitbox.BodyEntered += RegisterHitEnnemy; - CHealth = GetNode("CHealth"); - if (CHealth is IHealthable healthable && RHealth != null) - { - healthable.RHealth = RHealth; - healthable.CurrentHealth = RHealth.StartingHealth; - } - CKnockback = GetNode("CKnockback"); - if (CKnockback is IKnockbackable knockbackable && RKnockback != null) knockbackable.RKnockback = RKnockback; - CDamageable = GetNode("CDamageable"); + CHealth = GetNode("CHealth") as CHealth; + CKnockback = GetNode("CKnockback") as CKnockback; + CDamageable = GetNode("CDamageable") as CDamageable; + if (CHealth == null) throw new Exception("CHealth not found!"); + if (CKnockback == null) throw new Exception("CKnockback not found!"); + if (CDamageable == null) throw new Exception("CDamageable not found!"); - if (CDamageable is IDamageable damageable) + if (RHealth != null) { - damageable.DamageTaken += ReduceHealth; - damageable.DamageTaken += RegisterKnockback; + CHealth.RHealth = RHealth; + CHealth.CurrentHealth = RHealth.StartingHealth; } - if (CHealth is IHealthable healthable2) - healthable2.HealthDepleted += Kill; + if (RKnockback != null) CKnockback!.RKnockback = RKnockback; + + CDamageable.DamageTaken += ReduceHealth; + CDamageable.DamageTaken += RegisterKnockback; + CHealth.HealthDepleted += Kill; // State management _playerState = StateChart.Of(GetNode("StateChart")); @@ -1753,13 +1767,16 @@ public partial class PlayerController : CharacterBody3D, DashIndicatorNode.LookAt(WeaponSystem.GlobalPosition); } } - + + /////////////////////////// + // Hit Management /////// + /////////////////////////// public DamageRecord TakeDamage(DamageRecord damageRecord) { - if (CDamageable is not IDamageable damageable || _isInvincible) + if (_isInvincible) return damageRecord with { Damage = new RDamage(0, damageRecord.Damage.DamageType) }; - var finalDamage = damageable.TakeDamage(damageRecord); + var finalDamage = CDamageable.TakeDamage(damageRecord); DamageTaken?.Invoke(this, finalDamage); TriggerHitstop(); @@ -1769,10 +1786,6 @@ public partial class PlayerController : CharacterBody3D, return finalDamage; } - - /////////////////////////// - // Hit Management /////// - /////////////////////////// public void OnInputHitPressed() { if (_aiming.Active && WeaponSystem.InHandState.Active) @@ -1819,9 +1832,7 @@ public partial class PlayerController : CharacterBody3D, if (_hitEnemies.Count == 0) return; foreach (var damageable in _hitEnemies) - { damageable.TakeDamage(new DamageRecord(this, RDamage)); - } _hitEnemies.Clear(); TriggerHitstop(); } @@ -1837,41 +1848,26 @@ public partial class PlayerController : CharacterBody3D, { ResetTimeScale(); } - - public Node CHealth { get; set; } - public Node CKnockback { get; set; } - - public event Action HealthChanged; - public event Action HealthDepleted; - public RHealth RHealth { get; set; } - public float CurrentHealth { get; set; } public void ReduceHealth(IDamageable source, DamageRecord damageRecord) { - if (CHealth is not IHealthable healthable) return; - healthable.ReduceHealth(source, damageRecord); - HealthChanged?.Invoke(this, healthable.CurrentHealth); + CHealth.ReduceHealth(source, damageRecord); + HealthChanged?.Invoke(this, CHealth.CurrentHealth); } - - public RKnockback RKnockback { get; set; } public void RegisterKnockback(IDamageable source, DamageRecord damageRecord) { - if (CKnockback is not IKnockbackable knockbackable) return; - knockbackable.RegisterKnockback(source, damageRecord); + CKnockback.RegisterKnockback(source, damageRecord); } public Vector3 ComputeKnockback() { - if (CKnockback is not IKnockbackable knockbackable) return Vector3.Zero; - return knockbackable.ComputeKnockback(); + return CKnockback.ComputeKnockback(); } public void Kill(IHealthable source) { GD.Print("Player died!"); } - - private bool _isInvincible; - private bool _canAttack = true; + public void ResetInvincibility() { _isInvincible = false; diff --git a/player_controller/resources/player_health.tres b/player_controller/resources/player_health.tres index 959dd863..7378f1e9 100644 --- a/player_controller/resources/player_health.tres +++ b/player_controller/resources/player_health.tres @@ -4,5 +4,4 @@ [resource] script = ExtResource("1_tv6ah") -StartingHealth = 1.0 metadata/_custom_type_script = "uid://baiapod3csndf"