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