Esempio n. 1
0
 void OnLobbyUpdate(LobbyChatUpdate_t cb)
 {
     if ((EChatMemberStateChange)cb.m_rgfChatMemberStateChange != EChatMemberStateChange.k_EChatMemberStateChangeEntered && cb.m_ulSteamIDUserChanged == handler.Identity.NetworkId)
     {
         Destroy(this.gameObject);
     }
 }
 public void LobbyChatUpdated(LobbyChatUpdate_t update)
 {
     try {
         EChatMemberStateChange change = (EChatMemberStateChange)update.m_rgfChatMemberStateChange;
         if (change == EChatMemberStateChange.k_EChatMemberStateChangeEntered)
         {
             MultiplayerChat.AddChat(string.Format("User {0} joined the game!", SteamFriends.GetFriendPersonaName(new CSteamID(update.m_ulSteamIDUserChanged))));
             if (!connectedPlayers.Contains(update.m_ulSteamIDUserChanged))
             {
                 PlayerJoinedManagers(update.m_ulSteamIDUserChanged);
                 connectedPlayers.Add(update.m_ulSteamIDUserChanged);
             }
             if (update.m_ulSteamIDUserChanged != SteamUser.GetSteamID().m_SteamID)
             {
                 otherPlayers.Add(update.m_ulSteamIDUserChanged);
             }
         }
         else if (change == EChatMemberStateChange.k_EChatMemberStateChangeLeft || change == EChatMemberStateChange.k_EChatMemberStateChangeKicked || change == EChatMemberStateChange.k_EChatMemberStateChangeDisconnected)
         {
             MultiplayerChat.AddChat(string.Format("User {0} left the game!", SteamFriends.GetFriendPersonaName(new CSteamID(update.m_ulSteamIDUserChanged))));
             PlayerLeftManagers(update.m_ulSteamIDUserChanged);
             connectedPlayers.Remove(update.m_ulSteamIDUserChanged);
             MultiplayerPlayerList.RemovePlayerLabel(update.m_ulSteamIDUserChanged);
             if (update.m_ulSteamIDUserChanged != SteamUser.GetSteamID().m_SteamID)
             {
                 otherPlayers.Remove(update.m_ulSteamIDUserChanged);
             }
         }
     } catch (System.Exception e) {
         Debug.LogError(e);
     }
 }
Esempio n. 3
0
 void UpdateUsers(LobbyChatUpdate_t cb)
 {
     if ((EChatMemberStateChange)cb.m_rgfChatMemberStateChange == EChatMemberStateChange.k_EChatMemberStateChangeEntered)
     {
         if (lobby.GetUserFromID((CSteamID)cb.m_ulSteamIDUserChanged) == null)
         {
             Users.Add(new User((CSteamID)cb.m_ulSteamIDUserChanged));
             if (OnUserEnter)
             {
                 OnUserEnter.Raise((CSteamID)cb.m_ulSteamIDUserChanged);
             }
         }
     }
     else if ((EChatMemberStateChange)cb.m_rgfChatMemberStateChange == EChatMemberStateChange.k_EChatMemberStateChangeLeft || (EChatMemberStateChange)cb.m_rgfChatMemberStateChange == EChatMemberStateChange.k_EChatMemberStateChangeDisconnected)
     {
         for (int i = 0; i < Users.Count; i++)
         {
             if (Users[i].SteamID == (CSteamID)cb.m_ulSteamIDUserChanged)
             {
                 Users.Remove(Users[i]);
                 if (OnUserLeave)
                 {
                     OnUserLeave.Raise((CSteamID)cb.m_ulSteamIDUserChanged);
                 }
                 return;
             }
         }
     }
 }
