using Sandbox; using System.Collections.Generic; using System.Linq; namespace MurderGame; public partial class SpectatorCameraComponent : BaseCameraComponent { [Net] public Player Target { get; set; } [Net] public int TargetIndex { get; set; } public override void Simulate( IClient cl ) { var targets = GetTargets(); if ( targets.Count == 0 ) { Target = null; return; } if (Target == null || !Target.IsValid() || Target.LifeState == LifeState.Dead) { FindNextTarget( targets, false ); return; } if ( Input.Released( "attack1" ) ) { FindNextTarget( targets, false ); } else if ( Input.Released( "attack2" ) ) { FindNextTarget( targets, true ); } } public override void FrameSimulate( IClient cl ) { if ( Target == null || !Target.IsValid() || Target.LifeState == LifeState.Dead ) return; Camera.Rotation = Target.EyeRotation; Camera.FieldOfView = Screen.CreateVerticalFieldOfView( Game.Preferences.FieldOfView ); Camera.FirstPersonViewer = Target; Camera.Position = Target.EyePosition; } private List GetTargets() { return Game.Clients.Where(c => c.Pawn is Player player && player.CurrentTeam != Team.Spectator && player.LifeState == LifeState.Alive).ToList(); } private void FindNextTarget(List targets, bool backwards) { if ( !backwards ) { if ( ++TargetIndex >= targets.Count ) TargetIndex = 0; } else { if ( --TargetIndex < 0 ) TargetIndex = targets.Count - 1; } var nextTarget = targets[TargetIndex]; Target = (Player)nextTarget.Pawn; } public override InventoryComponent GetObservedInventory() { return Target?.Inventory; } public override float GetObservedHealth() { return Target?.Health ?? Entity.Health; } public override Team GetObservedTeam() { return Target?.CurrentTeam ?? Entity.CurrentTeam; } }