Pulls in FPS menu so we can make edits

This commit is contained in:
gamer147
2023-08-03 12:22:24 -04:00
parent 686edc85a3
commit a5a734b31a
13 changed files with 722 additions and 3 deletions

View File

@@ -57,8 +57,16 @@ public partial class MinigameManager : Entity
FindMinigames();
}
private void cleanupPlayerPawns()
/// <summary>
/// Goes through the players included in the loaded minigame and deletes and nulls out any pawns assigned to them
/// </summary>
private void CleanupPlayerPawns()
{
if ( LoadedMinigame is not { IsValid: true } || InvolvedPlayers == null)
{
Log.Warning( "Attempted to clean up players without a minigame loaded!" );
return;
}
InvolvedPlayers.ForEach( player =>
{
player.Pawn.Delete();

View File

@@ -49,7 +49,8 @@ public partial class RoundManager : Entity
private const int MinigamesPerRound = 1;
private int MinigamesLeftInRound { get; set; }
[ConVar.Replicated("lucker_minigames_per_round")]
public static int MinigamesLeftInRound { get; set; }
private List<Lucker> Players { get; set; }
#endregion

View File

@@ -0,0 +1,121 @@
@using Sandbox;
@using System;
@using System.Linq;
@using System.Threading.Tasks;
@using Sandbox.Menu;
@using Sandbox.UI;
@namespace LuckerGame.UI.MainMenu
@inherits Panel
<root>
<label class="game-title">
@Game.Menu.Package.Title
</label>
@if ( Lobby == null )
{
<div class="controls">
<a class="button">Loading...</a>
<a class="button" href="/lobby/list">Return</a>
</div>
}
else
{
<div class="controls">
<div class="col">
<label>Members (@Lobby.MemberCount/@Lobby.MaxMembers)</label>
<div class="span">
@foreach (var member in Lobby.Members)
{
<img class="avatar" src="avatar:@member.Id" tooltip="@member.Name" />
}
</div>
</div>
@if ( Lobby.Owner.IsMe )
{
<div class="span">
@if ( MaxPlayersSupported > 1 )
{
<FormGroup class="form-group">
<Label>Maximum Players</Label>
<Control>
<SliderControl ShowRange=@true Min=@(1f) Max=@MaxPlayersSupported Value:bind=@Game.Menu.Lobby.MaxMembers />
</Control>
</FormGroup>
}
<FormGroup class="form-group">
<Label>Map</Label>
<Control>
<SlimPackageCard OnLaunch=@OnMapClicked Package=@MapPackage />
</Control>
</FormGroup>
</div>
}
<div class="spacer" />
<a class="button" @onclick=@LeaveLobby>Leave Lobby</a>
<a class="button" @onclick=@Start>Start</a>
<a class="button" href="/lobby/list">Return</a>
</div>
}
</root>
@code
{
Friend Owner => Lobby.Owner;
ILobby Lobby => Game.Menu.Lobby;
int MaxPlayersSupported { get; set; } = 1;
Package MapPackage { get; set; }
void OnMapClicked()
{
Game.Overlay.ShowPackageSelector( "type:map sort:popular", OnMapSelected );
StateHasChanged();
}
void OnMapSelected( Package map )
{
MapPackage = map;
Game.Menu.Lobby.Map = map.FullIdent;
StateHasChanged();
}
public void LeaveLobby()
{
Lobby?.Leave();
this.Navigate( "/lobby/list" );
}
async Task Start()
{
await Game.Menu.StartServerAsync( Game.Menu.Lobby.MaxMembers, $"{Game.Menu.Lobby.Owner.Name}'s game", Game.Menu.Lobby.Map );
}
async void FetchPackage()
{
MapPackage = await Package.FetchAsync( Game.Menu.Lobby?.Map ?? "facepunch.square", true );
}
protected override void OnAfterTreeRender( bool firstTime )
{
FetchPackage();
}
protected override void OnParametersSet()
{
MaxPlayersSupported = Game.Menu.Package.GetMeta<int>( "MaxPlayers", 1 );
}
}

View File

@@ -0,0 +1,40 @@
@using Sandbox;
@using System.Linq;
@using System.Threading.Tasks;
@using Sandbox.Menu;
@using Sandbox.UI;
@namespace LuckerGame.UI.MainMenu
<root>
<div class="game-title">
@Game.Menu.Package.Title
</div>
<div class="controls">
@if (Game.InGame)
{
<a class="button" onclick=@LeaveGame>Leave</a>
}
else
{
<a class="button" href="/setup">Play</a>
<a class="button" href="/lobby/list">Lobbies</a>
@if ( Game.Menu.Package.SupportsSavedGames && Game.Menu.SavedGames.Any())
{
<a class="button" href="/setup/save">Load Save</a>
}
}
<a class="button" @onclick=@Game.Menu.Close>Quit</a>
</div>
</root>
@code
{
void LeaveGame()
{
Game.Menu.LeaveServer( "Leaving" );
}
}

View File

@@ -0,0 +1,31 @@
@using Sandbox;
@using Sandbox.UI;
@using System.Linq;
@using System.Threading.Tasks;
@using Sandbox.Menu;
@inherits RootPanel
@implements Sandbox.Menu.ILoadingScreenPanel
@attribute [StyleSheet]
@namespace LuckerGame.UI.MainMenu
<root style="flex-direction: column;">
<div class="background" />
<div style="flex-grow: 1;" />
<div class="controls" style="flex-direction: row; justify-content: center;">
<a class="button">@( Progress.Title ?? "Loading..." )</a>
</div>
</root>
@code
{
public LoadingProgress Progress;
public void OnLoadingProgress( LoadingProgress progress )
{
Progress = progress;
StateHasChanged();
}
}

View File

@@ -0,0 +1,50 @@
LoadingScreen
{
background-color: #262934;
padding: 128px 128px;
opacity: 1;
flex-direction: column;
font-size: 25px;
width: 100%;
height: 100%;
position: absolute;
transition: all 0.3s ease-out;
color: rgba( white, 0.8 );
.background
{
position: absolute;
width: 100%;
height: 100%;
background-image: url( https://files.facepunch.com/tony/1b1311b1/boxes.webm );
opacity: 0.2;
background-size: contain;
filter: blur( 20px );
mask: linear-gradient( 45deg, white, white, black );
mask-scope: filter;
}
&:intro
{
opacity: 0;
transform: scaleX( 1.1 );
}
.game-title
{
font-family: Roboto;
font-weight: 700;
font-size: 70px;
color: rgba( white, 1 );
}
.controls
{
flex-direction: column;
gap: 50px;
align-items: flex-start;
font-family: Roboto;
text-transform: uppercase;
}
}

View File

@@ -0,0 +1,66 @@
@using Sandbox;
@using System;
@using System.Linq;
@using System.Threading.Tasks;
@using Sandbox.Menu;
@using Sandbox.UI;
@namespace LuckerGame.UI.MainMenu
@inherits Panel
<root>
<label class="game-title">
@Game.Menu.Package.Title
</label>
<div class="controls">
<div class="span">
<label>Showing @Game.Menu.Lobbies.Count() @(Game.Menu.Lobbies.Count() == 1 ? "lobby" : "lobbies")</label>
<i class="with-click" tooltip="Refresh lobbies" @onclick=@Refresh>refresh</i>
</div>
<div class="scroll">
@foreach ( var lobby in Game.Menu.Lobbies )
{
<a class="button" @onclick=@( () => JoinLobby( lobby ) ) >@(lobby.Owner.Name)'s lobby (@lobby.MemberCount/@lobby.MaxMembers)</a>
}
</div>
<div class="spacer" />
<a class="button" @onclick=@CreateLobbyAsync>Create Lobby</a>
<a class="button" href="/">Return</a>
</div>
</root>
@code
{
public async void CreateLobbyAsync()
{
await Game.Menu.CreateLobbyAsync( 64, "game", true );
Game.Menu.Lobby.Map = "facepunch.square";
this.Navigate( "/lobby/active" );
}
public async void JoinLobby( ILobby lobby )
{
if ( lobby == null ) return;
// don't exist in two lobbies at once
Game.Menu.Lobby?.Leave();
await lobby.JoinAsync();
this.Navigate( "/lobby/active" );
}
public async void Refresh()
{
await Game.Menu.QueryLobbiesAsync( null, 1 );
StateHasChanged();
}
protected override int BuildHash()
{
return HashCode.Combine( Game.Menu.Lobbies.Count() );
}
}

View File

@@ -0,0 +1,40 @@
@using System;
@using Sandbox;
@using Sandbox.UI;
@inherits Sandbox.UI.NavHostPanel
@implements Sandbox.Menu.IGameMenuPanel
@attribute [StyleSheet]
@namespace LuckerGame.UI.MainMenu
<root style="flex-direction: column;">
<div class="background" />
<div class="navigator-canvas" slot="navigator-canvas" />
</root>
@code
{
public MainMenu()
{
DefaultUrl = "/";
AddDestination( "/", typeof( FrontPage ) );
AddDestination( "/setup", typeof( SetupGame ) );
AddDestination( "/lobby/list", typeof( LobbyBrowser ) );
AddDestination( "/lobby/active", typeof( ActiveLobby ) );
BindClass( "ingame", () => Game.InGame );
}
[GameEvent.Menu.ServerJoined]
public void OnServerJoined() => Navigate( "/" );
[GameEvent.Menu.ServerLeave]
public void OnServerLeave() => Navigate ("/" );
protected override int BuildHash()
{
return HashCode.Combine( Game.InGame, Game.Menu.Lobby, Game.Menu.Lobby?.Map );
}
}

View File

@@ -0,0 +1,195 @@
MainMenu
{
background-color: #262934;
padding: 128px 128px;
opacity: 1;
flex-direction: column;
font-size: 25px;
width: 100%;
height: 100%;
position: absolute;
transition: all 0.3s ease-out;
color: rgba( white, 0.8 );
.background
{
position: absolute;
width: 100%;
height: 100%;
background-image: url( https://files.facepunch.com/tony/1b1311b1/boxes.webm );
opacity: 0.2;
background-size: cover;
filter: blur( 20px );
mask: linear-gradient( 45deg, white, white, black );
mask-scope: filter;
background-repeat: no-repeat;
}
&:intro
{
opacity: 0;
transform: scaleX( 1.1 );
}
&.ingame
{
background-color: #262934ee;
backdrop-filter: blur(10px);
.background
{
opacity: 0;
}
}
.scroll
{
flex-direction: column;
max-height: 386px;
overflow: scroll;
gap: 50px;
}
.spacer
{
height: 1px;
background-image: linear-gradient( to right, rgba( white, 0.4 ), rgba( white, 0 ) );
width: 512px;
margin: 16px 0px;
}
.game-title
{
font-family: Roboto Condensed;
font-weight: 700;
font-size: 70px;
color: rgba( white, 1 );
padding-bottom: 64px;
}
.col
{
flex-direction: column;
gap: 16px;
}
.controls
{
flex-direction: column;
gap: 50px;
align-items: flex-start;
text-transform: uppercase;
a, .button
{
font-family: Roboto;
&:hover
{
color: rgba( white, 1 );
font-weight: 900;
sound-in: ui.button.over;
cursor: pointer;
}
&:active
{
sound-in: ui.button.press;
}
}
.span
{
gap: 128px;
}
}
.navigator-canvas
{
flex-direction: column;
height: 100%;
flex-grow: 1;
flex-shrink: 0;
}
.navigator-body
{
position: absolute;
left: 0;
right: 0;
bottom: 0;
top: 0;
flex-direction: column;
justify-content: center;
transition: opacity 0.15s ease-out;
&.hidden
{
opacity: 0;
}
}
}
FormGroup
{
flex-direction: column;
min-width: 300px;
gap:16px;
}
SlimPackageCard
{
flex-direction: row;
gap: 12px;
align-items: center;
> i
{
&:hover
{
cursor: pointer;
color: white;
transform: scale( 1.1 );
sound-in: ui.button.over;
}
&:active
{
sound-in: ui.button.press;
}
}
}
i
{
font-family: Material Icons;
text-transform: lowercase;
&.with-click
{
&:hover
{
cursor: pointer;
color: white;
transform: scale( 1.1 );
sound-in: ui.button.over;
}
&:active
{
sound-in: ui.button.press;
}
}
}
.avatar
{
width: 64px;
height: 64px;
&:hover
{
border: 1px solid white;
}
}

View File

@@ -0,0 +1,44 @@
@using Sandbox;
@using System;
@using System.Linq;
@using Sandbox.UI;
@namespace LuckerGame.UI.MainMenu
@inherits Panel
<root>
<label class="game-title">
@Game.Menu.Package.Title
</label>
<div class="controls">
@foreach ( var save in Game.Menu.SavedGames.OrderByDescending( x => x.Time ) )
{
<a class="button" @onclick=@(() => LoadSavedGame( save ))>@save.Name - @save.Time</a>
}
<div class="spacer" />
<a class="button" href="/">Return</a>
</div>
</root>
@code
{
async void LoadSavedGame( SavedGame save )
{
if ( save != null )
{
Game.Menu.Lobby.SavedGame = save.Name;
if ( !string.IsNullOrEmpty( save.Map ) )
Game.Menu.Lobby.Map = save.Map;
await Game.Menu.StartServerAsync( Game.Menu.Lobby.MaxMembers, Game.Menu.Lobby.Title, Game.Menu.Lobby.Map ?? "facepunch.square" );
}
}
protected override int BuildHash()
{
return HashCode.Combine( Game.Menu.Lobby, Game.Menu.Lobby?.Map );
}
}

View File

@@ -0,0 +1,78 @@
@using Sandbox;
@using System;
@using System.Linq;
@using System.Threading.Tasks;
@using Sandbox.Menu;
@using Sandbox.UI;
@namespace LuckerGame.UI.MainMenu
@inherits Panel
<root>
<label class="game-title">
@Game.Menu.Package.Title
</label>
<div class="controls">
<div class="span">
@if ( MaxPlayersSupported > 1 )
{
<FormGroup class="form-group">
<Label>Maximum Players</Label>
<Control>
<SliderControl ShowRange=@true Min=@(1f) Max=@MaxPlayersSupported Value:bind=@Game.Menu.Lobby.MaxMembers />
</Control>
</FormGroup>
}
<FormGroup class="form-group">
<Label>Map</Label>
<Control>
<SlimPackageCard OnLaunch=@OnMapClicked Package=@MapPackage />
</Control>
</FormGroup>
</div>
<div class="spacer" />
<a class="button" onclick=@Play>Start</a>
<a class="button" href="/">Return</a>
</div>
</root>
@code
{
int MaxPlayersSupported { get; set; } = 1;
int MaxPlayers { get; set; } = 1;
Package MapPackage { get; set; }
void OnMapClicked()
{
Game.Overlay.ShowPackageSelector( "type:map sort:popular", OnMapSelected );
StateHasChanged();
}
void OnMapSelected( Package map )
{
MapPackage = map;
StateHasChanged();
}
protected override async Task OnParametersSetAsync()
{
MaxPlayersSupported = Game.Menu.Package.GetMeta<int>( "MaxPlayers", 1 );
MaxPlayers = MaxPlayersSupported;
MapPackage = await Package.FetchAsync( "facepunch.square", false );
StateHasChanged();
}
async Task Play()
{
await Game.Menu.StartServerAsync( MaxPlayers, $"My game", MapPackage.FullIdent );
}
protected override int BuildHash()
{
return HashCode.Combine( MaxPlayers, MapPackage );
}
}

View File

@@ -0,0 +1,32 @@
@using System;
@using Sandbox;
@namespace LuckerGame.UI.MainMenu
@inherits Sandbox.UI.Panel
<root>
@if ( Package == null )
{
<div class="button" @onclick=@OnCardClicked>Select Package</div>
}
else
{
<div class="button" @onclick=@OnCardClicked>@Package.Title</div>
<i tooltip="See information about this package" @onclick=@( () => Game.Overlay.ShowPackageModal( Package.FullIdent ) )>info</i>
}
</root>
@code
{
public Package Package { get; set; }
public System.Action OnLaunch { get; set; }
void OnCardClicked()
{
OnLaunch?.Invoke();
}
protected override int BuildHash()
{
return HashCode.Combine( Package );
}
}