Compare commits

..

1 Commits

Author SHA1 Message Date
a257306999 reorganizing stuff
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 19s
Create tag and build when new code gets to main / Export (push) Successful in 10m45s
2026-01-20 12:23:26 +01:00
2 changed files with 44 additions and 49 deletions

View File

@@ -40,6 +40,8 @@ public partial class PlayerController : CharacterBody3D,
/////////////////////////// ///////////////////////////
public event Action<IDamageable, DamageRecord> DamageTaken; public event Action<IDamageable, DamageRecord> DamageTaken;
public event Action<IHealthable, float> HealthChanged;
public event Action<IHealthable> HealthDepleted;
/////////////////////////// ///////////////////////////
// Public stuff // // Public stuff //
@@ -72,8 +74,14 @@ public partial class PlayerController : CharacterBody3D,
[ExportGroup("Damage")] [ExportGroup("Damage")]
[Export] [Export]
public RDamage RDamage { get; set; } 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")] [ExportCategory("Movement")]
[ExportGroup("Ground")] [ExportGroup("Ground")]
[Export(PropertyHint.Range, "0,20,0.1,or_greater")] [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")] [Export(PropertyHint.Range, "1,10,0.1,or_greater")]
public float GroundSlideSlopeMagnetism = 2f; public float GroundSlideSlopeMagnetism = 2f;
[ExportSubgroup("Air glide")] [ExportSubgroup("Air glide")]
[Export] [Export]
public bool AllowForVelocityRedirection = true; public bool AllowForVelocityRedirection = true;
@@ -211,8 +218,7 @@ public partial class PlayerController : CharacterBody3D,
[Export(PropertyHint.Range, "1,20,0.1,or_greater")] [Export(PropertyHint.Range, "1,20,0.1,or_greater")]
public float WallRunSpeedThreshold { get; set; } = 8f; public float WallRunSpeedThreshold { get; set; } = 8f;
/////////////////////////// ///////////////////////////
// Private stuff // // Private stuff //
/////////////////////////// ///////////////////////////
@@ -322,7 +328,15 @@ public partial class PlayerController : CharacterBody3D,
private Transition _onGroundSlideJump; private Transition _onGroundSlideJump;
private Transition _onAirGlideDoubleJump; private Transition _onAirGlideDoubleJump;
private List<IDamageable> _hitEnemies = new List<IDamageable>(); // 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<IDamageable> _hitEnemies = new List<IDamageable>();
public override void _Ready() public override void _Ready()
{ {
@@ -379,23 +393,23 @@ public partial class PlayerController : CharacterBody3D,
WeaponHitbox.Monitoring = false; WeaponHitbox.Monitoring = false;
WeaponHitbox.BodyEntered += RegisterHitEnnemy; WeaponHitbox.BodyEntered += RegisterHitEnnemy;
CHealth = GetNode<Node>("CHealth"); CHealth = GetNode<Node>("CHealth") as CHealth;
if (CHealth is IHealthable healthable && RHealth != null) CKnockback = GetNode<Node>("CKnockback") as CKnockback;
{ CDamageable = GetNode<Node>("CDamageable") as CDamageable;
healthable.RHealth = RHealth; if (CHealth == null) throw new Exception("CHealth not found!");
healthable.CurrentHealth = RHealth.StartingHealth; if (CKnockback == null) throw new Exception("CKnockback not found!");
} if (CDamageable == null) throw new Exception("CDamageable not found!");
CKnockback = GetNode<Node>("CKnockback");
if (CKnockback is IKnockbackable knockbackable && RKnockback != null) knockbackable.RKnockback = RKnockback;
CDamageable = GetNode<Node>("CDamageable");
if (CDamageable is IDamageable damageable) if (RHealth != null)
{ {
damageable.DamageTaken += ReduceHealth; CHealth.RHealth = RHealth;
damageable.DamageTaken += RegisterKnockback; CHealth.CurrentHealth = RHealth.StartingHealth;
} }
if (CHealth is IHealthable healthable2) if (RKnockback != null) CKnockback!.RKnockback = RKnockback;
healthable2.HealthDepleted += Kill;
CDamageable.DamageTaken += ReduceHealth;
CDamageable.DamageTaken += RegisterKnockback;
CHealth.HealthDepleted += Kill;
// State management // State management
_playerState = StateChart.Of(GetNode("StateChart")); _playerState = StateChart.Of(GetNode("StateChart"));
@@ -1753,13 +1767,16 @@ public partial class PlayerController : CharacterBody3D,
DashIndicatorNode.LookAt(WeaponSystem.GlobalPosition); DashIndicatorNode.LookAt(WeaponSystem.GlobalPosition);
} }
} }
///////////////////////////
// Hit Management ///////
///////////////////////////
public DamageRecord TakeDamage(DamageRecord damageRecord) public DamageRecord TakeDamage(DamageRecord damageRecord)
{ {
if (CDamageable is not IDamageable damageable || _isInvincible) if (_isInvincible)
return damageRecord with { Damage = new RDamage(0, damageRecord.Damage.DamageType) }; return damageRecord with { Damage = new RDamage(0, damageRecord.Damage.DamageType) };
var finalDamage = damageable.TakeDamage(damageRecord); var finalDamage = CDamageable.TakeDamage(damageRecord);
DamageTaken?.Invoke(this, finalDamage); DamageTaken?.Invoke(this, finalDamage);
TriggerHitstop(); TriggerHitstop();
@@ -1769,10 +1786,6 @@ public partial class PlayerController : CharacterBody3D,
return finalDamage; return finalDamage;
} }
///////////////////////////
// Hit Management ///////
///////////////////////////
public void OnInputHitPressed() public void OnInputHitPressed()
{ {
if (_aiming.Active && WeaponSystem.InHandState.Active) if (_aiming.Active && WeaponSystem.InHandState.Active)
@@ -1819,9 +1832,7 @@ public partial class PlayerController : CharacterBody3D,
if (_hitEnemies.Count == 0) return; if (_hitEnemies.Count == 0) return;
foreach (var damageable in _hitEnemies) foreach (var damageable in _hitEnemies)
{
damageable.TakeDamage(new DamageRecord(this, RDamage)); damageable.TakeDamage(new DamageRecord(this, RDamage));
}
_hitEnemies.Clear(); _hitEnemies.Clear();
TriggerHitstop(); TriggerHitstop();
} }
@@ -1837,41 +1848,26 @@ public partial class PlayerController : CharacterBody3D,
{ {
ResetTimeScale(); ResetTimeScale();
} }
public Node CHealth { get; set; }
public Node CKnockback { get; set; }
public event Action<IHealthable, float> HealthChanged;
public event Action<IHealthable> HealthDepleted;
public RHealth RHealth { get; set; }
public float CurrentHealth { get; set; }
public void ReduceHealth(IDamageable source, DamageRecord damageRecord) public void ReduceHealth(IDamageable source, DamageRecord damageRecord)
{ {
if (CHealth is not IHealthable healthable) return; CHealth.ReduceHealth(source, damageRecord);
healthable.ReduceHealth(source, damageRecord); HealthChanged?.Invoke(this, CHealth.CurrentHealth);
HealthChanged?.Invoke(this, healthable.CurrentHealth);
} }
public RKnockback RKnockback { get; set; }
public void RegisterKnockback(IDamageable source, DamageRecord damageRecord) public void RegisterKnockback(IDamageable source, DamageRecord damageRecord)
{ {
if (CKnockback is not IKnockbackable knockbackable) return; CKnockback.RegisterKnockback(source, damageRecord);
knockbackable.RegisterKnockback(source, damageRecord);
} }
public Vector3 ComputeKnockback() public Vector3 ComputeKnockback()
{ {
if (CKnockback is not IKnockbackable knockbackable) return Vector3.Zero; return CKnockback.ComputeKnockback();
return knockbackable.ComputeKnockback();
} }
public void Kill(IHealthable source) public void Kill(IHealthable source)
{ {
GD.Print("Player died!"); GD.Print("Player died!");
} }
private bool _isInvincible;
private bool _canAttack = true;
public void ResetInvincibility() public void ResetInvincibility()
{ {
_isInvincible = false; _isInvincible = false;

View File

@@ -4,5 +4,4 @@
[resource] [resource]
script = ExtResource("1_tv6ah") script = ExtResource("1_tv6ah")
StartingHealth = 1.0
metadata/_custom_type_script = "uid://baiapod3csndf" metadata/_custom_type_script = "uid://baiapod3csndf"