Table of Contents

Events and Error Handling

Understand the event model and exceptions to build resilient networking code.

Client events

client.OnLobbyCreated += (s, e) => { /* e.Lobby */ };
client.OnLobbyJoined  += (s, e) => { /* e.Lobby */ };
client.OnLobbyLeft    += (s, e) => { /* e.LobbyId, e.Reason */ };
client.OnMemberJoined += (s, e) => { /* e.Member */ };
client.OnMemberLeft   += (s, e) => { /* e.Member, e.Reason */ };

client.OnLobbyDataChanged  += (s, e) => { /* e.Key, e.OldValue, e.NewValue, e.ChangedBy */ };
client.OnMemberDataChanged += (s, e) => { /* e.MemberId, e.Key, e.OldValue, e.NewValue */ };

client.OnP2PMessageReceived += (s, e) =>
{
    // e.Message (P2PMessage), e.SenderId, e.Channel
};

client.OnVersionMismatch += (s, e) =>
{
    // e.LocalVersion, e.PlayerVersions, e.IncompatiblePlayers
};

Advanced P2P events exist on SteamP2PManager (packet-level and session events) if you need low-level control.

Exceptions

  • SteamNetworkException: Base exception for library errors.
  • LobbyException: Lobby-specific failures (creation, join, invalid IDs).
  • P2PException: P2P send/receive/session issues (target, channel, session error).
try
{
    var lobby = await client.CreateLobbyAsync();
}
catch (LobbyException ex)
{
    MelonLogger.Error($"Lobby error: {ex.Message}");
}
catch (SteamNetworkException ex)
{
    MelonLogger.Error($"Steam error: {ex.Message}");
}

IL2CPP specifics

client.ProcessIncomingMessages() internally calls SteamAPI.RunCallbacks() on IL2CPP, which is required to drive Steam callbacks. Ensure you call it every frame (e.g., OnUpdate).