Esempio n. 4
0
        public void OnChatUpdate(LobbyChatUpdate_t pCallback)
        {
            if (SteamMatches.s_OnChatUpdate != null)
            {
                int ChatMemberStateChange = 0;
                var state = pCallback.m_rgfChatMemberStateChange;
                if ((state & (uint)EChatMemberStateChange.k_EChatMemberStateChangeBanned) != 0)
                {
                    ChatMemberStateChange = SteamMatches.ChatMember_Banned;
                }
                else if ((state & (uint)EChatMemberStateChange.k_EChatMemberStateChangeDisconnected) != 0)
                {
                    ChatMemberStateChange = SteamMatches.ChatMember_Disconnected;
                }
                else if ((state & (uint)EChatMemberStateChange.k_EChatMemberStateChangeEntered) != 0)
                {
                    ChatMemberStateChange = SteamMatches.ChatMember_Entered;
                }
                else if ((state & (uint)EChatMemberStateChange.k_EChatMemberStateChangeKicked) != 0)
                {
                    ChatMemberStateChange = SteamMatches.ChatMember_Kicked;
                }
                else if ((state & (uint)EChatMemberStateChange.k_EChatMemberStateChangeLeft) != 0)
                {
                    ChatMemberStateChange = SteamMatches.ChatMember_Left;
                }

                SteamMatches.s_OnChatUpdate.Invoke(ChatMemberStateChange, pCallback.m_ulSteamIDUserChanged);
            }
        }
 private void OnLobbyChatUpdate(LobbyChatUpdate_t pCallback)
 {
     if (DebugTextOn)
     {
         Debug.Log("[" + LobbyChatUpdate_t.k_iCallback + " - LobbyChatUpdate] - " + pCallback.m_ulSteamIDLobby + " -- " + pCallback.m_ulSteamIDUserChanged + " -- " + pCallback.m_ulSteamIDMakingChange + " -- " + pCallback.m_rgfChatMemberStateChange);
     }
 }
        /// <summary>
        ///     Called when a player joins or leaves the lobby.
        /// </summary>
        /// <param name="pCallback"></param>
        private void OnLobbyUpdated(LobbyChatUpdate_t pCallback)
        {
            var state = (EChatMemberStateChange)pCallback.m_rgfChatMemberStateChange;

            if (NetLogFilter.logInfo)
            {
                Debug.Log($"Lobby updated by {pCallback.m_ulSteamIDUserChanged}. ({Time.time})");
            }
            switch (state)
            {
            case EChatMemberStateChange.k_EChatMemberStateChangeEntered:
                OnPeerConnected(new CSteamID(pCallback.m_ulSteamIDUserChanged), new CSteamID(pCallback.m_ulSteamIDLobby));
                break;

            case EChatMemberStateChange.k_EChatMemberStateChangeLeft:
                OnPeerDisconnected(new CSteamID(pCallback.m_ulSteamIDUserChanged), new CSteamID(pCallback.m_ulSteamIDLobby));
                break;

            case EChatMemberStateChange.k_EChatMemberStateChangeDisconnected:
                OnPeerDisconnected(new CSteamID(pCallback.m_ulSteamIDUserChanged), new CSteamID(pCallback.m_ulSteamIDLobby));
                break;

            case EChatMemberStateChange.k_EChatMemberStateChangeKicked:
                break;

            case EChatMemberStateChange.k_EChatMemberStateChangeBanned:
                break;
            }
        }
    // NOTIFY PLAYERS OF LOBBY ACTIVITY
    private void OnLobbyChatUpdate(LobbyChatUpdate_t update)
    {
        chatBox.AddText("\n" + SteamFriends.GetFriendPersonaName((CSteamID)update.m_ulSteamIDUserChanged) + " made a change in the lobby. Change: " + update.m_rgfChatMemberStateChange);

        // Set global value
        global.player2 = (CSteamID)update.m_ulSteamIDMakingChange;
    }
