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<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;
|
||||
@@ -212,7 +219,6 @@ 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"));
|
||||
@@ -1754,12 +1768,15 @@ public partial class PlayerController : CharacterBody3D,
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////
|
||||
// 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,32 +1848,19 @@ 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)
|
||||
@@ -1870,8 +1868,6 @@ public partial class PlayerController : CharacterBody3D,
|
||||
GD.Print("Player died!");
|
||||
}
|
||||
|
||||
private bool _isInvincible;
|
||||
private bool _canAttack = true;
|
||||
public void ResetInvincibility()
|
||||
{
|
||||
_isInvincible = false;
|
||||
|
||||
@@ -4,5 +4,4 @@
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_tv6ah")
|
||||
StartingHealth = 1.0
|
||||
metadata/_custom_type_script = "uid://baiapod3csndf"
|
||||
|
||||
Reference in New Issue
Block a user