reorganizing stuff
This commit is contained in:
@@ -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;
|
||||||
@@ -212,7 +219,6 @@ 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"));
|
||||||
@@ -1754,12 +1768,15 @@ public partial class PlayerController : CharacterBody3D,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///////////////////////////
|
||||||
|
// 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,32 +1848,19 @@ 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)
|
||||||
@@ -1870,8 +1868,6 @@ public partial class PlayerController : CharacterBody3D,
|
|||||||
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;
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user