using System.Linq; using Sandbox; namespace MurderGame; public class FootprintTrackerComponent : EntityComponent, ISingletonComponent { private bool FootstepLeft = true; private TimeSince TimeSinceFootstep = 0; public void Simulate( IClient cl ) { if ( !Game.IsClient || TimeSinceFootstep < 0.25 ) { return; } TimeSinceFootstep = 0; FootstepLeft = !FootstepLeft; var bystanders = Game.Clients.Where( c => (c.Pawn as Player)?.Team is Team.Bystander or Team.Detective ); foreach ( var bystander in bystanders ) { if ( bystander.Pawn is not Player player ) { continue; } if ( player.Velocity.Length < 1 ) { continue; } var start = player.Position + Vector3.Up; var end = start + Vector3.Down * 20; var tr = Trace.Ray( start, end ) .Size( 2 ) .WithAnyTags( "solid" ) .Ignore( Entity ) .Run(); if ( !tr.Hit ) { continue; } var material = FootstepLeft ? "materials/left_shoe_footprint.vmat" : "materials/right_shoe_footprint.vmat"; var _ = new Footprint { SpriteMaterial = Material.Load( material ), SpriteScale = 24f, Position = player.Position + Vector3.Up * 1f, Rotation = Rotation.LookAt( player.Velocity, tr.Normal ).RotateAroundAxis( tr.Normal, 270 ), Color = player.Color }; } } }