manager/Manager.Lobby.cs

Lobby-related methods for the Manager class. Calculates per-player lobby offsets, finds a player's index in the scene, and handles RPCs for kicking a player and requesting a lobby slot which spawns a player for the caller.

Networking
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using Sandbox;
using Sandbox.Diagnostics;

public partial class Manager
{
	public Vector3 GetLobbyOffset( Player player )
	{
		int playerNum = GetPlayerNum( player );

		switch (playerNum)
		{
			case 0: default: return Vector3.Zero;
			case 1: return new Vector3( 14f, -30f, 0f );
			case 2: return new Vector3( 17f, 30f, 0f );
		}
	}

	public static int GetPlayerNum( Player player )
	{
		int num = 0;
		foreach ( var p in Manager.Instance.Scene.GetAll<Player>() )
		{
			if(player == p)
				return num;

			num++;
		}

		return num;
	}

	[Rpc.Host]
	public void RequestKickPlayer(long steamId)
	{
		var caller = Rpc.Caller;
		var player = Scene.GetAllComponents<Player>().FirstOrDefault(x => x.Network.Owner.SteamId == steamId);
		if ( !player.IsValid() )
			return;

		player.GameObject?.Destroy();
	}

	[Rpc.Host]
	public void RequestLobbySlot( int index )
	{
		var slot = Scene.GetAllComponents<LobbyPlayerSlot>().FirstOrDefault( x => x.SlotIndex == index );
		if ( !slot.IsValid() )
			return;

		var caller = Rpc.Caller;
		var existingPlayer = Scene.GetAllComponents<Player>().FirstOrDefault( x => x.Network.OwnerId == caller.Id );
		if ( existingPlayer.IsValid() )
			return;

		SpawnPlayer( caller, index );
	}
}