Esempio n. 8
0
        public static void OnLobbyChatUpdate(LobbyChatUpdate_t pCallback)
        {
            switch ((uint)pCallback.m_rgfChatMemberStateChange)
            {
            case (uint)EChatMemberStateChange.k_EChatMemberStateChangeEntered:
                Logger.Debug($"{pCallback.m_ulSteamIDMakingChange} has joined the lobby");
                SteamAPI.PlayerConnected();
                break;

            case (uint)EChatMemberStateChange.k_EChatMemberStateChangeDisconnected:
            case (uint)EChatMemberStateChange.k_EChatMemberStateChangeLeft:
                Logger.Debug($"{pCallback.m_ulSteamIDMakingChange} has left the lobby");
                SteamAPI.DisconnectPlayer(pCallback.m_ulSteamIDMakingChange);
                break;

            case (uint)EChatMemberStateChange.k_EChatMemberStateChangeBanned:
                Logger.Debug($"{pCallback.m_ulSteamIDMakingChange} banned {pCallback.m_ulSteamIDUserChanged} from the lobby");
                SteamAPI.DisconnectPlayer(pCallback.m_ulSteamIDUserChanged);
                break;

            case (uint)EChatMemberStateChange.k_EChatMemberStateChangeKicked:
                Logger.Debug($"{pCallback.m_ulSteamIDMakingChange} kicked {pCallback.m_ulSteamIDUserChanged} from the lobby");
                SteamAPI.DisconnectPlayer(pCallback.m_ulSteamIDUserChanged);
                break;
            }
        }
Esempio n. 9
0
    void OnLobbyChatUpdate(LobbyChatUpdate_t pCallback)
    {
        CSteamID changed = new CSteamID(pCallback.m_ulSteamIDUserChanged);

        if (pCallback.m_rgfChatMemberStateChange == (uint)EChatMemberStateChange.k_EChatMemberStateChangeEntered && pCallback.m_ulSteamIDLobby == steamLobbyId.m_SteamID)
        {
            if (OnPlayerJoin != null)
            {
                OnPlayerJoin(changed);
            }
        }
        else if (pCallback.m_rgfChatMemberStateChange == (uint)EChatMemberStateChange.k_EChatMemberStateChangeLeft && pCallback.m_ulSteamIDLobby == steamLobbyId.m_SteamID)
        {
            if (OnPlayerLeave != null)
            {
                OnPlayerLeave(changed);
            }

            // user left lobby
            if (UNETServerController.IsHostingServer())
            {
                UNETServerController.RemoveConnection(changed);
            }

            SteamNetworking.CloseP2PSessionWithUser(changed);
        }
    }
        public void LobbyChatUpdated(LobbyChatUpdate_t update)
        {
            try {
                EChatMemberStateChange change = (EChatMemberStateChange)update.m_rgfChatMemberStateChange;
                if (change == EChatMemberStateChange.k_EChatMemberStateChangeEntered)
                {
                    MultiplayerChat.AddChat(string.Format("User {0} joined the game!", SteamFriends.GetFriendPersonaName(new CSteamID(update.m_ulSteamIDUserChanged))));
                    Log(string.Format("User {0} joined the game!", SteamFriends.GetFriendPersonaName(new CSteamID(update.m_ulSteamIDUserChanged))));

                    if (!connectedPlayers.Contains(update.m_ulSteamIDUserChanged))
                    {
                        PlayerJoinedManagers(update.m_ulSteamIDUserChanged);
                        connectedPlayers.Add(update.m_ulSteamIDUserChanged);
                    }
                    if (update.m_ulSteamIDUserChanged != SteamUser.GetSteamID().m_SteamID)
                    {
                        otherPlayers.Add(update.m_ulSteamIDUserChanged);
                    }
                }
                else if (change == EChatMemberStateChange.k_EChatMemberStateChangeLeft || change == EChatMemberStateChange.k_EChatMemberStateChangeKicked || change == EChatMemberStateChange.k_EChatMemberStateChangeDisconnected)
                {
                    MultiplayerChat.AddChat(string.Format("User {0} left the game!", SteamFriends.GetFriendPersonaName(new CSteamID(update.m_ulSteamIDUserChanged))));
                    Log(string.Format("User {0} left the game!", SteamFriends.GetFriendPersonaName(new CSteamID(update.m_ulSteamIDUserChanged))));
                    PlayerLeftManagers(update.m_ulSteamIDUserChanged);
                    connectedPlayers.Remove(update.m_ulSteamIDUserChanged);
                    MultiplayerPlayerList.RemovePlayerLabel(update.m_ulSteamIDUserChanged);
                    if (update.m_ulSteamIDUserChanged != SteamUser.GetSteamID().m_SteamID)
                    {
                        otherPlayers.Remove(update.m_ulSteamIDUserChanged);
                    }
                    if (update.m_ulSteamIDUserChanged == NetworkGameManager.managerID)
                    {
                        patch_ProcessManager patchPM = ((patch_ProcessManager)Patches.patch_Rainworld.mainRW.processManager);
                        //if ((patchPM.currentMainLoop is MultiplayerSleepAndDeathScreen) || (patchPM.currentMainLoop is SteamMultiplayerMenu)
                        if (patchPM.musicPlayer != null)
                        {
                            patchPM.musicPlayer.FadeOutAllSongs(5f);
                            patchPM.musicPlayer.MenuRequestsSong("RW_8 - Sundown", 1.4f, 2f);
                        }
                        if (patchPM.currentMainLoop is RainWorldGame)
                        {
                            (patchPM.currentMainLoop as RainWorldGame).ExitToMenu();
                        }
                        else
                        {
                            patchPM.RequestMainProcessSwitch(ProcessManager.ProcessID.MainMenu);
                        }
                        if (monklandUI != null)
                        {
                            monklandUI.ClearSprites();
                            monklandUI = null;
                        }
                        this.OnGameExit();
                    }
                }
            } catch (System.Exception e) {
                Debug.LogError(e);
            }
        }
