StandingCoverRegistrationReview.cs
using Sandbox;
namespace PaintballBaddies;
/// <summary>Temporary attachment/posture check for newly registered solid props.</summary>
public sealed class StandingCoverRegistrationReview : Component
{
    public bool Done {get;private set;}
    public List<string> Results {get;}=new();
    CoverSurface[] surfaces;PlayerController player;CoverController cover;Vector3 previous;Angles angles;bool look;
    float elapsed;int index,stage;
    protected override void OnStart()
    {
        Scene.GetAllComponents<PaintballControls>().First().StartPractice();
        player=MultiplayerSession.LocalPlayer(Scene);cover=player.Components.Get<CoverController>();previous=player.WorldPosition;angles=player.EyeAngles;look=player.UseLookControls;
        player.UseLookControls=false;cover.TestInput=true;
        surfaces=Scene.GetAllComponents<CoverSurface>().Where(x=>x.StandingOnly).ToArray();
        if(surfaces.Length!=4)Results.Add("FAIL expected four newly registered standing props");Place();
    }
    void Place()
    {
        cover.Leave();cover.TestAim=false;
        if(index>=surfaces.Length){Done=true;return;}
        var s=surfaces[index];var b=s.Components.Get<BoxCollider>();var centre=s.WorldTransform.PointToWorld(b.Center);
        foreach(var d in new[]{Vector3.Forward,Vector3.Backward,Vector3.Left,Vector3.Right})
        {
            var direction=s.WorldRotation*d;float extent=(System.MathF.Abs(d.x)*b.Scale.x*s.WorldScale.x+System.MathF.Abs(d.y)*b.Scale.y*s.WorldScale.y)*.5f;
            var p=(centre+direction*(extent+42)).WithZ(s.WorldPosition.z+2);
            if(Scene.Trace.Sphere(16,p+Vector3.Up*18,p+Vector3.Up*50).IgnoreGameObjectHierarchy(player.GameObject).Run().Hit)continue;
            player.WorldPosition=p;player.EyeAngles=Rotation.LookAt(-direction).Angles();player.Body.Velocity=Vector3.Zero;player.WishVelocity=Vector3.Zero;
            elapsed=0;stage=0;return;
        }
        Results.Add("FAIL "+s.GameObject.Name+" no open approach");index++;Place();
    }
    protected override void OnUpdate()
    {
        if(Done)return;elapsed+=Time.Delta;if(elapsed<.6f)return;elapsed=0;
        var s=surfaces[index];
        if(stage++==0){Results.Add((cover.TryEnter()&&cover.ReservedSurface==s?"PASS ":"FAIL ")+s.GameObject.Name+" attaches");return;}
        Results.Add((cover.Attached&&!cover.LowCover&&!player.IsDucking?"PASS ":"FAIL ")+s.GameObject.Name+" uses standing cover");
        cover.Leave();Results.Add((player.UseInputControls?"PASS ":"FAIL ")+s.GameObject.Name+" restores movement");index++;Place();
    }
    protected override void OnDestroy()
    {
        if(cover.IsValid()){cover.Leave();cover.TestInput=false;}
        if(player.IsValid()){player.WorldPosition=previous;player.EyeAngles=angles;player.UseLookControls=look;player.Body.Velocity=Vector3.Zero;}
    }
}