feature/Lucker-misc_RoundFramework #2
15
.sbproj
15
.sbproj
@@ -37,7 +37,20 @@
|
|||||||
"GameSettings": {},
|
"GameSettings": {},
|
||||||
"Addons": "",
|
"Addons": "",
|
||||||
"PreLaunchCommand": "",
|
"PreLaunchCommand": "",
|
||||||
"PostLaunchCommand": ""
|
"PostLaunchCommand": "lucker_minigames_per_round 1"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"PackageSettings": [
|
||||||
|
{
|
||||||
|
"DisplayType": "Integer",
|
||||||
|
"Choices": [],
|
||||||
|
"ConVarName": "lucker_minigames_per_round",
|
||||||
|
"DisplayName": "Minigames Per Round",
|
||||||
|
"DefaultValue": "0",
|
||||||
|
"Description": "The number of minigames played per round",
|
||||||
|
"Group": "Other",
|
||||||
|
|
|||||||
|
"Minimum": 1,
|
||||||
|
"Maximum": 12
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,8 +57,16 @@ public partial class MinigameManager : Entity
|
|||||||
FindMinigames();
|
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 =>
|
InvolvedPlayers.ForEach( player =>
|
||||||
{
|
{
|
||||||
player.Pawn.Delete();
|
player.Pawn.Delete();
|
||||||
|
|||||||
@@ -49,7 +49,8 @@ public partial class RoundManager : Entity
|
|||||||
|
|
||||||
private const int MinigamesPerRound = 1;
|
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; }
|
private List<Lucker> Players { get; set; }
|
||||||
#endregion
|
#endregion
|
||||||
|
|||||||
121
code/UI/MainMenu/ActiveLobby.razor
Normal file
121
code/UI/MainMenu/ActiveLobby.razor
Normal 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 );
|
||||||
|
}
|
||||||
|
}
|
||||||
40
code/UI/MainMenu/FrontPage.razor
Normal file
40
code/UI/MainMenu/FrontPage.razor
Normal 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" );
|
||||||
|
}
|
||||||
|
}
|
||||||
31
code/UI/MainMenu/LoadingScreen.razor
Normal file
31
code/UI/MainMenu/LoadingScreen.razor
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
50
code/UI/MainMenu/LoadingScreen.razor.scss
Normal file
50
code/UI/MainMenu/LoadingScreen.razor.scss
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
66
code/UI/MainMenu/LobbyBrowser.razor
Normal file
66
code/UI/MainMenu/LobbyBrowser.razor
Normal 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() );
|
||||||
|
}
|
||||||
|
}
|
||||||
40
code/UI/MainMenu/MainMenu.razor
Normal file
40
code/UI/MainMenu/MainMenu.razor
Normal 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 );
|
||||||
|
}
|
||||||
|
}
|
||||||
195
code/UI/MainMenu/MainMenu.razor.scss
Normal file
195
code/UI/MainMenu/MainMenu.razor.scss
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
44
code/UI/MainMenu/SavedGames.razor
Normal file
44
code/UI/MainMenu/SavedGames.razor
Normal 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 );
|
||||||
|
}
|
||||||
|
}
|
||||||
78
code/UI/MainMenu/SetupGame.razor
Normal file
78
code/UI/MainMenu/SetupGame.razor
Normal 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 );
|
||||||
|
}
|
||||||
|
}
|
||||||
32
code/UI/MainMenu/SlimPackageCard.razor
Normal file
32
code/UI/MainMenu/SlimPackageCard.razor
Normal 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 );
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user
Why is minimum 1 but default is 0?
Also why can't I comment on multiple lines in Gitea? LAME
Should now be fixed, looks like something weird with S&box convars and setting them via GUI