diff --git a/code/Entities/MinigameManager.cs b/code/Entities/MinigameManager.cs index b3b8fa5..111cd39 100644 --- a/code/Entities/MinigameManager.cs +++ b/code/Entities/MinigameManager.cs @@ -14,6 +14,7 @@ public partial class MinigameManager : Entity { [Net] public Minigame LoadedMinigame { get; private set; } private List AvailableMinigames { get; set; } + private List InvolvedPlayers { get; set; } public override void Spawn() { @@ -23,6 +24,7 @@ public partial class MinigameManager : Entity public void StartMinigame(List players, string minigameName = null) { + InvolvedPlayers = players.ToList(); if (CheckForMinigames()) { LoadedMinigame = string.IsNullOrEmpty( minigameName ) ? AvailableMinigames.OrderBy( _ => Guid.NewGuid() ).FirstOrDefault() : TypeLibrary.Create( minigameName ); @@ -54,13 +56,35 @@ public partial class MinigameManager : Entity { FindMinigames(); } + + private void cleanupPlayerPawns() + { + InvolvedPlayers.ForEach( player => + { + player.Pawn.Delete(); + player.Pawn = null; + } ); + } - public void Tick() + /// + /// Called once per tick by the RoundManager. Ticks any running minigame. + /// + /// true if the current minigame has ended, else false + public bool Tick() { if ( LoadedMinigame is not { IsValid: true } ) { - return; + return false; } - LoadedMinigame.Tick(); + var ended = LoadedMinigame.Tick(); + if ( !ended ) + { + return false; + } + + LoadedMinigame.Cleanup(); + LoadedMinigame = null; + return true; + } } diff --git a/code/Entities/RoundManager.cs b/code/Entities/RoundManager.cs index e4f3780..65b21a3 100644 --- a/code/Entities/RoundManager.cs +++ b/code/Entities/RoundManager.cs @@ -76,7 +76,19 @@ public partial class RoundManager : Entity if ( RoundState == RoundState.InProgress ) { - MinigameManager.Tick(); + var ended = MinigameManager.Tick(); + if ( ended ) + { + MinigamesLeftInRound--; + if ( MinigamesLeftInRound > 0 ) + { + MinigameManager.StartMinigame( Players ); + } + else + { + RoundState = RoundState.NotStarted; + } + } } } @@ -120,6 +132,11 @@ public partial class RoundManager : Entity RoundState = RoundState.InProgress; Players = All.OfType().ToList(); + Players.ForEach( player => + { + player.Ready = false; + } ); + MinigamesLeftInRound = MinigamesPerRound; MinigameManager.StartMinigame( Players, minigameName ); } diff --git a/code/Minigames/Minigame.cs b/code/Minigames/Minigame.cs index c526597..ada9d05 100644 --- a/code/Minigames/Minigame.cs +++ b/code/Minigames/Minigame.cs @@ -21,7 +21,8 @@ public abstract class Minigame : Entity /// /// Once a minigame is loaded and initialized, this method is called once per server tick. /// - public abstract void Tick(); + /// true if the minigame has ended, false otherwise + public abstract bool Tick(); /// /// Cleans up any entities and components created by this minigame. diff --git a/code/Minigames/RussianRoulette/RussianRouletteMinigame.cs b/code/Minigames/RussianRoulette/RussianRouletteMinigame.cs index 55ab89f..52885bf 100644 --- a/code/Minigames/RussianRoulette/RussianRouletteMinigame.cs +++ b/code/Minigames/RussianRoulette/RussianRouletteMinigame.cs @@ -16,8 +16,10 @@ public class RussianRouletteMinigame : Minigame public override string Name => "Russian Roulette"; private List Players { get; set; } private Pawn Shooter { get; set; } + private const float ShooterDistance = 80f; private const float TimeBetweenShots = 7f; + private const float TimeBetweenDeathAndEnd = 5f; private int Taunted = 0; private List DeadVictims => Players @@ -26,6 +28,7 @@ public class RussianRouletteMinigame : Minigame .ToList(); private TimeSince TimeSinceShot { get; set; } + private TimeSince TimeSinceDeadVictim { get; set; } public override void Initialize( List players ) { @@ -60,7 +63,7 @@ public class RussianRouletteMinigame : Minigame TimeSinceShot = 0; } - public override void Tick() + public override bool Tick() { if ( DeadVictims.Any() ) { @@ -68,10 +71,14 @@ public class RussianRouletteMinigame : Minigame { ChatBox.AddChatEntry( To.Everyone, "Shooter", "Heh, nothing personnel, kid." ); Taunted = int.MaxValue; + TimeSinceDeadVictim = 0; + } + else if(TimeSinceDeadVictim > TimeBetweenDeathAndEnd) + { + return true; } - return; } - if ( TimeSinceShot > TimeBetweenShots ) + else if ( TimeSinceShot > TimeBetweenShots ) { TimeSinceShot = 0; Taunted = 0; @@ -95,6 +102,8 @@ public class RussianRouletteMinigame : Minigame ChatBox.AddChatEntry( To.Everyone, "Shooter", "Im gettin' ready!" ); Taunted++; } + + return false; } public override void Cleanup()