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.
Networking
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
var lobbies = await Game.Menu.QueryLobbiesAsync();
var lobby = lobbies.OrderByDescending( x => x.MemberCount ).FirstOrDefault();
await lobby.JoinAsync();
Creating a Lobby
var lobby = await Game.Menu.CreateLobbyAsync( maxPlayers );
lobby.Name = "My Stupid Lobby!";
Leaving a Lobby
lobby.Leave();
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
var data = ByteStream.Create( 256 );
data.Write( 32 );
data.Write( "Kill" );
data.Write( new Vector3( 1, 2, 3 ) );
Lobby.BroadcastMessage( data );
Receiving Network Message
Lobby.ReceiveMessages( OnNetworkMessage );
void OnNetworkMessage( ILobby.NetworkMessage msg )
{
Log.Info( $"Mesage from {msg.Source.Name}");
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 );
}
}