aboutsummaryrefslogtreecommitdiffstats
path: root/code/pawn/component/camera/SpectatorCameraComponent.cs
diff options
context:
space:
mode:
authorLeonardo Bishop <me@leonardobishop.com>2023-07-30 02:45:36 +0100
committerLeonardo Bishop <me@leonardobishop.com>2023-07-30 02:45:36 +0100
commit914512435d37d9f1e1ea4c045afd4ec5612b7534 (patch)
treeaca7ae248159ad9dd6bf5ec09c4f6b2b4eb92848 /code/pawn/component/camera/SpectatorCameraComponent.cs
parentd599275439cd35e0d3e3146e39be809df55459bd (diff)
Replace movement controllers
Diffstat (limited to 'code/pawn/component/camera/SpectatorCameraComponent.cs')
-rw-r--r--code/pawn/component/camera/SpectatorCameraComponent.cs41
1 files changed, 41 insertions, 0 deletions
diff --git a/code/pawn/component/camera/SpectatorCameraComponent.cs b/code/pawn/component/camera/SpectatorCameraComponent.cs
new file mode 100644
index 0000000..f81e186
--- /dev/null
+++ b/code/pawn/component/camera/SpectatorCameraComponent.cs
@@ -0,0 +1,41 @@
+using Sandbox;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace MurderGame;
+
+public class SpectatorCameraComponent : BaseCameraComponent
+{
+ public Player Target { get; set; }
+
+ public override void Simulate( IClient cl )
+ {
+ if (Target == null || !Target.IsValid() || Target.LifeState == LifeState.Dead)
+ {
+ var targets = GetTargets();
+ if ( targets.Count == 0 )
+ {
+ Target = null;
+ return;
+ }
+ var nextTarget = targets.First();
+ Target = (Player)nextTarget.Pawn;
+ }
+ }
+
+ 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<IClient> GetTargets()
+ {
+ return Game.Clients.Where(c => c.Pawn is Player player && player.CurrentTeam != Team.Spectator && player.LifeState == LifeState.Alive).ToList();
+ }
+}