IDamageMitigator.cs
/// <summary>
/// Something that gets a say in how much damage actually lands on a player.
/// </summary>
///
/// This is the extension point for armour, and for anything like it we add
/// later - a difficulty modifier, a downed state, a temporary buff.
///
/// It exists because damage can only be reduced in ONE place. SWB's
/// PlayerBase.TakeDamage doubles headshots, subtracts from Health, and then
/// decides whether that killed you, all in the same call. Anything that
/// tries to give health back afterwards has already lost: a hit that took
/// you to zero ran OnDeath before the refund, so armour would work on every
/// shot except the one that mattered.
///
/// So TakeDamage asks for mitigators before it subtracts. That is a two
/// line hook in SWB, and this interface is deliberately in OUR code and in
/// the global namespace so the hook doesn't have to know anything about
/// this game - it just asks whatever is attached to the player.
///
/// Implementations run on the owning client only (TakeDamage returns early
/// for proxies), so any state they read has to be [Sync]'d or owner-local.
public interface IDamageMitigator
{
	/// <summary>
	/// Returns the damage that should actually be applied. Called after
	/// SWB's own modifiers - headshot doubling in particular - so this sees
	/// the real incoming number.
	/// </summary>
	float Mitigate( float damage );
}