ui/Lobby.razor
@using System
@using System.Collections.Generic
@using System.Linq
@using System.Threading.Tasks
@using Sandbox;
@using Sandbox.Network
@inherits PanelComponent
@namespace Facepunch.BombRoyale
<root>
<div class="center">
<div class="left">
<div class="title">
💣 Bomb Royale
</div>
<div class="explanation">
<p>
Survive the longest without getting blown up.
</p>
</div>
<div class="button-list">
<div class="button" onclick=@CreateLobby>
Create Lobby
</div>
<div class="button" onclick=@Quit>
Quit
</div>
</div>
</div>
<div class="lobby-list">
<div class="header">
<div class="title">Lobbies</div>
</div>
@if ( IsRefreshing )
{
<label>Refreshing the lobby list, please wait...</label>
}
else if ( List.Count == 0 )
{
<label>No lobbies were found, create one to play.</label>
}
else
{
<div class="button-list">
@foreach ( var lobby in List )
{
if ( lobby.Members >= 4 ) continue;
<div class="button" onclick=@( () => OpenLobby( lobby ) )>
<div class="title">
@lobby.Name
</div>
<div class="meta">
<div class="map">
Bomb Royale
</div>
<div class="count">
@lobby.Members / @lobby.MaxMembers
</div>
</div>
</div>
}
</div>
}
</div>
</div>
</root>
@code
{
private TimeSince TimeSinceLastConnect { get; set; }
private bool IsRefreshing { get; set; }
private List<LobbyInformation> List { get; set; } = [];
protected override void OnFixedUpdate()
{
}
protected override void OnEnabled()
{
base.OnEnabled();
_ = RefreshLobbyList();
}
protected override void OnUpdate()
{
}
protected override int BuildHash() => HashCode.Combine( RealTime.Now );
private async Task RefreshLobbyList()
{
while ( true )
{
IsRefreshing = true;
StateHasChanged();
List = await Networking.QueryLobbies();
IsRefreshing = false;
StateHasChanged();
await Task.DelayRealtimeSeconds( 5f );
}
}
private void OpenLobby( LobbyInformation lobby )
{
if ( TimeSinceLastConnect < 3f ) return;
if ( lobby.Members >= 4 ) return;
Networking.Connect( lobby.LobbyId );
TimeSinceLastConnect = 0f;
}
private void CreateLobby()
{
Game.ActiveScene.LoadFromFile( "scenes/arena.scene" );
}
private void Quit()
{
Game.Close();
}
}