private void AddServerItem(GameServerItem server, string sessionName, StringBuilder gamemodeSB, StringBuilder gamemodeToolTipSB) { ulong modCount = server.GetGameTagByPrefixUlong(MyMultiplayer.ModCountTag); string limit = server.MaxPlayers.ToString(); StringBuilder userCount = new StringBuilder(server.Players + "/" + limit); var viewDistance = server.GetGameTagByPrefix(MyMultiplayer.ViewDistanceTag); //TODO: refactor if (!String.IsNullOrEmpty(viewDistance) && server.AppID == 244850) { gamemodeToolTipSB.AppendLine(); gamemodeToolTipSB.AppendFormat(MyTexts.Get(MySpaceTexts.JoinGame_GameTypeToolTip_ViewDistance).ToString(), viewDistance); } var row = new MyGuiControlTable.Row(server); row.AddCell(new MyGuiControlTable.Cell(text: m_textCache.Clear().Append(sessionName), userData: server.SteamID, toolTip: m_textCache.ToString())); row.AddCell(new MyGuiControlTable.Cell(text: gamemodeSB, toolTip: gamemodeToolTipSB.ToString())); row.AddCell(new MyGuiControlTable.Cell(text: m_textCache.Clear().Append(server.Name), toolTip: m_gameTypeToolTip.Clear().AppendLine(server.Name).Append(server.NetAdr.ToString()).ToString())); row.AddCell(new MyGuiControlTable.Cell(text: userCount, toolTip: userCount.ToString())); row.AddCell(new MyGuiControlTable.Cell(text: m_textCache.Clear().Append(server.Ping), toolTip: m_textCache.ToString())); row.AddCell(new MyGuiControlTable.Cell(text: m_textCache.Clear().Append(modCount == 0 ? "---" : modCount.ToString()), toolTip: MyTexts.GetString(MySpaceTexts.JoinGame_SelectServerToShowModList))); m_gamesTable.Add(row); var selectedRow = m_gamesTable.SelectedRow; m_gamesTable.Sort(false); m_gamesTable.SelectedRowIndex = m_gamesTable.FindRow(selectedRow); }
public GameServerItem GetServerDetails(ServerListRequestHandle request, int server) { IntPtr returnValue; returnValue = NativeMethods.MatchmakingServers_GetServerDetails(request.AsUInt32, server); return(GameServerItem.Create(returnValue, NativeMethods.MatchmakingServers_GetGameServerItemSize())); }
void OnFavoritesServerListResponded(int server) { GameServerItem serverItem = SteamAPI.Instance.GetFavoritesServerDetails(server); AddServerItem(serverItem, false); m_favoritesPage.Text = new StringBuilder().Append(MyTexts.Get(MySpaceTexts.JoinGame_TabTitle_Favorites).ToString()).Append(" (").Append(m_gamesTable.RowsCount).Append(")"); }
internal MyMultiplayerClient(GameServerItem server, MySyncLayer syncLayer) : base(syncLayer) { m_membersCollection = new MemberCollection(m_members); Server = server; ServerId = server.SteamID; SyncLayer.TransportLayer.IsBuffering = true; SyncLayer.RegisterClientEvents(this); SetReplicationLayer(new MyReplicationClient(this, CreateClientState())); syncLayer.TransportLayer.Register(MyMessageId.SERVER_DATA, ReplicationLayer.ProcessServerData); syncLayer.TransportLayer.Register(MyMessageId.REPLICATION_CREATE, OnReplicationCreate); syncLayer.TransportLayer.Register(MyMessageId.REPLICATION_DESTROY, OnReplicationDestroy); syncLayer.TransportLayer.Register(MyMessageId.SERVER_STATE_SYNC, ReplicationLayer.ProcessStateSync); syncLayer.TransportLayer.Register(MyMessageId.RPC, ReplicationLayer.ProcessEvent); syncLayer.TransportLayer.Register(MyMessageId.REPLICATION_STREAM_BEGIN, OnReplicationBeginCreate); syncLayer.TransportLayer.Register(MyMessageId.JOIN_RESULT, OnJoinResult); syncLayer.TransportLayer.Register(MyMessageId.WORLD_DATA, OnWorldData); syncLayer.TransportLayer.Register(MyMessageId.WORLD_BATTLE_DATA, OnWorldBattleData); syncLayer.TransportLayer.Register(MyMessageId.CLIENT_CONNNECTED, OnClientConnected); ClientJoined += MyMultiplayerClient_ClientJoined; ClientLeft += MyMultiplayerClient_ClientLeft; HostLeft += MyMultiplayerClient_HostLeft; Peer2Peer.ConnectionFailed += Peer2Peer_ConnectionFailed; Peer2Peer.SessionRequest += Peer2Peer_SessionRequest; m_battleData = new MyMultiplayerBattleData(this); }
internal MyMultiplayerClient(GameServerItem server, MySyncLayer syncLayer) : base(syncLayer) { m_membersCollection = new MemberCollection(m_members); Server = server; ServerId = server.SteamID; SyncLayer.TransportLayer.IsBuffering = true; SyncLayer.RegisterClientEvents(this); //MySyncLayer.RegisterMessage<ChatMsg>(OnChatMessage, MyMessagePermissions.Any, MyTransportMessageEnum.Request); //MySyncLayer.RegisterMessage<SendServerDataMsg>(OnServerData, MyMessagePermissions.Any, MyTransportMessageEnum.Request); //MySyncLayer.RegisterMessage<ConnectedPlayerDataMsg>(OnPlayerConnected, MyMessagePermissions.Any, MyTransportMessageEnum.Request); RegisterControlMessage <ChatMsg>(MyControlMessageEnum.Chat, OnChatMessage); RegisterControlMessage <ServerDataMsg>(MyControlMessageEnum.ServerData, OnServerData); RegisterControlMessage <JoinResultMsg>(MyControlMessageEnum.JoinResult, OnUserJoined); SyncLayer.RegisterMessageImmediate <ConnectedClientDataMsg>(this.OnConnectedClient, MyMessagePermissions.Any); ClientJoined += MyMultiplayerClient_ClientJoined; ClientLeft += MyMultiplayerClient_ClientLeft; HostLeft += MyMultiplayerClient_HostLeft; Peer2Peer.ConnectionFailed += Peer2Peer_ConnectionFailed; Peer2Peer.SessionRequest += Peer2Peer_SessionRequest; }
/// <summary> /// Callback that is called directly from native code /// </summary> /// <param name="instanceId"></param> /// <param name="server"></param> /// <param name="serverSize"></param> private static void ServerRespondedCallback(uint instanceId, IntPtr server, int serverSize) { try { var target = MatchmakingServers.PingResponse[instanceId]; target.serverResponded.Add(GameServerItem.Create(server, serverSize)); } catch (Exception e) { // If we get a null reference exception it means that either the Steam.Instance, // Steam.Instance.MatchmakingServers, // Steam.Instance.MatchmakingServers.PingResponse, // target or target.serverResponded is null. // // Either way, this should not happen during correct usage. But since we can't // throw an exception as this method is called from native code, we try to save it. try { MatchmakingServers.SaveException(e); } catch (Exception) { // If anything goes wrong while saving the exception, just ignore it. } } }
internal MyMultiplayerClient(GameServerItem server, MySyncLayer syncLayer) : base(syncLayer) { m_membersCollection = new MemberCollection(m_members); Server = server; ServerId = server.SteamID; SyncLayer.TransportLayer.IsBuffering = true; SyncLayer.RegisterClientEvents(this); SetReplicationLayer(new MyReplicationClient(this, CreateClientState(), MyEngineConstants.UPDATE_STEP_SIZE_IN_MILLISECONDS)); ReplicationLayer.UseSmoothPing = MyFakes.MULTIPLAYER_SMOOTH_PING; ReplicationLayer.UseSmoothCorrection = MyFakes.MULTIPLAYER_SMOOTH_TIMESTAMP_CORRECTION; syncLayer.TransportLayer.Register(MyMessageId.SERVER_DATA, ReplicationLayer.ProcessServerData); syncLayer.TransportLayer.Register(MyMessageId.REPLICATION_CREATE, OnReplicationCreate); syncLayer.TransportLayer.Register(MyMessageId.REPLICATION_DESTROY, OnReplicationDestroy); syncLayer.TransportLayer.Register(MyMessageId.SERVER_STATE_SYNC, ReplicationLayer.ProcessStateSync); syncLayer.TransportLayer.Register(MyMessageId.RPC, ReplicationLayer.ProcessEvent); syncLayer.TransportLayer.Register(MyMessageId.REPLICATION_STREAM_BEGIN, OnReplicationBeginCreate); syncLayer.TransportLayer.Register(MyMessageId.JOIN_RESULT, OnJoinResult); syncLayer.TransportLayer.Register(MyMessageId.WORLD_DATA, OnWorldData); syncLayer.TransportLayer.Register(MyMessageId.CLIENT_CONNNECTED, OnClientConnected); ClientJoined += MyMultiplayerClient_ClientJoined; ClientLeft += MyMultiplayerClient_ClientLeft; HostLeft += MyMultiplayerClient_HostLeft; Peer2Peer.ConnectionFailed += Peer2Peer_ConnectionFailed; Peer2Peer.SessionRequest += Peer2Peer_SessionRequest; }
public static void JoinGame(GameServerItem server) { MyAnalyticsHelper.SetEntry(MyGameEntryEnum.Join); if (server.ServerVersion != MyFinalBuildConstants.APP_VERSION) { var sb = new StringBuilder(); sb.AppendFormat(MyTexts.GetString(MyCommonTexts.MultiplayerError_IncorrectVersion), MyFinalBuildConstants.APP_VERSION, server.ServerVersion); MyGuiSandbox.Show(sb, MyCommonTexts.MessageBoxCaptionError); return; } if (MyFakes.ENABLE_MP_DATA_HASHES) { var serverHash = server.GetGameTagByPrefix("datahash"); if (serverHash != "" && serverHash != MyDataIntegrityChecker.GetHashBase64()) { MyGuiSandbox.Show(MyCommonTexts.MultiplayerError_DifferentData); MySandboxGame.Log.WriteLine("Different game data when connecting to server. Local hash: " + MyDataIntegrityChecker.GetHashBase64() + ", server hash: " + serverHash); return; } } UInt32 unixTimestamp = (UInt32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; SteamAPI.Instance.AddFavoriteGame(server.AppID, System.Net.IPAddressExtensions.ToIPv4NetworkOrder(server.NetAdr.Address), (UInt16)server.NetAdr.Port, (UInt16)server.NetAdr.Port, FavoriteEnum.History, unixTimestamp); MyMultiplayerClient multiplayer = new MyMultiplayerClient(server, new MySyncLayer(new MyTransportLayer(MyMultiplayer.GameEventChannel))); MyMultiplayer.Static = multiplayer; MyMultiplayer.Static.SyncLayer.AutoRegisterGameEvents = false; MyMultiplayer.Static.SyncLayer.RegisterGameEvents(); multiplayer.SendPlayerData(MySteam.UserName); string gamemode = server.GetGameTagByPrefix("gamemode"); StringBuilder text = MyTexts.Get(MyCommonTexts.DialogTextJoiningWorld); MyGuiScreenProgress progress = new MyGuiScreenProgress(text, MyCommonTexts.Cancel); MyGuiSandbox.AddScreen(progress); progress.ProgressCancelled += () => { multiplayer.Dispose(); MySessionLoader.UnloadAndExitToMenu(); if (MyMultiplayer.Static != null) { MyMultiplayer.Static.Dispose(); } }; multiplayer.OnJoin += delegate { MyJoinGameHelper.OnJoin(progress, SteamSDK.Result.OK, new LobbyEnterInfo() { EnterState = LobbyEnterResponseEnum.Success }, multiplayer); }; VRage.Profiler.MyRenderProfiler.GetProfilerFromServer = MyMultiplayer.Static.DownloadProfiler; }
void OnDedicatedServerListResponded(int server) { GameServerItem serverItem = SteamAPI.Instance.GetDedicatedServerDetails(server); AddServerItem(serverItem); m_serversPage.Text = new StringBuilder().Append(MyTexts.Get(MySpaceTexts.JoinGame_TabTitle_Servers).ToString()).Append(" (").Append(m_gamesTable.RowsCount).Append(")"); }
void OnLANServerListResponded(int server) { GameServerItem serverItem = SteamAPI.Instance.GetLANServerDetails(server); AddServerItem(serverItem, delegate() { m_LANPage.Text = new StringBuilder().Append(MyTexts.Get(MyCommonTexts.JoinGame_TabTitle_LAN).ToString()).Append(" (").Append(m_gamesTable.RowsCount).Append(")"); }, isFiltered: false); }
void OnDedicatedServerListResponded(int server) { VRage.Profiler.ProfilerShort.Begin("OnDedicatedServerListResponded"); GameServerItem serverItem = SteamAPI.Instance.GetDedicatedServerDetails(server); AddServerItem(serverItem, delegate() { m_serversPage.Text = new StringBuilder().Append(MyTexts.Get(MyCommonTexts.JoinGame_TabTitle_Servers).ToString()).Append(" (").Append(m_gamesTable.RowsCount).Append(")"); }); VRage.Profiler.ProfilerShort.End(); }
internal MyMultiplayerClient(GameServerItem server, MySyncLayer syncLayer) : base(syncLayer) { m_membersCollection = new MemberCollection(m_members); Server = server; ServerId = server.SteamID; SyncLayer.TransportLayer.IsBuffering = true; SyncLayer.RegisterClientEvents(this); SetReplicationLayer(new MyReplicationClient(this, CreateClientState())); syncLayer.TransportLayer.Register(MyMessageId.SERVER_DATA, ReplicationLayer.ProcessServerData); syncLayer.TransportLayer.Register(MyMessageId.REPLICATION_CREATE, OnReplicationCreate); syncLayer.TransportLayer.Register(MyMessageId.REPLICATION_DESTROY, OnReplicationDestroy); syncLayer.TransportLayer.Register(MyMessageId.SERVER_STATE_SYNC, ReplicationLayer.ProcessStateSync); syncLayer.TransportLayer.Register(MyMessageId.RPC, ReplicationLayer.ProcessEvent); syncLayer.TransportLayer.Register(MyMessageId.REPLICATION_STREAM_BEGIN, OnReplicationBeginCreate); //MySyncLayer.RegisterMessage<ChatMsg>(OnChatMessage, MyMessagePermissions.Any, MyTransportMessageEnum.Request); //MySyncLayer.RegisterMessage<SendServerDataMsg>(OnServerData, MyMessagePermissions.Any, MyTransportMessageEnum.Request); //MySyncLayer.RegisterMessage<ConnectedPlayerDataMsg>(OnPlayerConnected, MyMessagePermissions.Any, MyTransportMessageEnum.Request); RegisterControlMessage <ChatMsg>(MyControlMessageEnum.Chat, OnChatMessage, MyMessagePermissions.ToServer | MyMessagePermissions.FromServer); RegisterControlMessage <ServerDataMsg>(MyControlMessageEnum.ServerData, OnServerData, MyMessagePermissions.FromServer); RegisterControlMessage <JoinResultMsg>(MyControlMessageEnum.JoinResult, OnUserJoined, MyMessagePermissions.FromServer); RegisterControlMessage <ServerBattleDataMsg>(MyControlMessageEnum.BattleData, OnServerBattleData, MyMessagePermissions.FromServer); SyncLayer.RegisterMessageImmediate <ConnectedClientDataMsg>(this.OnConnectedClient, MyMessagePermissions.ToServer | MyMessagePermissions.FromServer); SyncLayer.RegisterMessageImmediate <AllMembersDataMsg>(OnAllMembersData, MyMessagePermissions.ToServer | MyMessagePermissions.FromServer); ClientJoined += MyMultiplayerClient_ClientJoined; ClientLeft += MyMultiplayerClient_ClientLeft; HostLeft += MyMultiplayerClient_HostLeft; Peer2Peer.ConnectionFailed += Peer2Peer_ConnectionFailed; Peer2Peer.SessionRequest += Peer2Peer_SessionRequest; m_battleData = new MyMultiplayerBattleData(this); }
internal MyMultiplayerClient(GameServerItem server, MySyncLayer syncLayer) : base(syncLayer) { m_membersCollection = new MemberCollection(m_members); Server = server; ServerId = server.SteamID; SyncLayer.TransportLayer.IsBuffering = true; SyncLayer.RegisterClientEvents(this); //MySyncLayer.RegisterMessage<ChatMsg>(OnChatMessage, MyMessagePermissions.Any, MyTransportMessageEnum.Request); //MySyncLayer.RegisterMessage<SendServerDataMsg>(OnServerData, MyMessagePermissions.Any, MyTransportMessageEnum.Request); //MySyncLayer.RegisterMessage<ConnectedPlayerDataMsg>(OnPlayerConnected, MyMessagePermissions.Any, MyTransportMessageEnum.Request); RegisterControlMessage<ChatMsg>(MyControlMessageEnum.Chat, OnChatMessage); RegisterControlMessage<ServerDataMsg>(MyControlMessageEnum.ServerData, OnServerData); RegisterControlMessage<JoinResultMsg>(MyControlMessageEnum.JoinResult, OnUserJoined); SyncLayer.RegisterMessageImmediate<ConnectedClientDataMsg>(this.OnConnectedClient, MyMessagePermissions.Any); ClientJoined += MyMultiplayerClient_ClientJoined; ClientLeft += MyMultiplayerClient_ClientLeft; HostLeft += MyMultiplayerClient_HostLeft; Peer2Peer.ConnectionFailed += Peer2Peer_ConnectionFailed; Peer2Peer.SessionRequest += Peer2Peer_SessionRequest; }
unsafe void ServerResponded(GameServerItem serverItem) { MyLog.Default.WriteLineAndConsole("Server responded"); MyJoinGameHelper.JoinGame(serverItem); }
bool AddServerItem(GameServerItem server, Action onAddedServerItem, bool isFiltered = false) { if (m_allowedGroups.IsChecked && !SteamAPI.Instance.Friends.IsUserInGroup(server.GetGameTagByPrefixUlong("groupId"))) { return(false); } if (server.AppID != MySteam.AppId) { return(false); } if (!isFiltered && !string.IsNullOrWhiteSpace(m_blockSearch.Text)) // this must be here for filtering LAN games { if (!server.Name.ToLower().Contains(m_blockSearch.Text.ToLower())) { return(false); } } string sessionName = server.Map; int appVersion = server.ServerVersion; m_gameTypeText.Clear(); m_gameTypeToolTip.Clear(); // Skip world without name (not fully initialized) if (string.IsNullOrEmpty(sessionName)) { return(false); } // Show only same app versions if (m_showOnlyCompatibleGames.IsChecked && appVersion != MyFinalBuildConstants.APP_VERSION) { return(false); } // Show only if the game data match string remoteHash = server.GetGameTagByPrefix("datahash"); if (m_showOnlyWithSameMods.IsChecked && MyFakes.ENABLE_MP_DATA_HASHES && remoteHash != "" && remoteHash != MyDataIntegrityChecker.GetHashBase64()) { return(false); } var gamemodeSB = new StringBuilder(); var gamemodeToolTipSB = new StringBuilder(); string gamemode = server.GetGameTagByPrefix("gamemode"); if (gamemode == "C") { gamemodeSB.Append(MyTexts.Get(MyCommonTexts.WorldSettings_GameModeCreative)); gamemodeToolTipSB.AppendStringBuilder(MyTexts.Get(MyCommonTexts.WorldSettings_GameModeCreative)); } else if (gamemode == "B") { IPEndPoint endpoint = server.NetAdr; if (endpoint == null) { return(false); } // Started battle write key value "BattleCanBeJoinedTag" "0" to server which can be accessed asynchronously from rules. MySandboxGame.Services.SteamService.SteamAPI.GetServerRules(endpoint.Address.ToIPv4NetworkOrder(), (ushort)endpoint.Port, delegate(Dictionary <string, string> rules) { if (rules == null) { return; } bool canBeJoined = true; string strCanBeJoined; if (rules.TryGetValue(MyMultiplayer.BattleCanBeJoinedTag, out strCanBeJoined)) { canBeJoined = strCanBeJoined != 0.ToString(); } if (canBeJoined) { string remainingTimeText = null; float?remainingTimeSeconds = null; if (MyFakes.ENABLE_JOIN_SCREEN_REMAINING_TIME && rules.TryGetValue(MyMultiplayer.BattleRemainingTimeTag, out remainingTimeText)) { float remainingTime; if (float.TryParse(remainingTimeText, NumberStyles.Float, CultureInfo.InvariantCulture, out remainingTime)) { if (remainingTime >= 0f) { remainingTimeSeconds = remainingTime; remainingTimeText = null; } else if (remainingTime == -1f) { remainingTimeText = MyTexts.Get(MyCommonTexts.JoinGame_Lobby).ToString(); } else if (remainingTime == -2f) { remainingTimeText = MyTexts.Get(MyCommonTexts.JoinGame_Waiting).ToString(); } } } gamemodeSB.Append(MyTexts.Get(MySpaceTexts.WorldSettings_Battle)); gamemodeToolTipSB.AppendStringBuilder(MyTexts.Get(MySpaceTexts.WorldSettings_Battle)); AddServerItem(server, sessionName, gamemodeSB, gamemodeToolTipSB, remainingTimeText: remainingTimeText, remainingTimeSeconds: remainingTimeSeconds); if (onAddedServerItem != null) { onAddedServerItem(); } } }, delegate() { }); return(false); } else if (!string.IsNullOrWhiteSpace(gamemode)) { var multipliers = gamemode.Substring(1); var split = multipliers.Split('-'); //TODO: refactor if (split.Length == 3 && server.AppID == 244850) { gamemodeSB.Append(MyTexts.Get(MyCommonTexts.WorldSettings_GameModeSurvival)).Append(" ").Append(multipliers); gamemodeToolTipSB.AppendFormat(MyTexts.Get(MyCommonTexts.JoinGame_GameTypeToolTip_MultipliersFormat).ToString(), split[0], split[1], split[2]); } else { gamemodeSB.Append(MyTexts.Get(MyCommonTexts.WorldSettings_GameModeSurvival)); gamemodeToolTipSB.AppendStringBuilder(MyTexts.Get(MyCommonTexts.WorldSettings_GameModeSurvival)); } } AddServerItem(server, sessionName, gamemodeSB, gamemodeToolTipSB); if (onAddedServerItem != null) { onAddedServerItem(); } return(true); }
internal MyMultiplayerClient(GameServerItem server, MySyncLayer syncLayer) : base(syncLayer) { m_membersCollection = new MemberCollection(m_members); Server = server; ServerId = server.SteamID; SyncLayer.TransportLayer.IsBuffering = true; SyncLayer.RegisterClientEvents(this); SetReplicationLayer(new MyReplicationClient(this, CreateClientState())); syncLayer.TransportLayer.Register(MyMessageId.SERVER_DATA, ReplicationLayer.ProcessServerData); syncLayer.TransportLayer.Register(MyMessageId.REPLICATION_CREATE, OnReplicationCreate); syncLayer.TransportLayer.Register(MyMessageId.REPLICATION_DESTROY, OnReplicationDestroy); syncLayer.TransportLayer.Register(MyMessageId.SERVER_STATE_SYNC, ReplicationLayer.ProcessStateSync); syncLayer.TransportLayer.Register(MyMessageId.RPC, ReplicationLayer.ProcessEvent); syncLayer.TransportLayer.Register(MyMessageId.REPLICATION_STREAM_BEGIN, OnReplicationBeginCreate); //MySyncLayer.RegisterMessage<ChatMsg>(OnChatMessage, MyMessagePermissions.Any, MyTransportMessageEnum.Request); //MySyncLayer.RegisterMessage<SendServerDataMsg>(OnServerData, MyMessagePermissions.Any, MyTransportMessageEnum.Request); //MySyncLayer.RegisterMessage<ConnectedPlayerDataMsg>(OnPlayerConnected, MyMessagePermissions.Any, MyTransportMessageEnum.Request); RegisterControlMessage<ChatMsg>(MyControlMessageEnum.Chat, OnChatMessage, MyMessagePermissions.ToServer | MyMessagePermissions.FromServer); RegisterControlMessage<ServerDataMsg>(MyControlMessageEnum.ServerData, OnServerData, MyMessagePermissions.FromServer); RegisterControlMessage<JoinResultMsg>(MyControlMessageEnum.JoinResult, OnUserJoined, MyMessagePermissions.FromServer); RegisterControlMessage<ServerBattleDataMsg>(MyControlMessageEnum.BattleData, OnServerBattleData, MyMessagePermissions.FromServer); SyncLayer.RegisterMessageImmediate<ConnectedClientDataMsg>(this.OnConnectedClient, MyMessagePermissions.ToServer | MyMessagePermissions.FromServer); SyncLayer.RegisterMessageImmediate<AllMembersDataMsg>(OnAllMembersData, MyMessagePermissions.ToServer | MyMessagePermissions.FromServer); ClientJoined += MyMultiplayerClient_ClientJoined; ClientLeft += MyMultiplayerClient_ClientLeft; HostLeft += MyMultiplayerClient_HostLeft; Peer2Peer.ConnectionFailed += Peer2Peer_ConnectionFailed; Peer2Peer.SessionRequest += Peer2Peer_SessionRequest; m_battleData = new MyMultiplayerBattleData(this); }
bool AddServerItem(GameServerItem server, bool isFiltered = false) { if (m_allowedGroups.IsChecked && !SteamAPI.Instance.Friends.IsUserInGroup(server.GetGameTagByPrefixUlong("groupId"))) return false; if (server.AppID != MySteam.AppId) return false; if (!isFiltered && !string.IsNullOrWhiteSpace(m_blockSearch.Text)) // this must be here for filtering LAN games { if (!server.Name.ToLower().Contains(m_blockSearch.Text.ToLower())) return false; } var row = new MyGuiControlTable.Row(server); string sessionName = server.Map; int appVersion = server.ServerVersion; m_gameTypeText.Clear(); m_gameTypeToolTip.Clear(); // Skip world without name (not fully initialized) if (string.IsNullOrEmpty(sessionName)) return false; // Show only same app versions if (m_showOnlyCompatibleGames.IsChecked && appVersion != MyFinalBuildConstants.APP_VERSION) return false; // Show only if the game data match string remoteHash = server.GetGameTagByPrefix("datahash"); if (m_showOnlyWithSameMods.IsChecked && MyFakes.ENABLE_MP_DATA_HASHES && remoteHash != "" && remoteHash != MyDataIntegrityChecker.GetHashBase64()) return false; var gamemodeSB = new StringBuilder(); var gamemodeToolTipSB = new StringBuilder(); string gamemode = server.GetGameTagByPrefix("gamemode"); if (gamemode == "C") { gamemodeSB.Append(MyTexts.Get(MySpaceTexts.WorldSettings_GameModeCreative)); gamemodeToolTipSB.AppendStringBuilder(MyTexts.Get(MySpaceTexts.WorldSettings_GameModeCreative)); } else if(!string.IsNullOrWhiteSpace(gamemode)) { var multipliers = gamemode.Substring(1); var split = multipliers.Split('-'); //TODO: refactor if (split.Length == 3 && server.AppID == 244850) { gamemodeSB.Append(MyTexts.Get(MySpaceTexts.WorldSettings_GameModeSurvival)).Append(" ").Append(multipliers); gamemodeToolTipSB.AppendFormat(MyTexts.Get(MySpaceTexts.JoinGame_GameTypeToolTip_MultipliersFormat).ToString(), split[0], split[1], split[2]); } else { gamemodeSB.Append(MyTexts.Get(MySpaceTexts.WorldSettings_GameModeSurvival)); gamemodeToolTipSB.AppendStringBuilder(MyTexts.Get(MySpaceTexts.WorldSettings_GameModeSurvival)); } } ulong modCount = server.GetGameTagByPrefixUlong(MyMultiplayer.ModCountTag); string limit = server.MaxPlayers.ToString(); StringBuilder userCount = new StringBuilder(server.Players + "/" + limit); var viewDistance = server.GetGameTagByPrefix(MyMultiplayer.ViewDistanceTag); //TODO: refactor if (!String.IsNullOrEmpty(viewDistance) && server.AppID == 244850) { gamemodeToolTipSB.AppendLine(); gamemodeToolTipSB.AppendFormat(MyTexts.Get(MySpaceTexts.JoinGame_GameTypeToolTip_ViewDistance).ToString(), viewDistance); } row.AddCell(new MyGuiControlTable.Cell(text: m_textCache.Clear().Append(sessionName), userData: server.SteamID, toolTip: m_textCache.ToString())); row.AddCell(new MyGuiControlTable.Cell(text: gamemodeSB, toolTip: gamemodeToolTipSB.ToString())); row.AddCell(new MyGuiControlTable.Cell(text: m_textCache.Clear().Append(server.Name), toolTip: m_gameTypeToolTip.Clear().AppendLine(server.Name).Append(server.NetAdr.ToString()).ToString())); row.AddCell(new MyGuiControlTable.Cell(text: userCount, toolTip: userCount.ToString())); row.AddCell(new MyGuiControlTable.Cell(text: m_textCache.Clear().Append(server.Ping), toolTip: m_textCache.ToString())); row.AddCell(new MyGuiControlTable.Cell(text: m_textCache.Clear().Append(modCount == 0 ? "---" : modCount.ToString()), toolTip: MyTexts.GetString(MySpaceTexts.JoinGame_SelectServerToShowModList))); m_gamesTable.Add(row); var selectedRow = m_gamesTable.SelectedRow; m_gamesTable.Sort(false); m_gamesTable.SelectedRowIndex = m_gamesTable.FindRow(selectedRow); return true; }
bool AddServerItem(GameServerItem server, bool isFiltered = false) { if (m_allowedGroups.IsChecked && !SteamAPI.Instance.Friends.IsUserInGroup(server.GetGameTagByPrefixUlong("groupId"))) { return(false); } if (server.AppID != MySteam.AppId) { return(false); } if (!isFiltered && !string.IsNullOrWhiteSpace(m_blockSearch.Text)) // this must be here for filtering LAN games { if (!server.Name.ToLower().Contains(m_blockSearch.Text.ToLower())) { return(false); } } var row = new MyGuiControlTable.Row(server); string sessionName = server.Map; int appVersion = server.ServerVersion; m_gameTypeText.Clear(); m_gameTypeToolTip.Clear(); // Skip world without name (not fully initialized) if (string.IsNullOrEmpty(sessionName)) { return(false); } // Show only same app versions if (m_showOnlyCompatibleGames.IsChecked && appVersion != MyFinalBuildConstants.APP_VERSION) { return(false); } // Show only if the game data match string remoteHash = server.GetGameTagByPrefix("datahash"); if (m_showOnlyWithSameMods.IsChecked && MyFakes.ENABLE_MP_DATA_HASHES && remoteHash != "" && remoteHash != MyDataIntegrityChecker.GetHashBase64()) { return(false); } var gamemodeSB = new StringBuilder(); var gamemodeToolTipSB = new StringBuilder(); string gamemode = server.GetGameTagByPrefix("gamemode"); if (gamemode == "C") { gamemodeSB.Append(MyTexts.Get(MySpaceTexts.WorldSettings_GameModeCreative)); gamemodeToolTipSB.AppendStringBuilder(MyTexts.Get(MySpaceTexts.WorldSettings_GameModeCreative)); } else if (gamemode == "B") { gamemodeSB.Append(MyTexts.Get(MySpaceTexts.WorldSettings_Battle)); gamemodeToolTipSB.AppendStringBuilder(MyTexts.Get(MySpaceTexts.WorldSettings_Battle)); } else if (!string.IsNullOrWhiteSpace(gamemode)) { var multipliers = gamemode.Substring(1); var split = multipliers.Split('-'); //TODO: refactor if (split.Length == 3 && server.AppID == 244850) { gamemodeSB.Append(MyTexts.Get(MySpaceTexts.WorldSettings_GameModeSurvival)).Append(" ").Append(multipliers); gamemodeToolTipSB.AppendFormat(MyTexts.Get(MySpaceTexts.JoinGame_GameTypeToolTip_MultipliersFormat).ToString(), split[0], split[1], split[2]); } else { gamemodeSB.Append(MyTexts.Get(MySpaceTexts.WorldSettings_GameModeSurvival)); gamemodeToolTipSB.AppendStringBuilder(MyTexts.Get(MySpaceTexts.WorldSettings_GameModeSurvival)); } } ulong modCount = server.GetGameTagByPrefixUlong(MyMultiplayer.ModCountTag); string limit = server.MaxPlayers.ToString(); StringBuilder userCount = new StringBuilder(server.Players + "/" + limit); var viewDistance = server.GetGameTagByPrefix(MyMultiplayer.ViewDistanceTag); //TODO: refactor if (!String.IsNullOrEmpty(viewDistance) && server.AppID == 244850) { gamemodeToolTipSB.AppendLine(); gamemodeToolTipSB.AppendFormat(MyTexts.Get(MySpaceTexts.JoinGame_GameTypeToolTip_ViewDistance).ToString(), viewDistance); } row.AddCell(new MyGuiControlTable.Cell(text: m_textCache.Clear().Append(sessionName), userData: server.SteamID, toolTip: m_textCache.ToString())); row.AddCell(new MyGuiControlTable.Cell(text: gamemodeSB, toolTip: gamemodeToolTipSB.ToString())); row.AddCell(new MyGuiControlTable.Cell(text: m_textCache.Clear().Append(server.Name), toolTip: m_gameTypeToolTip.Clear().AppendLine(server.Name).Append(server.NetAdr.ToString()).ToString())); row.AddCell(new MyGuiControlTable.Cell(text: userCount, toolTip: userCount.ToString())); row.AddCell(new MyGuiControlTable.Cell(text: m_textCache.Clear().Append(server.Ping), toolTip: m_textCache.ToString())); row.AddCell(new MyGuiControlTable.Cell(text: m_textCache.Clear().Append(modCount == 0 ? "---" : modCount.ToString()), toolTip: MyTexts.GetString(MySpaceTexts.JoinGame_SelectServerToShowModList))); m_gamesTable.Add(row); var selectedRow = m_gamesTable.SelectedRow; m_gamesTable.Sort(false); m_gamesTable.SelectedRowIndex = m_gamesTable.FindRow(selectedRow); return(true); }
bool AddServerItem(GameServerItem server, Action onAddedServerItem, bool isFiltered = false) { if (m_allowedGroups.IsChecked && !SteamAPI.Instance.Friends.IsUserInGroup(server.GetGameTagByPrefixUlong("groupId"))) return false; if (server.AppID != MySteam.AppId) return false; if (!isFiltered && !string.IsNullOrWhiteSpace(m_blockSearch.Text)) // this must be here for filtering LAN games { if (!server.Name.ToLower().Contains(m_blockSearch.Text.ToLower())) return false; } string sessionName = server.Map; int appVersion = server.ServerVersion; m_gameTypeText.Clear(); m_gameTypeToolTip.Clear(); // Skip world without name (not fully initialized) if (string.IsNullOrEmpty(sessionName)) return false; // Show only same app versions if (m_showOnlyCompatibleGames.IsChecked && appVersion != MyFinalBuildConstants.APP_VERSION) return false; // Show only if the game data match string remoteHash = server.GetGameTagByPrefix("datahash"); if (m_showOnlyWithSameMods.IsChecked && MyFakes.ENABLE_MP_DATA_HASHES && remoteHash != "" && remoteHash != MyDataIntegrityChecker.GetHashBase64()) return false; var gamemodeSB = new StringBuilder(); var gamemodeToolTipSB = new StringBuilder(); string gamemode = server.GetGameTagByPrefix("gamemode"); if (gamemode == "C") { gamemodeSB.Append(MyTexts.Get(MySpaceTexts.WorldSettings_GameModeCreative)); gamemodeToolTipSB.AppendStringBuilder(MyTexts.Get(MySpaceTexts.WorldSettings_GameModeCreative)); } else if (gamemode == "B") { IPEndPoint endpoint = server.NetAdr; if (endpoint == null) return false; // Started battle write key value "BattleCanBeJoinedTag" "0" to server which can be accessed asynchronously from rules. MySandboxGame.Services.SteamService.SteamAPI.GetServerRules(endpoint.Address.ToIPv4NetworkOrder(), (ushort)endpoint.Port, delegate(Dictionary<string, string> rules) { if (rules == null) return; bool canBeJoined = true; string strCanBeJoined; if (rules.TryGetValue(MyMultiplayer.BattleCanBeJoinedTag, out strCanBeJoined)) { canBeJoined = strCanBeJoined != 0.ToString(); } if (canBeJoined) { gamemodeSB.Append(MyTexts.Get(MySpaceTexts.WorldSettings_Battle)); gamemodeToolTipSB.AppendStringBuilder(MyTexts.Get(MySpaceTexts.WorldSettings_Battle)); AddServerItem(server, sessionName, gamemodeSB, gamemodeToolTipSB); if (onAddedServerItem != null) onAddedServerItem(); } }, delegate() { }); return false; } else if(!string.IsNullOrWhiteSpace(gamemode)) { var multipliers = gamemode.Substring(1); var split = multipliers.Split('-'); //TODO: refactor if (split.Length == 3 && server.AppID == 244850) { gamemodeSB.Append(MyTexts.Get(MySpaceTexts.WorldSettings_GameModeSurvival)).Append(" ").Append(multipliers); gamemodeToolTipSB.AppendFormat(MyTexts.Get(MySpaceTexts.JoinGame_GameTypeToolTip_MultipliersFormat).ToString(), split[0], split[1], split[2]); } else { gamemodeSB.Append(MyTexts.Get(MySpaceTexts.WorldSettings_GameModeSurvival)); gamemodeToolTipSB.AppendStringBuilder(MyTexts.Get(MySpaceTexts.WorldSettings_GameModeSurvival)); } } AddServerItem(server, sessionName, gamemodeSB, gamemodeToolTipSB); if (onAddedServerItem != null) onAddedServerItem(); return true; }
public static void JoinGame(GameServerItem server) { MyAnalyticsHelper.SetEntry(MyGameEntryEnum.Join); if (server.ServerVersion != MyFinalBuildConstants.APP_VERSION) { var sb = new StringBuilder(); sb.AppendFormat(MyTexts.GetString(MyCommonTexts.MultiplayerError_IncorrectVersion), MyFinalBuildConstants.APP_VERSION, server.ServerVersion); MyGuiSandbox.Show(sb, MyCommonTexts.MessageBoxCaptionError); return; } if (MyFakes.ENABLE_MP_DATA_HASHES) { var serverHash = server.GetGameTagByPrefix("datahash"); if (serverHash != "" && serverHash != MyDataIntegrityChecker.GetHashBase64()) { MyGuiSandbox.Show(MyCommonTexts.MultiplayerError_DifferentData); MySandboxGame.Log.WriteLine("Different game data when connecting to server. Local hash: " + MyDataIntegrityChecker.GetHashBase64() + ", server hash: " + serverHash); return; } } UInt32 unixTimestamp = (UInt32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; SteamAPI.Instance.AddFavoriteGame(server.AppID, System.Net.IPAddressExtensions.ToIPv4NetworkOrder(server.NetAdr.Address), (UInt16)server.NetAdr.Port, (UInt16)server.NetAdr.Port, FavoriteEnum.History, unixTimestamp); MyMultiplayerClient multiplayer = new MyMultiplayerClient(server, new MySyncLayer(new MyTransportLayer(MyMultiplayer.GameEventChannel))); MyMultiplayer.Static = multiplayer; MyMultiplayer.Static.SyncLayer.AutoRegisterGameEvents = false; MyMultiplayer.Static.SyncLayer.RegisterGameEvents(); multiplayer.SendPlayerData(MySteam.UserName); string gamemode = server.GetGameTagByPrefix("gamemode"); if (MyFakes.ENABLE_BATTLE_SYSTEM && gamemode == "B") { StringBuilder text = MyTexts.Get(MySpaceTexts.DialogTextJoiningBattle); MyGuiScreenProgress progress = new MyGuiScreenProgress(text, MyCommonTexts.Cancel); MyGuiSandbox.AddScreen(progress); progress.ProgressCancelled += () => { multiplayer.Dispose(); MySessionLoader.UnloadAndExitToMenu(); }; multiplayer.OnJoin += delegate { MyJoinGameHelper.OnJoinBattle(progress, SteamSDK.Result.OK, new LobbyEnterInfo() { EnterState = LobbyEnterResponseEnum.Success }, multiplayer); }; } else { StringBuilder text = MyTexts.Get(MyCommonTexts.DialogTextJoiningWorld); MyGuiScreenProgress progress = new MyGuiScreenProgress(text, MyCommonTexts.Cancel); MyGuiSandbox.AddScreen(progress); progress.ProgressCancelled += () => { multiplayer.Dispose(); if (MyMultiplayer.Static != null) { MyMultiplayer.Static.Dispose(); } }; multiplayer.OnJoin += delegate { MyJoinGameHelper.OnJoin(progress, SteamSDK.Result.OK, new LobbyEnterInfo() { EnterState = LobbyEnterResponseEnum.Success }, multiplayer); }; } }
internal MyMultiplayerClient(GameServerItem server, MySyncLayer syncLayer) : base(syncLayer) { m_membersCollection = new MemberCollection(m_members); Server = server; ServerId = server.SteamID; SyncLayer.TransportLayer.IsBuffering = true; SyncLayer.RegisterClientEvents(this); SetReplicationLayer(new MyReplicationClient(this, CreateClientState())); syncLayer.TransportLayer.Register(MyMessageId.SERVER_DATA, ReplicationLayer.ProcessServerData); syncLayer.TransportLayer.Register(MyMessageId.REPLICATION_CREATE, OnReplicationCreate); syncLayer.TransportLayer.Register(MyMessageId.REPLICATION_DESTROY, OnReplicationDestroy); syncLayer.TransportLayer.Register(MyMessageId.SERVER_STATE_SYNC, ReplicationLayer.ProcessStateSync); syncLayer.TransportLayer.Register(MyMessageId.RPC, ReplicationLayer.ProcessEvent); syncLayer.TransportLayer.Register(MyMessageId.REPLICATION_STREAM_BEGIN, OnReplicationBeginCreate); syncLayer.TransportLayer.Register(MyMessageId.JOIN_RESULT, OnJoinResult); syncLayer.TransportLayer.Register(MyMessageId.WORLD_DATA, OnWorldData); syncLayer.TransportLayer.Register(MyMessageId.WORLD_BATTLE_DATA, OnWorldBattleData); syncLayer.TransportLayer.Register(MyMessageId.CLIENT_CONNNECTED,OnClientConnected); ClientJoined += MyMultiplayerClient_ClientJoined; ClientLeft += MyMultiplayerClient_ClientLeft; HostLeft += MyMultiplayerClient_HostLeft; Peer2Peer.ConnectionFailed += Peer2Peer_ConnectionFailed; Peer2Peer.SessionRequest += Peer2Peer_SessionRequest; m_battleData = new MyMultiplayerBattleData(this); }
/// <summary> /// Server has responded successfully and has updated data /// </summary> protected abstract void ServerResponded(GameServerItem server);