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;
}
}