CitizenReloadClock.cs
namespace PaintballBaddies;

/// <summary>Maps weapon-owned reload progress onto the native paintball presentation.</summary>
public sealed class CitizenReloadClock
{
    public const float PickupStart = .8f;
    public const float RecoveryStart = 3.2f;
    private float cancelElapsed;
    public float CancellationElapsed => cancelElapsed;

    public void Reset() => cancelElapsed = 0;

    public float Sample(float current, bool requested, bool cancelled, bool returning,
        bool podHeld, float reloadRemaining, float reloadProgress, float delta)
    {
        if (cancelled && !returning)
        {
            cancelElapsed += delta;
            return podHeld ? 2.6f+.36f*System.Math.Clamp(cancelElapsed/.5f,0,1) : RecoveryStart;
        }
        if (requested && reloadRemaining > 0)
            return PickupStart+System.Math.Clamp(reloadProgress,0,1)*2.4f;
        if (requested && !cancelled && current < RecoveryStart)
            return RecoveryStart;
        return current;
    }
}