6 Commits

Author SHA1 Message Date
mccarreon
b9dbe07e1f fixed camera with lookat functions 2023-08-04 21:16:49 -07:00
mccarreon
4a338d9502 initial file creation 2023-08-03 19:34:23 -07:00
39b9f71801 Merge pull request 'start_round with minigame name' (#1) from terry-races into master
Reviewed-on: #1
2023-08-03 06:15:15 +00:00
mccarreon
ef88c51454 shortening StartRound 2023-08-02 23:12:31 -07:00
mccarreon
35be78c341 getting rid of unnecessary lines 2023-08-02 22:55:17 -07:00
mccarreon
5c0a454b79 start_round by minigame name 2023-08-02 22:54:05 -07:00
5 changed files with 122 additions and 21 deletions

View File

@@ -21,19 +21,27 @@ public partial class MinigameManager : Entity
FindMinigames();
}
public void StartRandomMinigame(List<Lucker> players)
public void StartMinigame(List<Lucker> players, string minigameName = null)
{
if (CheckForMinigames())
{
LoadedMinigame = string.IsNullOrEmpty( minigameName ) ? AvailableMinigames.OrderBy( _ => Guid.NewGuid() ).FirstOrDefault() : TypeLibrary.Create<Minigame>( minigameName );
ChatBox.AddInformation( To.Everyone, $"Starting {LoadedMinigame.Name}" );
LoadedMinigame.Initialize( players );
}
}
private bool CheckForMinigames()
{
if ( (AvailableMinigames?.Count ?? 0) == 0 )
{
Log.Error( "Attempted to start minigame, but none available" );
return;
return false;
}
LoadedMinigame = AvailableMinigames.OrderBy( _ => Guid.NewGuid() ).FirstOrDefault();
ChatBox.AddInformation( To.Everyone, $"Starting {LoadedMinigame.Name}" );
LoadedMinigame.Initialize( players );
return true;
}
private void FindMinigames()
{
AvailableMinigames = TypeLibrary.GetTypes<Minigame>()

View File

@@ -17,7 +17,7 @@ public partial class RoundManager : Entity
/// The minigame manager we should be using to manage minigames
/// </summary>
private MinigameManager MinigameManager { get; set; }
/// <summary>
/// This percentage of the lobby must be ready to start the countdown for round start
/// </summary>
@@ -27,30 +27,30 @@ public partial class RoundManager : Entity
/// The number of seconds from the timer starting before the round starts
/// </summary>
private const float RoundStartCountdownSeconds = 5f;
/// <summary>
/// The state of the current round
/// </summary>
[Net] public RoundState RoundState { get; private set; }
#region Countdown State
/// <summary>
/// How long since we started counting down to game start. Only useful if in the StartCountdown state.
/// </summary>
[Net] public TimeSince TimeSinceCountdownStarted { get; set; }
/// <summary>
/// The number of seconds left in the countdown. Only useful if in the StartCountdown state.
/// </summary>
public int SecondsLeftInCountdown => (int)Math.Ceiling( RoundStartCountdownSeconds - TimeSinceCountdownStarted );
#endregion
#region In Progress State
private const int MinigamesPerRound = 1;
private int MinigamesLeftInRound { get; set; }
private List<Lucker> Players { get; set; }
#endregion
@@ -110,7 +110,7 @@ public partial class RoundManager : Entity
}
}
private void StartRound()
private void StartRound( string minigameName = null )
{
if ( RoundState == RoundState.InProgress )
{
@@ -120,12 +120,12 @@ public partial class RoundManager : Entity
RoundState = RoundState.InProgress;
Players = All.OfType<Lucker>().ToList();
MinigameManager.StartRandomMinigame( Players );
MinigameManager.StartMinigame( Players, minigameName );
}
[ConCmd.Server("start_round")]
public static void ForceStart()
[ConCmd.Server( "start_round" )]
public static void ForceStart( string minigameName = null )
{
Entity.All.OfType<RoundManager>().FirstOrDefault()?.StartRound();
Entity.All.OfType<RoundManager>().FirstOrDefault()?.StartRound( minigameName );
}
}

View File

@@ -3,7 +3,7 @@ using Sandbox;
namespace LuckerGame.Components.Lucker.Cameras;
public abstract class AbstractCamera : EntityComponent<Entities.Lucker>, ISingletonComponent
public abstract partial class AbstractCamera : EntityComponent<Entities.Lucker>, ISingletonComponent
{
public virtual bool ShouldShowCursor => false;
protected Vector3 CameraPosition { get; set; }
@@ -16,11 +16,11 @@ public abstract class AbstractCamera : EntityComponent<Entities.Lucker>, ISingle
/// Handles any input-independent camera updates (ie following a pawn)
/// </summary>
protected abstract void UpdateCameraParameters();
/// <summary>
/// Handles any input dependent camera updates (ie moving around a top down cam)
/// </summary>
public abstract void BuildInput();
public virtual void BuildInput() { }
/// <summary>
/// Applies Camera parameters to the static Camera

View File

@@ -0,0 +1,41 @@
using Sandbox;
namespace LuckerGame.Components.Lucker.Cameras;
public partial class FixedCamera : AbstractCamera, ISingletonComponent
{
[Net] public float FieldOfViewValue { get; set; } = 70f;
public override bool ShouldShowCursor => true;
protected override void UpdateCameraParameters()
{
FieldOfView = FieldOfViewValue;
FirstPersonViewer = null;
SoundSource = new Transform { Position = CameraPosition };
}
/// <summary>
/// ClientRpc doesn't allow for nullable versions of non-nullable types
/// so here we are
/// </summary>
public void UpdateCameraPositionRotation( Vector3? position = null, Rotation? rotation = null )
{
CameraPosition = (Vector3)(position.Equals( null ) ? CameraPosition : position);
CameraRotation = (Rotation)(rotation.Equals( null ) ? CameraRotation : rotation);
}
[ClientRpc]
public void LookAt( Vector3 position )
{
UpdateCameraPositionRotation( position );
}
[ClientRpc]
public void LookAt( Rotation rotation )
{
UpdateCameraPositionRotation( rotation: rotation );
}
[ClientRpc]
public void LookAt( Vector3 position, Rotation rotation )
{
UpdateCameraPositionRotation( position, rotation );
}
}

View File

@@ -0,0 +1,52 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using LuckerGame.Components.Lucker.Cameras;
using LuckerGame.Components.Pawn;
using LuckerGame.Entities;
using Sandbox;
using Sandbox.UI;
namespace LuckerGame.Minigames.TerryRaces;
[Library( "mg_terry_races" )]
public class TerryRaces : Minigame
{
public override string Name => "Terry Races";
private List<Lucker> Players { get; set; }
private FixedCamera camera;
public override void Initialize( List<Lucker> players )
{
Players = players;
// Setup cameras for players
Players.ForEach( player =>
{
camera = player.Components.Create<FixedCamera>();
camera.LookAt( new Vector3( -110f, 4f, 180f ), Rotation.FromPitch( 45 ) );
camera.FieldOfViewValue = 120f;
} );
Players.Select( ( player, i ) => (Player: player, Index: i) ).ToList().ForEach( pair =>
{
var player = pair.Player;
var index = pair.Index;
var pawn = new Pawn();
pawn.Name = player.Name;
pawn.Tags.Add( "victim" );
pawn.Health = 1;
player.Pawn = pawn;
pawn.DressFromClient( player.Client );
} );
}
public override void Tick()
{
}
public override void Cleanup()
{
}
}