SlideCoverReview.cs
using Sandbox;
namespace PaintballBaddies;
public sealed class SlideCoverReview : Component
{
private PlayerController player;
private CoverController cover;
private GameObject obstacle,blocker;
private float elapsed;
private int stage;
private float maxRise;
private int standingFrames;
private void Check(string name,bool pass)=>Log.Info($"SLIDE_COVER {(pass ? "PASS" : "FAIL")} {name}");
protected override void OnStart()
{
player=Scene.GetAllComponents<PlayerController>().First();cover=player.Components.Get<CoverController>();
player.UseLookControls=false;player.EyeAngles=Angles.Zero;player.WorldPosition=new Vector3(-710,70,2);
player.WishVelocity=Vector3.Zero;player.Body.Velocity=Vector3.Zero;cover.TestInput=true;
obstacle=TrainingRange.Box(null,"Slide low cover",new Vector3(-550,70,24),new Vector3(20,180,48),Color.Gray,true);
obstacle.Components.Create<CoverSurface>();
}
protected override void OnUpdate()
{
elapsed+=Time.Delta;
if((stage==0 && elapsed>.3f) || stage==3){player.WorldPosition=new Vector3(-710,70,2);player.Body.Velocity=Vector3.Forward*177;}
if(stage==0 && elapsed>.7f)
{
player.Body.Velocity=Vector3.Forward*177;
Check("running forward action starts slide",cover.Activate(true) && cover.Sliding && !cover.Attached);
Check("firing blocked during slide",!player.Components.Get<PaintballMarker>().FireAt(new Vector3(-550,70,24)));
stage=1;
}
if(stage==1 || stage==2)
{
maxRise=System.MathF.Max(maxRise,player.WorldPosition.z);
if(cover.Attached && !player.IsDucking)standingFrames++;
}
if(stage==1 && elapsed>1.1f)
{
Check("native movement advances",player.WorldPosition.x>-700 && player.WorldPosition.x<-575);
Check("slide remains active",cover.Sliding);stage=2;
}
if(stage==2 && elapsed>2.5f)
{
Check("arrives attached without vault",cover.Attached && !cover.Sliding && !player.Components.Get<VaultController>().IsVaulting);
Check("stops before wall",player.WorldPosition.x<-575);
Check("no physical hop",maxRise<3);
Check("no standing frame at cover handoff",standingFrames==0);
cover.Leave();Check("input restored",player.UseInputControls);
player.WorldPosition=new Vector3(-710,70,2);stage=3;
}
if(stage==3 && elapsed>3)
{
player.Body.Velocity=Vector3.Forward*177;
Check("second slide starts",cover.TrySlide());cover.Enabled=false;
Check("disable interrupts and restores",!cover.Sliding && player.UseInputControls);
cover.Enabled=true;
blocker=TrainingRange.Box(null,"Slide obstruction",new Vector3(-640,70,35),new Vector3(20,80,70),Color.Gray,true);stage=4;
}
if(stage==4 && elapsed>3.5f)
{
player.Body.Velocity=Vector3.Forward*177;
Check("blocked path rejects slide",!cover.TrySlide());stage=5;
}
}
protected override void OnDestroy()
{
if(cover.IsValid()){cover.Leave();cover.TestInput=false;cover.Enabled=true;}
if(player.IsValid())player.UseLookControls=true;
if(obstacle.IsValid())obstacle.Destroy();if(blocker.IsValid())blocker.Destroy();
}
}