Game/GameManager.cs
using Sandbox;
using Sandbox.Network;

public class GameManager : GameObjectSystem<GameManager>, Component.INetworkListener, ISceneStartup
{
	public GameManager( Scene scene ) : base( scene )
	{
		Listen( Stage.StartUpdate, 6, Update, "Update" );
	}

	void ISceneStartup.OnHostInitialize()
	{
		if ( !Networking.IsActive )
		{
			Networking.CreateLobby( new LobbyConfig()
			{
				MaxPlayers = 4,
				Name = "Be a Stone",
				DestroyWhenHostLeaves = true,
				Privacy = LobbyPrivacy.Public
			} );
		}
	}

	void Component.INetworkListener.OnActive( Connection connection )
	{
		connection.CanSpawnObjects = false;

		SpawnPlayer( connection );
	}

	void Update()
	{
		if ( Application.CheatsEnabled ) return;

		if ( Application.IsEditor ) return;

		foreach ( var player in Scene.GetAllComponents<Player>() )
		{
			player.SessionTime += Time.Delta;
		}
	}

	public void SpawnPlayer( Connection connection )
	{
		Log.Info( $"Player {connection.DisplayName} joined the game" );

		var startpos = FindSpawnLocation();

		var playerObject = GameObject.Clone( "prefabs/player.prefab", startpos, name: $"player {connection.DisplayName}" );

		playerObject.NetworkSpawn( connection );
	}

	public Transform FindSpawnLocation()
	{
		// Not mine. Need to change

		var spawnPoints = Scene.GetAll<SpawnPoint>().ToArray();

		var players = Scene.GetAll<Player>().ToArray();

		SpawnPoint spawnPointFurthestAway = null;
		float spawnPointFurthestAwayDistanceSqr = float.MinValue;

		foreach ( var spawnPoint in spawnPoints )
		{
			float closestPlayerDistanceToSpawnpointSqr = float.MaxValue;

			foreach ( var player in players )
			{
				float playerDistanceToSpawnPointSqr = (spawnPoint.Transform.World.Position - player.Transform.World.Position).LengthSquared;

				if ( playerDistanceToSpawnPointSqr < closestPlayerDistanceToSpawnpointSqr )
				{
					closestPlayerDistanceToSpawnpointSqr = playerDistanceToSpawnPointSqr;
				}
			}

			if ( closestPlayerDistanceToSpawnpointSqr > spawnPointFurthestAwayDistanceSqr )
			{
				spawnPointFurthestAwayDistanceSqr = closestPlayerDistanceToSpawnpointSqr;
				spawnPointFurthestAway = spawnPoint;
			}
		}

		return spawnPointFurthestAway.Transform.World;
	}
}