Player/PlayerFallDamage.cs
/// <summary>
/// Apply fall damage to the player
/// </summary>
public class PlayerFallDamage : Component, IPlayerEvent
{
	[RequireComponent] public Player Player { get; set; }

	/// <summary>
	/// Falling over this distance is considered a damaging fall
	/// </summary>
	[Property] public float MinimumFallDistance { get; set; } = 200;

	/// <summary>
	/// If you fall this distance it's death
	/// </summary>
	[Property] public float DeathFallDistance { get; set; } = 800;

	/// <summary>
	/// Multiply damage amount by this much
	/// </summary>
	[Property] public float DamageMultiplier { get; set; } = 1.0f;

	void IPlayerEvent.OnLand( float distance, Vector3 velocity )
	{
		if ( IsProxy ) return;

		var damageScale = MathX.Remap( distance, MinimumFallDistance, DeathFallDistance, 0, 1 );
		int damageAmount = (int)(damageScale * 100 * DamageMultiplier);
		if ( damageAmount < 1 ) return;

		// play smashed legs on the ground sound

		Player.TakeDamage( damageAmount );
	}
}