Esempio n. 11
0
    private void OnPlayerLeftLobby(LobbyChatUpdate_t callback)
    {
        var cSteamId = new CSteamID(callback.m_ulSteamIDUserChanged);

        if (cSteamId == SteamMatchmaking.GetLobbyOwner(LobbyId))
        {
            SteamMatchmaking.LeaveLobby(LobbyId);
        }
    }
Esempio n. 12
0
 void UserLeftControl(LobbyChatUpdate_t cb)
 {
     if ((EChatMemberStateChange)cb.m_rgfChatMemberStateChange == EChatMemberStateChange.k_EChatMemberStateChangeLeft || (EChatMemberStateChange)cb.m_rgfChatMemberStateChange == EChatMemberStateChange.k_EChatMemberStateChangeDisconnected)
     {
         if (readyUsers.Contains((CSteamID)cb.m_ulSteamIDUserChanged))
         {
             readyUsers.Remove((CSteamID)cb.m_ulSteamIDUserChanged);
         }
     }
 }
 private void AddSpeaker(LobbyChatUpdate_t cb)
 {
     if ((EChatMemberStateChange)cb.m_rgfChatMemberStateChange == EChatMemberStateChange.k_EChatMemberStateChangeEntered)
     {
         GameObject          speaker         = Instantiate(SpeakerPrefab);
         TestNetworkIdentity speakerIdentity = speaker.GetComponent <TestNetworkIdentity>();
         speakerIdentity.NetworkId     = (ulong)cb.m_ulSteamIDUserChanged;
         speakerIdentity.IsLocalPlayer = false;
         speakers.Add(speaker);
     }
 }
Esempio n. 14
0
 public void OnLobbyUpdate(LobbyChatUpdate_t pCallback)
 {
     if (pCallback.m_rgfChatMemberStateChange == (uint)EChatMemberStateChange.k_EChatMemberStateChangeDisconnected ||
         pCallback.m_rgfChatMemberStateChange == (uint)EChatMemberStateChange.k_EChatMemberStateChangeLeft)
     {
         if (database != null)
         {
             RemovePlayerFromGame(pCallback.m_ulSteamIDUserChanged);
         }
     }
 }
