RosterChecks.cs
using Sandbox;

namespace PaintballBaddies;

public sealed class RosterChecks : Component
{
    private float elapsed;
    private int step = -1;
    private bool checkedStep;
    protected override void OnUpdate()
    {
        elapsed += Time.Delta;
        if ( elapsed < 2 ) return;
        var roster = Components.Get<RosterSelection>();
        var player = Components.Get<PlayerController>();
        if ( roster is null || player is null ) return;
        int next = (int)((elapsed - 2) / 2);
        if ( next >= RosterSelection.Names.Length )
        {
            roster.Select( 0 );
            Log.Info( "ROSTER_CHECK COMPLETE" );
            Destroy();
            return;
        }
        if ( step != next )
        {
            step = next;
            checkedStep = false;
            roster.Select( step );
        }
        if ( !checkedStep && (elapsed - 2) % 2 > 1 )
        {
            var renderer = player.Renderer;
            bool hand = renderer.TryGetBoneTransform( "RightHand", out var transform );
            bool pass = roster.Selected == step && renderer.Sequence.Name == "idle" && renderer.Sequence.Time > 0.1f
                && renderer.Model.Bounds.Size.z > 50 && renderer.Model.Bounds.Size.z < 85 && hand;
            Log.Info( $"ROSTER_CHECK {(pass ? "PASS" : "FAIL")} {roster.CharacterName}: height={renderer.Model.Bounds.Size.z} sequence={renderer.Sequence.Name} time={renderer.Sequence.Time} hand={hand}" );
            checkedStep = true;
        }
    }
}