ContextCoverReview.cs
using Sandbox;
namespace PaintballBaddies;
public sealed class ContextCoverReview : Component
{
private PlayerController player;
private CoverController cover;
private VaultController vault;
private GameObject obstacle,blocker;
private float elapsed;
private int stage;
protected override void OnStart()
{
player=Scene.GetAllComponents<PlayerController>().First();cover=player.Components.Get<CoverController>();vault=player.Components.Get<VaultController>();
player.UseLookControls=false;player.EyeAngles=Angles.Zero;player.WorldPosition=new Vector3(-595,70,2);
player.WishVelocity=Vector3.Zero;player.Body.Velocity=Vector3.Zero;cover.TestInput=true;
obstacle=TrainingRange.Box(null,"Context low cover",new Vector3(-550,70,24),new Vector3(20,180,48),Color.Gray,true);
obstacle.Components.Create<CoverSurface>();
blocker=TrainingRange.Box(null,"Blocked vault landing",new Vector3(-510,70,35),new Vector3(30,80,70),Color.Gray,true);
}
private void Check(string name,bool pass)=>Log.Info($"CONTEXT_COVER {(pass ? "PASS" : "FAIL")} {name}");
protected override void OnUpdate()
{
elapsed+=Time.Delta;
if(stage==0 && elapsed>.7f)
{
Check("space alone attaches",cover.Activate(false) && cover.Attached && !vault.IsVaulting);
Check("space alone releases",cover.Activate(false) && !cover.Attached);
Check("blocked approach keeps protective cover",cover.Activate(true) && cover.Attached && !vault.IsVaulting);
Check("space releases even with forward held",cover.Activate(true) && !cover.Attached && !vault.IsVaulting);
blocker.Destroy();stage=1;
}
if(stage==1 && elapsed>1.1f)
{
Check("explicit vault from cover",cover.Activate(false) && vault.TryBegin() && vault.IsVaulting && !cover.Attached);stage=2;
}
if(stage==2 && elapsed>2.2f)
{
Check("vault lands and restores movement",!vault.IsVaulting && vault.Outcome=="Landed" && player.UseInputControls && player.Body.MotionEnabled);
Check("forward space in open ground does not jump",!cover.Activate(true) && !vault.IsVaulting);
stage=3;
}
}
protected override void OnDestroy()
{
if(vault.IsValid())vault.Cancel();
if(cover.IsValid()){cover.Leave();cover.TestInput=false;}
if(player.IsValid())player.UseLookControls=true;
if(obstacle.IsValid())obstacle.Destroy();if(blocker.IsValid())blocker.Destroy();
}
}