GamePlay/MapPlayerSpawns.cs
using Sandbox;
using System;
using System.Linq;
public sealed class MapPlayerSpawns : Component
{
protected override void OnEnabled()
{
base.OnEnabled();
if ( Components.TryGet<MapInstance>( out var mapInstance ) )
{
mapInstance.OnMapLoaded += RespawnPlayers;
// already loaded
if ( mapInstance.IsLoaded )
{
RespawnPlayers();
}
}
}
protected override void OnDisabled()
{
if ( Components.TryGet<MapInstance>( out var mapInstance ) )
{
mapInstance.OnMapLoaded -= RespawnPlayers;
}
}
void RespawnPlayers()
{
var spawnPoints = Scene.GetAllComponents<SpawnPoint>().ToArray();
foreach ( var player in Scene.GetAllComponents<PlayerController>().ToArray() )
{
if ( player.IsProxy )
continue;
var randomSpawnPoint = Random.Shared.FromArray( spawnPoints );
if ( randomSpawnPoint is null ) continue;
player.WorldPosition = randomSpawnPoint.WorldPosition;
if ( player.Components.TryGet<PlayerController>( out var pc ) )
{
pc.EyeAngles = randomSpawnPoint.WorldRotation.Angles();
}
}
}
}