SkateGame.cs
using System;
using System.Threading.Tasks;

namespace Skateboard;

public sealed class SkateGame : Component, Component.INetworkListener
{
	public static SkateGame Instance { get; private set; }

	[Property] public List<SteamId> Devs { get; set; }

	[ConVar( ConVarFlags.Replicated )] public static bool skate_debug { get; set; } = false;

	[Property] public bool StartServer { get; set; } = true;
	[Property] public GameObject PlayerPrefab { get; set; }
	[Property] public List<GameObject> SpawnPoints { get; set; }

	protected override void OnAwake()
	{
		Instance = this;
	}

	protected override async Task OnLoad()
	{
		if ( Scene.IsEditor )
			return;

		if ( StartServer && !Networking.IsActive )
		{
			LoadingScreen.Title = "Creating Lobby";
			await Task.DelayRealtimeSeconds( 0.1f );
			Networking.CreateLobby( new() );
		}
	}

	public void OnActive( Connection channel )
	{
		if ( !PlayerPrefab.IsValid() )
			return;

		var startLocation = FindSpawnLocation().WithScale( 1 );
		var player = PlayerPrefab.Clone( startLocation, name: $"Player - {channel.DisplayName}" );
		player.NetworkSpawn( enabled: true, owner: channel );

		var pawn = player.Components.Get<Skateboard.Player.SkatePawn>();
		if ( pawn.IsValid() )
			pawn.OwningConnectionId = channel.Id;
	}

	private Transform FindSpawnLocation()
	{
		if ( SpawnPoints is not null && SpawnPoints.Count > 0 )
		{
			return Random.Shared.FromList( SpawnPoints, default ).WorldTransform;
		}

		var spawnPoints = Scene.GetAllComponents<SpawnPoint>().ToArray();
		if ( spawnPoints.Length > 0 )
		{
			return Random.Shared.FromArray( spawnPoints ).WorldTransform;
		}

		return WorldTransform;
	}

	[ConCmd( "get_all_maps" )]
	public async static void GetAllMaps()
	{
		var maps = await Package.FindAsync( "type:map" );
		foreach ( var map in maps.Packages )
		{
			var supported = map.GetMeta( "GameSupport", "" );
			var parent = map.GetMeta( "ParentPackage", "" );


			if ( supported == null || !supported.Contains( "thieves.skateboard" ) || parent == null )
				continue;

			Log.Info( $"Parent: {parent}" );

			Log.Info( $"Map: {map.Title} - {map.FullIdent}" );
		}
	}
}