Ui/PlayerSelect.razor
@using System
@using System.Text.Json
@using Clover.Components
@using Clover.Data
@using Clover.Persistence
@using Clover.Player
@using Clover.Player.Clover
@using Sandbox;
@using Sandbox.Network
@using Sandbox.UI;
@using GameManager = Clover.GameManager
@inherits Panel
@namespace Clover.Ui
<root>
<h1>Player Select</h1>
@if ( Players.Any() )
{
@foreach ( var player in Players )
{
<div class="player">
<h2>@player.Name</h2>
<span>@($"{player.InventorySlots.Count()} items")</span>
<button class="clover-button small" @onclick=@( () => LoadPlayer( player ) )>Select</button>
</div>
}
} else {
<div>No players found</div>
}
<div class="new-player">
<TextEntry class="text-input" Value:bind=@_playerName />
<button class="clover-button small" @onclick=@CreatePlayer>Create</button>
</div>
</root>
@code {
private List<PlayerSaveData> Players = new();
private string _playerName = "";
protected override void OnAfterTreeRender( bool firstTime )
{
base.OnAfterTreeRender( firstTime );
if ( firstTime )
{
LoadPlayers();
}
}
protected override void OnParametersSet()
{
base.OnParametersSet();
LoadPlayers();
}
public override void OnParentChanged()
{
base.OnParentChanged();
LoadPlayers();
}
private void LoadPlayers()
{
Players.Clear();
FileSystem.Data.CreateDirectory( "players" );
var files = FileSystem.Data.FindFile( "players", "*.json" );
foreach ( var file in files )
{
var path = $"players/{file}";
var data = JsonSerializer.Deserialize<PlayerSaveData>( FileSystem.Data.ReadAllText( path ), GameManager.JsonOptions );
Log.Info( $"Loaded player {data.Name} from {path}" );
Players.Add( data );
}
Players.Sort( ( a, b ) => String.Compare( a.Name, b.Name, StringComparison.Ordinal ) );
Log.Info( $"Loaded {Players.Count} players" );
}
private async void LoadPlayer( PlayerSaveData player )
{
Log.Info( $"Loading player {player.Name}" );
PlayerCharacter.SpawnPlayerId = player.PlayerId;
await Fader.Instance.FadeToBlack();
GameManager.Instance.RequestSpawn( player.PlayerId );
}
private void CreatePlayer()
{
if ( string.IsNullOrWhiteSpace( _playerName ) )
return;
var player = new PlayerSaveData()
{
Name = _playerName,
Clovers = CloverBalanceController.StartingClovers,
Created = DateTime.Now,
PlayerId = Guid.NewGuid().ToString()
};
FileSystem.Data.CreateDirectory( "players" );
var path = $"players/{player.PlayerId}.json";
FileSystem.Data.WriteAllText( path, JsonSerializer.Serialize( player, GameManager.JsonOptions ) );
Log.Info( $"Created player {player.Name} at {path}" );
LoadPlayers();
_playerName = "";
}
}