Esempio n. 15
0
 private unsafe static void OnLobbyMemberStatus(LobbyChatUpdate_t result)
 {
     if (lobby == null)
     {
         return;
     }
     lobby.OnUserStatusChange(
         User.GetUser(result.m_ulSteamIDUserChanged),
         (SteamLobbyUserStatusFlags)result.m_rgfChatMemberStateChange,
         User.GetUser(result.m_ulSteamIDMakingChange)
         );
 }
 private void OnLobbyChatUpdate(LobbyChatUpdate_t callback)
 {
     if (callback.m_rgfChatMemberStateChange == 2u && callback.m_ulSteamIDLobby == this.m_LobbyId.m_SteamID)
     {
         CSteamID csteamID = new CSteamID(callback.m_ulSteamIDUserChanged);
         if (P2PLogFilter.logInfo)
         {
             Debug.Log("[TransportLayerSteam] Peer has disconnected " + csteamID);
         }
         this.m_LeaveRequests.Push(csteamID);
     }
 }
Esempio n. 17
0
    void OnLobbyUpdate(LobbyChatUpdate_t cb)
    {
        if (!Handler)
        {
            return;
        }

        if ((EChatMemberStateChange)cb.m_rgfChatMemberStateChange != EChatMemberStateChange.k_EChatMemberStateChangeEntered && cb.m_ulSteamIDUserChanged == Handler.NetID)
        {
            Destroy(Handler.gameObject);
        }
    }
Esempio n. 18
0
        internal void OnLobbyStateUpdatedAPI(LobbyChatUpdate_t callback)
        {
            if (callback.SteamIDLobby != CurrentLobby)
            {
                return;
            }

            MemberStateChange change    = (MemberStateChange)callback.GfChatMemberStateChange;
            ulong             initiator = callback.SteamIDMakingChange;
            ulong             affected  = callback.SteamIDUserChanged;

            OnLobbyStateChanged?.Invoke(change, initiator, affected);
        }
 void OnLobbyChatUpdate(LobbyChatUpdate_t pCallback)
 {
     if (pCallback.m_ulSteamIDLobby == LobbyID)
     {
         if (pCallback.m_ulSteamIDUserChanged == LobbyOwner.m_SteamID)
         {
             if (pCallback.m_rgfChatMemberStateChange != (uint)EChatMemberStateChange.k_EChatMemberStateChangeEntered)
             {
                 Disconnect();
             }
         }
     }
 }
Esempio n. 20
0
        private static void OnLobbyChatUpdate(LobbyChatUpdate_t result)
        {
            Console.WriteLine("Lobby chat update");
            int lobbyMemberCount = SteamMatchmaking.GetNumLobbyMembers(new CSteamID(LobbyId));

            PlayerList.Clear();
            _playerNames.Clear();
            for (int i = 0; i < lobbyMemberCount; i++)
            {
                PlayerList.Add(SteamMatchmaking.GetLobbyMemberByIndex(new CSteamID(LobbyId), i));
                _playerNames.Add(SteamFriends.GetFriendPersonaName(PlayerList[i]));
            }
        }
    void InitCoroutine(LobbyChatUpdate_t cb)
    {
        if (coroutineStart || !ControlUsersStatus())
        {
            return;
        }

        Server.Init();
        Client.LeaveCurrentLobby();
        Client.SendPacketToInGameUsers(emptyArray, 0, 0, PacketType.LeaveLobby, EP2PSend.k_EP2PSendReliable);
        StartCoroutine(SpawnEnemiesAtStart());
        coroutineStart = true;
    }
