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

This commit is contained in:
2026-01-20 12:23:26 +01:00
parent 2e5fcb6a75
commit a257306999
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<IHealthable, float> HealthChanged;
public event Action<IHealthable> 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<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()
{
@@ -379,23 +393,23 @@ public partial class PlayerController : CharacterBody3D,
WeaponHitbox.Monitoring = false;
WeaponHitbox.BodyEntered += RegisterHitEnnemy;
CHealth = GetNode<Node>("CHealth");
if (CHealth is IHealthable healthable && RHealth != null)
{
healthable.RHealth = RHealth;
healthable.CurrentHealth = RHealth.StartingHealth;
}
CKnockback = GetNode<Node>("CKnockback");
if (CKnockback is IKnockbackable knockbackable && RKnockback != null) knockbackable.RKnockback = RKnockback;
CDamageable = GetNode<Node>("CDamageable");
CHealth = GetNode<Node>("CHealth") as CHealth;
CKnockback = GetNode<Node>("CKnockback") as CKnockback;
CDamageable = GetNode<Node>("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<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)
{
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;

View File

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