S&box Wiki

Using Lobbies

What are lobbies?

Imagine a lobby like a chat room. You can get a group of players in one and they can chat to each other. When lobbies have no players in them, they die.

The Owner

Lobbies always have an owner. It's usually the first person to enter the lobby. When the owner leaves, ownership is handed down to someone else.

The owner can control aspects of the lobby, such as the lobby data.


Members of lobbies have network connections, just like being attached to a server. You can send a network message to anyone in the lobby, and they can send a message to you.

This uses Steam's Game Network Sockets library, which breaks through your firewall and completely hides your IP address from other players. Messages are sent to your Steam Id - not your IP address.

Despite that, it's super fast and super reliable. This is the exact same network system that the main game uses.

Joining a Lobby

// get lobbies var lobbies = await Game.Menu.QueryLobbiesAsync(); // get the most full var lobby = lobbies.OrderByDescending( x => x.MemberCount ).FirstOrDefault(); // join it await lobby.JoinAsync();

Creating a Lobby

var lobby = await Game.Menu.CreateLobbyAsync( maxPlayers ); lobby.Name = "My Stupid Lobby!";

Leaving a Lobby


Getting players in a lobby

foreach( Friend f in lobby.Members ) { Log.Info( $"{f.Name} is in the lobby!" ); }

Sending Chat

lobby.SendChat( "My Chat Message" );

Receiving Chat

lobby.OnChatMessage = OnChatMessage; void OnChatMessage( Friend friend, string message ) { Log.Warning( $"{friend.Name}: {message}" ); }

Sending Network Message

// create a data message var data = ByteStream.Create( 256 ); data.Write( 32 ); data.Write( "Kill" ); data.Write( new Vector3( 1, 2, 3 ) ); // send to everyone in the lobby Lobby.BroadcastMessage( data );

Receiving Network Message

// read messages using this method Lobby.ReceiveMessages( OnNetworkMessage ); void OnNetworkMessage( ILobby.NetworkMessage msg ) { // source is the Friend that has sent the message Log.Info( $"Mesage from {msg.Source.Name}"); // raw byte data ByteStream data = msg.Data; var messageId = data.Read<int>(); if ( messageId == 32 ) { string action = data.Read<string>(); Vector3 location = data.Read<Vector3>(); DoSomething( action, location ); } }