Esempio n. 22
0
    public void OnLobbyChatUpdate(LobbyChatUpdate_t pCallback)
    {
        if (C.LOG_INVITE)
        {
            Debug.Log("Premade lobby: OnLobbyChatUpdate");
        }

        UpdateTeammatesPresence();
        CheckLock();

        /// If someone left
        if (pCallback.m_ulSteamIDLobby == teambuilderLobbyId.m_SteamID &&
            (pCallback.m_rgfChatMemberStateChange == (uint)EChatMemberStateChange.k_EChatMemberStateChangeLeft ||
             pCallback.m_rgfChatMemberStateChange == (uint)EChatMemberStateChange.k_EChatMemberStateChangeDisconnected))
        {
            if (C.LOG_INVITE)
            {
                Debug.LogWarning(SteamFriends.GetFriendPersonaName(new CSteamID(pCallback.m_ulSteamIDUserChanged)) + " left lobby");
            }

            /// Leave lobby if left only this player
            if (SteamMatchmaking.GetNumLobbyMembers(teambuilderLobbyId) <= 1)
            {
                LeaveTeambuilderLobby();
            }

            /// Update 'premade' message
            var snm = SteamNetworkManager.Instance;
            if (snm.steamLobbyId != CSteamID.Nil)
            {
                SteamMatchmaking.SetLobbyMemberData(snm.steamLobbyId, "premade", GeneratePremadeMessage());
            }

            /// If became new lobby owner - start pinging chat
            if (IsLobbyOwner() && _pingCoroutine == null)
            {
                _pingCoroutine = StartCoroutine(PingChat());
            }
        }

        /// If user enters lobby
        else if (pCallback.m_rgfChatMemberStateChange == (uint)EChatMemberStateChange.k_EChatMemberStateChangeEntered &&
                 pCallback.m_ulSteamIDLobby == teambuilderLobbyId.m_SteamID)
        {
            if (C.LOG_INVITE)
            {
                Debug.LogWarning(SteamFriends.GetFriendPersonaName(new CSteamID(pCallback.m_ulSteamIDUserChanged)) + " joined lobby");
            }
        }
    }
Esempio n. 23
0
        internal void OnLobbyStateUpdatedAPI(LobbyChatUpdate_t callback, bool error)
        {
            if (error || callback.SteamIDLobby != CurrentLobby)
            {
                return;
            }
            MemberStateChange change    = (MemberStateChange)callback.GfChatMemberStateChange;
            ulong             initiator = callback.SteamIDMakingChange;
            ulong             affected  = callback.SteamIDUserChanged;

            if (OnLobbyStateChanged != null)
            {
                OnLobbyStateChanged(change, initiator, affected);
            }
        }
Esempio n. 24
0
 // Token: 0x06002ED9 RID: 11993 RVA: 0x00132178 File Offset: 0x00130578
 private static void onLobbyChatUpdate(LobbyChatUpdate_t callback)
 {
     Terminal.print(string.Concat(new object[]
     {
         "Lobby chat update: ",
         callback.m_ulSteamIDLobby,
         " ",
         callback.m_ulSteamIDMakingChange,
         " ",
         callback.m_ulSteamIDUserChanged,
         " ",
         callback.m_rgfChatMemberStateChange
     }), null, Provider.STEAM_IC, Provider.STEAM_DC, true);
     Lobbies.triggerLobbiesRefreshed();
 }
Esempio n. 25
0
    void OnLobbyChatUpdate(LobbyChatUpdate_t pCallback)
    {
        if (pCallback.m_rgfChatMemberStateChange == (uint)EChatMemberStateChange.k_EChatMemberStateChangeLeft && pCallback.m_ulSteamIDLobby == steamLobbyId.m_SteamID)
        {
            Debug.Log("A client has disconnected from the UNET server");

            // user left lobby
            var userId = new CSteamID(pCallback.m_ulSteamIDUserChanged);
            if (UNETServerController.IsHostingServer())
            {
                UNETServerController.RemoveConnection(userId);
            }

            SteamNetworking.CloseP2PSessionWithUser(userId);
        }
    }
Esempio n. 26
0
    void OnLobbyChatUpdate(LobbyChatUpdate_t upd)
    {
        CSteamID changed = new CSteamID(upd.m_ulSteamIDUserChanged);

        if ((EChatMemberStateChange)upd.m_rgfChatMemberStateChange == EChatMemberStateChange.k_EChatMemberStateChangeEntered)
        {
            others.Add(changed.m_SteamID, changed);
            INetworkIdentity id = GameObject.Instantiate(voiceUserPrefab.gameObject).GetComponent <INetworkIdentity>();
            id.IsLocalPlayer = false;
            id.NetworkId     = changed.m_SteamID;
        }
        else
        {
            others.Remove(changed.m_SteamID);
            SteamNetworking.CloseP2PSessionWithUser(changed);
        }
    }
