ControllerResponseProbe.cs
using Sandbox;
namespace PaintballBaddies;
/// <summary>Opt-in native controller response measurement, without changing saved tuning.</summary>
public sealed class ControllerResponseProbe : Component
{
    [Property] public bool Quicker { get; set; }
    private PlayerController player;
    private Vector3 origin;
    private bool input;
    private float acceleration,deceleration,elapsed,phaseTime;
    private int phase;
    private float response=-1;
    protected override void OnStart()
    {
        player=Scene.GetAllComponents<PlayerController>().First();
        origin=player.WorldPosition;input=player.UseInputControls;
        acceleration=player.AccelerationTime;deceleration=player.DeaccelerationTime;
        if(Quicker){player.AccelerationTime=.10f;player.DeaccelerationTime=.08f;}
        player.UseInputControls=false;player.WorldPosition=new Vector3(-950,1200,2);player.Body.Velocity=Vector3.Zero;
    }
    protected override void OnUpdate()
    {
        elapsed+=Time.Delta;phaseTime+=Time.Delta;
        float speed=phase is 1 or 3 ? 177 : phase==4 ? -177 : 0;
        player.WishVelocity=Vector3.Forward*speed;
        var actual=player.Velocity.x;
        bool reached=speed==0 ? System.MathF.Abs(actual)<2 : actual*System.MathF.Sign(speed)>=159.3f;
        if(phase>0 && response<0 && reached)response=phaseTime;
        var duration=phase==0 ? .4f : speed==0 ? .6f : 1f;
        if(phaseTime<duration)return;
        if(phase>0)Log.Info($"CONTROLLER_RESPONSE quicker={Quicker} phase={phase} target={speed} response_s={response} final_speed={actual}");
        phase++;phaseTime=0;response=-1;
        if(phase>5){Log.Info("CONTROLLER_RESPONSE COMPLETE");Destroy();}
    }
    protected override void OnDestroy()
    {
        if(!player.IsValid())return;
        player.AccelerationTime=acceleration;player.DeaccelerationTime=deceleration;
        player.UseInputControls=input;player.WorldPosition=origin;player.Body.Velocity=Vector3.Zero;player.WishVelocity=Vector3.Zero;
    }
}