A Razor UI component for the game's main menu HUD. It renders submenu pages (Main, Lobby, Load, Settings), shows lobby options and lists, lets the player change lobby privacy, bot count and map size, refresh lobbies, start a lobby (creates lobby and loads a scene), and disconnect the game.
@using System;
@using Forp.Game
@using Sandbox.Network
@inherits PanelComponent
<root>
<watermark>Forp Infdev @(DateTime.Now.ToShortDateString())</watermark>
<menu-container>
@if (SubMenu == ESubMenu.Main)
{
<menu-button class="play" @onclick=@(() => SubMenu = ESubMenu.Lobby)>
Play
</menu-button>
<menu-button class="load" @onclick=@(() => SubMenu = ESubMenu.Load)>
Load
</menu-button>
<menu-button class="settings" @onclick=@(() => SubMenu = ESubMenu.Settings)>
Settings
</menu-button>
<menu-button class="quit" @onclick=@(() => Game.Disconnect())>
Quit
</menu-button>
}
@if (SubMenu == ESubMenu.Lobby)
{
<menu-rows>
privacy
<div class="option-row">
@foreach (LobbyPrivacy NetworkMode in Enum.GetValues(typeof(LobbyPrivacy)))
{
<menu-button class="@(LobbyPrivacy == NetworkMode ? "modesselected" : "modes")" @onclick="@(() => LobbyPrivacy = NetworkMode)">
@NetworkMode
</menu-button>
}
</div>
bots
<div class="option-row">
@foreach (EBotNumber BotNumberIn in Enum.GetValues(typeof(EBotNumber)))
{
<menu-button class="@(BotNumber == BotNumberIn ? "modesselected" : "modes")" @onclick="@(() => BotNumber = BotNumberIn)">
@BotNumberIn
</menu-button>
}
</div>
map
<div class="option-row">
@foreach (EMapSize MapSizeIn in Enum.GetValues(typeof(EMapSize)))
{
<menu-button class="@(MapSize == MapSizeIn ? "modesselected" : "modes")" @onclick="@(() => MapSize = MapSizeIn)">
@MapSizeIn
</menu-button>
}
</div>
</menu-rows>
<menu-button class="quit" @onclick="@(() => SubMenu = ESubMenu.Main)">
Back
</menu-button>
<menu-button class="go" @onclick="@(() => OnStartClick())">
Start
</menu-button>
<menu-button class="refresh" @onclick="@(() => RefreshLobbies())">
Refresh
</menu-button>
<lobby-rows>
@foreach (LobbyInformation Lobby in Lobbies)
{
<menu-button class="lobby-row">
@Lobby.LobbyId @Lobby.Name @Lobby.Ping ping
</menu-button>
}
</lobby-rows>
}
@if (SubMenu == ESubMenu.Load)
{
<menu-row>
@foreach (LobbyPrivacy NetworkMode in Enum.GetValues(typeof(LobbyPrivacy)))
{
<menu-button class="@(LobbyPrivacy == NetworkMode ? "modesselected" : "modes")" @onclick="@(() => LobbyPrivacy = NetworkMode)">
a save to load
</menu-button>
}
</menu-row>
<menu-button class="go" @onclick="@(() => OnStartClick())">
Start
</menu-button>
<menu-button class="quit" @onclick="@(() => SubMenu = ESubMenu.Main)">
Back
</menu-button>
}
@if (SubMenu == ESubMenu.Settings)
{
<menu-row>
@foreach (LobbyPrivacy NetworkMode in Enum.GetValues(typeof(LobbyPrivacy)))
{
<menu-button class="@(LobbyPrivacy == NetworkMode ? "modesselected" : "modes")" @onclick="@(() => LobbyPrivacy = NetworkMode)">
a setting
</menu-button>
}
</menu-row>
<menu-button class="quit" @onclick="@(() => SubMenu = ESubMenu.Main)">
Back
</menu-button>
}
</menu-container>
</root>
@code
{
public enum ESubMenu
{
Main,
Lobby,
Load,
Settings,
}
public enum EBotNumber
{
None = 0,
One = 1,
Two = 2,
Three = 3,
Four = 4,
}
public enum EMapSize
{
Tiny,
Small,
Medium,
Large
}
private List<LobbyInformation> Lobbies = new();
protected async void RefreshLobbies()
{
Lobbies = await Networking.QueryLobbies();
}
protected void OnStartClick()
{
GameManager.CreateLobby($"epic lobby number {Game.SteamId}", LobbyPrivacy);
Game.ActiveScene.LoadFromFile("scenes/minimal.scene");
}
protected override int BuildHash()
{
return HashCode.Combine(Time.Now);
}
public static LobbyPrivacy LobbyPrivacy = LobbyPrivacy.FriendsOnly;
public static ESubMenu SubMenu = ESubMenu.Main;
public static EBotNumber BotNumber = EBotNumber.None;
public static EMapSize MapSize = EMapSize.Medium;
protected override void OnEnabled()
{
base.OnEnabled();
Mouse.Visibility = MouseVisibility.Visible;
}
protected override void OnUpdate()
{
base.OnUpdate();
}
}