Esempio n. 27
0
        private void OnLobbyChatUpdate(LobbyChatUpdate_t update)
        {
            var state = (EChatMemberStateChange)update.m_rgfChatMemberStateChange;

            if (state == EChatMemberStateChange.k_EChatMemberStateChangeLeft || state == EChatMemberStateChange.k_EChatMemberStateChangeDisconnected)
            {
                var changedUserId = (CSteamID)update.m_ulSteamIDUserChanged;
                if (NetworkServer.active)
                {
                    HandleSteamServerDisconnect(changedUserId);
                }
                else if (remoteSteamId == changedUserId)
                {
                    HandleSteamClientDisconnect();
                }
            }
        }
Esempio n. 28
0
        void OnLobbyChatUpdate(LobbyChatUpdate_t evt)
        {
            currentLobbyId = new CSteamID(evt.m_ulSteamIDLobby);
            var stateChange = (EChatMemberStateChange)evt.m_rgfChatMemberStateChange;

            if (stateChange == 0)
            {
                return;
            }
            else if ((stateChange | EChatMemberStateChange.k_EChatMemberStateChangeEntered) != 0)
            {
                Debug.Log($"[Steam] Lobby User Join: {evt.m_ulSteamIDUserChanged}");
            }
            else
            {
                Debug.Log($"[Steam] Lobby User Leave: {evt.m_ulSteamIDUserChanged}");
                OnDisconnect(new CSteamID(evt.m_ulSteamIDUserChanged));
            }
        }
Esempio n. 29
0
    void UpdateUserStatus(LobbyChatUpdate_t cb)
    {
        string name = SteamFriends.GetFriendPersonaName((CSteamID)cb.m_ulSteamIDUserChanged);
        EChatMemberStateChange chatType = (EChatMemberStateChange)cb.m_rgfChatMemberStateChange;

        switch (chatType)
        {
        case EChatMemberStateChange.k_EChatMemberStateChangeEntered:
            Text.text += "\n" + name + " joined the lobby";
            break;

        case EChatMemberStateChange.k_EChatMemberStateChangeLeft:
            Text.text += Text.text += "\n" + name + " left the lobby";
            break;

        case EChatMemberStateChange.k_EChatMemberStateChangeDisconnected:
            Text.text += Text.text += "\n" + name + " left the lobby";
            break;
        }
    }
        // Why Steam does lobby joins and leaves via a chat update is beyond me.
        void OnLobbyChatUpdate(LobbyChatUpdate_t evt)
        {
            var id = new CSteamID(evt.m_ulSteamIDLobby);

            if (_connectedLobbies.TryGetValue(id, out SteamLobby lobby))
            {
                uint          leaveMask   = ~(uint)EChatMemberStateChange.k_EChatMemberStateChangeEntered;
                uint          stateChange = evt.m_rgfChatMemberStateChange;
                AccountHandle user        = evt.m_ulSteamIDUserChanged;
                var           present     = lobby.Members.Contains(user);
                if ((stateChange & leaveMask) != 0)
                {
                    // Member disconnected
                    if (!present)
                    {
                        lobby.Members.Remove(user);
                    }
                    else
                    {
                        Debug.LogWarning($"[Steam] Unexpected member disconnect for lobby: {id}, member: {user}");
                    }
                }
                else if ((stateChange & ~leaveMask) != 0)
                {
                    // Member joined
                    if (present)
                    {
                        lobby.Members.Add(user);
                    }
                    else
                    {
                        Debug.LogWarning($"[Steam] Members somehow has joined multiple times: {id}, member: {user}");
                    }
                }
            }
            else
            {
                Debug.LogWarning($"[Steam] Unexpected lobby chat update for lobby: {id}");
            }
        }