public void Update() { uint Length; int Channel; while (PacketAvailable(out Length, out Channel)) { CSteamID UserID; uint RealLength; if (SteamNetworking.ReadP2PPacket(RecvData, Length, out RealLength, out UserID, Channel)) { SteamServerConnection ClientConnection = ConnectedUsers.Find(x => x.RemoteID.m_SteamID == UserID.m_SteamID); if (ClientConnection != null) { ClientConnection.ProcessData(RecvData, (int)RealLength, Channel != 0); } } } }
// User Started Communication void OnP2PSessionRequest(P2PSessionRequest_t pCallback) { for (int i = 0; i < SteamMatchmaking.GetNumLobbyMembers(CLobbyID); i++) { if (SteamMatchmaking.GetLobbyMemberByIndex(CLobbyID, i).m_SteamID == pCallback.m_steamIDRemote.m_SteamID) { if (SteamNetworking.AcceptP2PSessionWithUser(pCallback.m_steamIDRemote)) { WriteEvent($"Accepted P2P Connection With User: {pCallback.m_steamIDRemote.m_SteamID}", LogType.Info); long fakeAddress = 0; SteamServerConnection NewClient = new SteamServerConnection(pCallback.m_steamIDRemote.m_SteamID, this, Interlocked.Increment(ref currentEndPointCount), out fakeAddress); SteamMatchmaking.SetLobbyData(CLobbyID, fakeAddress.ToString(), pCallback.m_steamIDRemote.m_SteamID.ToString()); RegisterUser(NewClient); RegisterConnection(NewClient); } else { WriteEvent($"Failed P2P Connection With User: {pCallback.m_steamIDRemote.m_SteamID}", LogType.Info); } return; } } }
// User Joined/Left void OnLobbyChatUpdate(LobbyChatUpdate_t pCallback) { if (pCallback.m_ulSteamIDLobby == LobbyID) { switch (pCallback.m_rgfChatMemberStateChange) { case ((uint)EChatMemberStateChange.k_EChatMemberStateChangeDisconnected): case ((uint)EChatMemberStateChange.k_EChatMemberStateChangeKicked): case ((uint)EChatMemberStateChange.k_EChatMemberStateChangeBanned): case ((uint)EChatMemberStateChange.k_EChatMemberStateChangeLeft): SteamNetworking.CloseP2PSessionWithUser(new CSteamID(pCallback.m_ulSteamIDUserChanged)); SteamServerConnection ClientConnection = ConnectedUsers.Find(x => x.RemoteID.m_SteamID == pCallback.m_ulSteamIDUserChanged); if (ClientConnection != null) { ClientConnection.UserDisconnected(); UnregisterUser(ClientConnection); } break; } } }
public void UnregisterUser(SteamServerConnection user) { lock (ConnectedUsers) ConnectedUsers.Remove(user); }
public void RegisterUser(SteamServerConnection user) { lock (ConnectedUsers) ConnectedUsers.Add(user); }