void MyDedicatedServer_ClientLeft(ulong user, ChatMemberStateChangeEnum arg2) { Peer2Peer.CloseSession(user); MyLog.Default.WriteLineAndConsole("User left " + GetMemberName(user)); if (m_members.Contains(user)) m_members.Remove(user); if (m_pendingMembers.ContainsKey(user)) m_pendingMembers.Remove(user); if (m_waitingForGroup.Contains(user)) m_waitingForGroup.Remove(user); if (arg2 != ChatMemberStateChangeEnum.Kicked && arg2 != ChatMemberStateChangeEnum.Banned) { foreach (var member in m_members) { if (member != ServerId) { MyControlDisconnectedMsg msg = new MyControlDisconnectedMsg(); msg.Client = user; SendControlMessage(member, ref msg); } } } SteamSDK.SteamServerAPI.Instance.GameServer.SendUserDisconnect(user); m_memberData.Remove(user); }
public override void Dispose() { MyTrace.Send(TraceWindow.Multiplayer, "Multiplayer closed"); foreach (var member in m_members) { MyControlDisconnectedMsg msg = new MyControlDisconnectedMsg(); msg.Client = ServerId; if (member != ServerId) SendControlMessage(member, ref msg); } //TODO: Any better way? P2P needs to be closed from both sides. If closed right after Send, message //can stay not sent. Thread.Sleep(200); CloseMemberSessions(); SteamSDK.SteamServerAPI.Instance.GameServer.EnableHeartbeats(false); base.Dispose(); MyLog.Default.WriteLineAndConsole("Logging off Steam..."); SteamSDK.SteamServerAPI.Instance.GameServer.LogOff(); MyLog.Default.WriteLineAndConsole("Shutting down server..."); SteamSDK.SteamServerAPI.Instance.GameServer.Shutdown(); MyLog.Default.WriteLineAndConsole("Done"); SteamSDK.Peer2Peer.SessionRequest -= Peer2Peer_SessionRequest; SteamSDK.Peer2Peer.ConnectionFailed -= Peer2Peer_ConnectionFailed; ClientLeft -= MyDedicatedServer_ClientLeft; }
private void CloseClient() { MyTrace.Send(TraceWindow.Multiplayer, "Multiplayer client closed"); if (m_clientJoined) { MyControlDisconnectedMsg msg = new MyControlDisconnectedMsg(); msg.Client = MySteam.UserId; SendControlMessage(ServerId, ref msg); } OnJoin = null; //TODO: Any better way? P2P needs to be closed from both sides. If closed right after Send, message //can stay not sent. Thread.Sleep(200); //WARN: If closed here, previous control message probably not come Peer2Peer.CloseSession(ServerId); CloseMemberSessions(); Peer2Peer.ConnectionFailed -= Peer2Peer_ConnectionFailed; Peer2Peer.SessionRequest -= Peer2Peer_SessionRequest; }