Table of Contents

Data Synchronization

Use lobby-wide and per-player key-value data for lightweight shared state like versions, flags, and small strings.

Lobby-wide data (host-only)

// Set by the lobby owner
client.SetLobbyData("mod_version", "1.0.0");

// Read by anyone
string modVersion = client.GetLobbyData("mod_version");

Per-player data

// Local player sets their visible data
client.SetMyData("name", "bob");

// Read for self
string myClass = client.GetMyData("name");

// Read for any specific player
string otherClass = client.GetPlayerData(playerId, "name");

// Read the same key for everyone
Dictionary<CSteamID, string> allClasses = client.GetDataForAllPlayers("name");

Change events

client.OnLobbyDataChanged += (s, e) =>
{
    MelonLogger.Msg($"Lobby data: {e.Key} -> {e.NewValue}");
};

client.OnMemberDataChanged += (s, e) =>
{
    MelonLogger.Msg($"Member {e.MemberId}: {e.Key} -> {e.NewValue}");
};

Version compatibility helper

Version checks are enabled by default. The client stores its library version under a reserved key and triggers OnVersionMismatch when players differ.

client.OnVersionMismatch += (s, e) =>
{
    MelonLogger.Warning($"Version mismatch. Local: {e.LocalVersion}");
};

// Optional: toggle
client.VersionCheckEnabled = true;

// Manual check
bool ok = client.CheckLibraryVersionCompatibility();

Batch updates

client.SetMyDataBatch(new Dictionary<string, string>
{
    ["loadout"] = "1911",
    ["ready"] = "true",
});

When to use P2P instead

  • Use data keys for small strings/flags.
  • For large payloads (files, images, audio), use the P2P Messaging API.