예제 #1
0
 internal override void SendGameTagsToSteam()
 {
     if (MyGameService.GameServer != null)
     {
         StringBuilder  builder  = new StringBuilder();
         MyGameModeEnum gameMode = this.GameMode;
         if (gameMode == MyGameModeEnum.Creative)
         {
             builder.Append("C");
         }
         else if (gameMode == MyGameModeEnum.Survival)
         {
             builder.Append($"S{(int) this.InventoryMultiplier}-{(int) this.BlocksInventoryMultiplier}-{(int) this.AssemblerMultiplier}-{(int) this.RefineryMultiplier}");
         }
         object[] objArray2 = new object[12];
         objArray2[0]  = "groupId";
         objArray2[1]  = base.m_groupId;
         objArray2[2]  = " version";
         objArray2[3]  = MyFinalBuildConstants.APP_VERSION;
         objArray2[4]  = " datahash";
         objArray2[5]  = MyDataIntegrityChecker.GetHashBase64();
         objArray2[6]  = " mods";
         objArray2[7]  = this.ModCount;
         objArray2[8]  = " gamemode";
         objArray2[9]  = builder;
         objArray2[10] = " view";
         objArray2[11] = this.SyncDistance;
         string tags = string.Concat(objArray2);
         MyGameService.GameServer.SetGameTags(tags);
         MyGameService.GameServer.SetGameData(MyFinalBuildConstants.APP_VERSION.ToString());
     }
 }
        void SetSetting()
        {
            switch (Setting)
            {
            case SessionSetting.CargoShips:
                MyAPIGateway.Session.SessionSettings.CargoShipsEnabled = State;
                break;

            case SessionSetting.CopyPaste:
                MyAPIGateway.Session.SessionSettings.EnableCopyPaste = State;
                break;

            case SessionSetting.Creative:
                MyGameModeEnum gameMode = State ? MyGameModeEnum.Creative : MyGameModeEnum.Survival;
                MyAPIGateway.Session.SessionSettings.GameMode = gameMode;
                break;

            case SessionSetting.Spectator:
                MyAPIGateway.Session.SessionSettings.EnableSpectator = State;
                break;

            case SessionSetting.Weapons:
                MyAPIGateway.Session.SessionSettings.WeaponsEnabled = State;
                break;

            case SessionSetting.Wolves:
                MyAPIGateway.Session.SessionSettings.EnableWolfs = State;
                break;

            case SessionSetting.Spiders:
                MyAPIGateway.Session.SessionSettings.EnableSpiders = State;
                break;
            }
        }
예제 #3
0
        public static void LoadMission(string sessionPath, bool multiplayer, MyOnlineModeEnum onlineMode, short maxPlayers,
                                       MyGameModeEnum gameMode, MyObjectBuilder_Checkpoint checkpoint, ulong checkpointSizeInBytes)
        {
            var persistentEditMode = checkpoint.Settings.ScenarioEditMode;

            checkpoint.Settings.OnlineMode       = onlineMode;
            checkpoint.Settings.MaxPlayers       = maxPlayers;
            checkpoint.Settings.Scenario         = true;
            checkpoint.Settings.GameMode         = gameMode;
            checkpoint.Settings.ScenarioEditMode = false;

            if (!MySession.IsCompatibleVersion(checkpoint))
            {
                MyLog.Default.WriteLine(MyTexts.Get(MyCommonTexts.DialogTextIncompatibleWorldVersion).ToString());
                MyGuiSandbox.AddScreen(MyGuiSandbox.CreateMessageBox(
                                           messageCaption: MyTexts.Get(MyCommonTexts.MessageBoxCaptionError),
                                           messageText: MyTexts.Get(MyCommonTexts.DialogTextIncompatibleWorldVersion),
                                           buttonType: MyMessageBoxButtonsType.OK));
                MyLog.Default.WriteLine("LoadSession() - End");
                return;
            }

            if (!MySteamWorkshop.CheckLocalModsAllowed(checkpoint.Mods, checkpoint.Settings.OnlineMode == MyOnlineModeEnum.OFFLINE))
            {
                MyLog.Default.WriteLine(MyTexts.Get(MyCommonTexts.DialogTextLocalModsDisabledInMultiplayer).ToString());
                MyGuiSandbox.AddScreen(MyGuiSandbox.CreateMessageBox(
                                           messageCaption: MyTexts.Get(MyCommonTexts.MessageBoxCaptionError),
                                           messageText: MyTexts.Get(MyCommonTexts.DialogTextLocalModsDisabledInMultiplayer),
                                           buttonType: MyMessageBoxButtonsType.OK));
                MyLog.Default.WriteLine("LoadSession() - End");
                return;
            }

            m_checkpointData = new CheckpointData()
            {
                Checkpoint         = checkpoint,
                CheckpointSize     = checkpointSizeInBytes,
                PersistentEditMode = persistentEditMode,
                SessionPath        = sessionPath,
            };

            if (checkpoint.BriefingVideo != null && checkpoint.BriefingVideo.Length > 0 && !MyFakes.XBOX_PREVIEW)
            {
                MyGuiSandbox.AddScreen(MyGuiSandbox.CreateMessageBox(
                                           messageCaption: MyTexts.Get(MySpaceTexts.MessageBoxCaptionVideo),
                                           messageText: MyTexts.Get(MySpaceTexts.MessageBoxTextWatchVideo),
                                           buttonType: MyMessageBoxButtonsType.YES_NO,
                                           callback: OnVideoMessageBox));
            }
            else
            {
                var checkpointData = m_checkpointData.Value;
                m_checkpointData = null;
                LoadMission(checkpointData);
            }
        }
예제 #4
0
        public static void LoadMission(string sessionPath, bool multiplayer, MyOnlineModeEnum onlineMode, short maxPlayers,
                                       MyGameModeEnum gameMode = MyGameModeEnum.Survival)
        {
            MyLog.Default.WriteLine("LoadSession() - Start");
            MyLog.Default.WriteLine(sessionPath);

            ulong checkpointSizeInBytes;
            var   checkpoint = MyLocalCache.LoadCheckpoint(sessionPath, out checkpointSizeInBytes);

            CheckDx11AndLoad(sessionPath, multiplayer, onlineMode, maxPlayers, gameMode, checkpoint, checkpointSizeInBytes);
        }
 private static void CheckDx11AndLoad(string sessionPath, bool multiplayer, MyOnlineModeEnum onlineMode, short maxPlayers,
     MyGameModeEnum gameMode, MyObjectBuilder_Checkpoint checkpoint, ulong checkpointSizeInBytes)
 {
     bool needsDx11 = checkpoint.RequiresDX>=11;
     if (!needsDx11 || MySandboxGame.IsDirectX11)
     {
         LoadMission(sessionPath, multiplayer, onlineMode, maxPlayers, gameMode, checkpoint, checkpointSizeInBytes);
     }
     else
     {
         MyJoinGameHelper.HandleDx11Needed();
     }
 }
예제 #6
0
        void OnServerBattleData(ref ServerBattleDataMsg msg)
        {
            Battle = true;

            m_worldName    = msg.WorldName;
            m_gameMode     = msg.GameMode;
            m_hostName     = msg.HostName;
            m_worldSize    = msg.WorldSize;
            m_appVersion   = msg.AppVersion;
            m_membersLimit = msg.MembersLimit;
            m_dataHash     = msg.DataHash;

            m_battleData.LoadData(msg.BattleData);
        }
예제 #7
0
 void OnServerData(ref ServerDataMsg msg)
 {
     m_worldName           = msg.WorldName;
     m_gameMode            = msg.GameMode;
     m_inventoryMultiplier = msg.InventoryMultiplier;
     m_assemblerMultiplier = msg.AssemblerMultiplier;
     m_refineryMultiplier  = msg.RefineryMultiplier;
     m_welderMultiplier    = msg.WelderMultiplier;
     m_grinderMultiplier   = msg.GrinderMultiplier;
     m_hostName            = msg.HostName;
     m_worldSize           = msg.WorldSize;
     m_appVersion          = msg.AppVersion;
     m_membersLimit        = msg.MembersLimit;
     m_dataHash            = msg.DataHash;
 }
예제 #8
0
 private void OnServerData(ref ServerDataMsg msg)
 {
     this.m_worldName                 = msg.WorldName;
     this.m_gameMode                  = msg.GameMode;
     this.m_inventoryMultiplier       = msg.InventoryMultiplier;
     this.m_blocksInventoryMultiplier = msg.BlocksInventoryMultiplier;
     this.m_assemblerMultiplier       = msg.AssemblerMultiplier;
     this.m_refineryMultiplier        = msg.RefineryMultiplier;
     this.m_welderMultiplier          = msg.WelderMultiplier;
     this.m_grinderMultiplier         = msg.GrinderMultiplier;
     this.m_hostName                  = msg.HostName;
     this.m_worldSize                 = msg.WorldSize;
     this.m_appVersion                = msg.AppVersion;
     this.m_membersLimit              = msg.MembersLimit;
     this.m_dataHash                  = msg.DataHash;
     this.m_serverPasswordSalt        = msg.ServerPasswordSalt;
 }
 void OnServerData(ref ServerDataMsg msg, ulong sender)
 {
     m_worldName = msg.WorldName;
     m_gameMode = msg.GameMode;
     m_inventoryMultiplier = msg.InventoryMultiplier;
     m_assemblerMultiplier = msg.AssemblerMultiplier;
     m_refineryMultiplier = msg.RefineryMultiplier;
     m_welderMultiplier = msg.WelderMultiplier;
     m_grinderMultiplier = msg.GrinderMultiplier;
     m_hostName = msg.HostName;
     m_worldSize = msg.WorldSize;
     m_appVersion = msg.AppVersion;
     m_membersLimit = msg.MembersLimit;
     m_dataHash = msg.DataHash;
 }
예제 #10
0
        private void RefreshGameList()
        {
            m_gamesTable.Clear();
            AddHeaders();

            m_textCache.Clear();
            m_gameTypeText.Clear();
            m_gameTypeToolTip.Clear();

            m_lobbyPage.Text = MyTexts.Get(MySpaceTexts.JoinGame_TabTitle_Lobbies);

            if (m_lobbies != null)
            {
                int shownGames = 0;
                for (int i = 0; i < m_lobbies.Count; ++i)
                {
                    var lobby = m_lobbies[i];
                    var row   = new MyGuiControlTable.Row(lobby);

                    string sessionName = MyMultiplayerLobby.GetLobbyWorldName(lobby);
                    ulong  sessionSize = MyMultiplayerLobby.GetLobbyWorldSize(lobby);
                    int    appVersion  = MyMultiplayerLobby.GetLobbyAppVersion(lobby);
                    int    modCount    = MyMultiplayerLobby.GetLobbyModCount(lobby);

                    var searchName = m_blockSearch.Text.Trim();
                    if (!string.IsNullOrWhiteSpace(searchName) && !sessionName.ToLower().Contains(searchName.ToLower()))
                    {
                        continue;
                    }

                    m_gameTypeText.Clear();
                    m_gameTypeToolTip.Clear();
                    //TODO: refactor - split to ME a SE versions
                    if (appVersion > 01022000 && MySteam.AppId == 244850)
                    {
                        var inventory = MyMultiplayerLobby.GetLobbyFloat(MyMultiplayer.InventoryMultiplierTag, lobby, 1);
                        var refinery  = MyMultiplayerLobby.GetLobbyFloat(MyMultiplayer.RefineryMultiplierTag, lobby, 1);
                        var assembler = MyMultiplayerLobby.GetLobbyFloat(MyMultiplayer.AssemblerMultiplierTag, lobby, 1);

                        MyGameModeEnum gameMode = MyMultiplayerLobby.GetLobbyGameMode(lobby);
                        if (MyMultiplayerLobby.GetLobbyScenario(lobby))
                        {
                            m_gameTypeText.AppendStringBuilder(MyTexts.Get(MySpaceTexts.WorldSettings_GameScenario));
                            DateTime started = MyMultiplayerLobby.GetLobbyDateTime(MyMultiplayer.ScenarioStartTimeTag, lobby, DateTime.MinValue);
                            if (started > DateTime.MinValue)
                            {
                                TimeSpan timeRunning = DateTime.UtcNow - started;
                                var      hrs         = Math.Truncate(timeRunning.TotalHours);
                                int      mins        = (int)((timeRunning.TotalHours - hrs) * 60);
                                m_gameTypeText.Append(" ").Append(hrs).Append(":").Append(mins.ToString("D2"));
                            }
                            else
                            {
                                m_gameTypeText.Append(" Lobby");
                            }
                        }
                        else
                        {
                            switch (gameMode)
                            {
                            case MyGameModeEnum.Creative:
                                m_gameTypeText.AppendStringBuilder(MyTexts.Get(MySpaceTexts.WorldSettings_GameModeCreative));
                                break;

                            case MyGameModeEnum.Survival:
                                m_gameTypeText.AppendStringBuilder(MyTexts.Get(MySpaceTexts.WorldSettings_GameModeSurvival));
                                m_gameTypeText.Append(String.Format(" {0}-{1}-{2}", inventory, assembler, refinery));
                                break;

                            default:
                                Debug.Fail("Unknown game type");
                                break;
                            }
                        }

                        m_gameTypeToolTip.AppendFormat(MyTexts.Get(MySpaceTexts.JoinGame_GameTypeToolTip_MultipliersFormat).ToString(), inventory, assembler, refinery);

                        var viewDistance = MyMultiplayerLobby.GetLobbyViewDistance(lobby);
                        m_gameTypeToolTip.AppendLine();
                        m_gameTypeToolTip.AppendFormat(MyTexts.Get(MySpaceTexts.JoinGame_GameTypeToolTip_ViewDistance).ToString(), viewDistance);
                    }
                    else
                    {
                        MyGameModeEnum gameMode = MyMultiplayerLobby.GetLobbyGameMode(lobby);

                        switch (gameMode)
                        {
                        case MyGameModeEnum.Creative:
                            m_gameTypeText.AppendStringBuilder(MyTexts.Get(MySpaceTexts.WorldSettings_GameModeCreative));
                            m_gameTypeToolTip.AppendStringBuilder(MyTexts.Get(MySpaceTexts.WorldSettings_GameModeCreative));
                            break;

                        case MyGameModeEnum.Survival:
                            bool isBattle = MyMultiplayerLobby.GetLobbyBattle(lobby);

                            if (MyFakes.ENABLE_BATTLE_SYSTEM && isBattle)
                            {
                                // Cannot join already started battles
                                bool battleCanBeJoined = MyMultiplayerLobby.GetLobbyBattleCanBeJoined(lobby);
                                if (!battleCanBeJoined)
                                {
                                    continue;
                                }

                                m_gameTypeText.AppendStringBuilder(MyTexts.Get(MySpaceTexts.WorldSettings_Battle));
                                m_gameTypeToolTip.AppendStringBuilder(MyTexts.Get(MySpaceTexts.WorldSettings_Battle));
                            }
                            else
                            {
                                m_gameTypeText.AppendStringBuilder(MyTexts.Get(MySpaceTexts.WorldSettings_GameModeSurvival));
                                m_gameTypeToolTip.AppendStringBuilder(MyTexts.Get(MySpaceTexts.WorldSettings_GameModeSurvival));
                            }
                            break;

                        default:
                            Debug.Fail("Unknown game type");
                            break;
                        }
                    }

                    // Skip world without name (not fully initialized)
                    if (string.IsNullOrEmpty(sessionName))
                    {
                        continue;
                    }

                    // Show only same app versions
                    if (m_showOnlyCompatibleGames.IsChecked && appVersion != MyFinalBuildConstants.APP_VERSION)
                    {
                        continue;
                    }

                    // Show only if the game data match
                    if (m_showOnlyWithSameMods.IsChecked && MyFakes.ENABLE_MP_DATA_HASHES && !MyMultiplayerLobby.HasSameData(lobby))
                    {
                        continue;
                    }

                    float  sessionFormattedSize = (float)sessionSize;
                    string owner     = MyMultiplayerLobby.GetLobbyHostName(lobby);
                    string limit     = lobby.MemberLimit.ToString();
                    string userCount = lobby.MemberCount + "/" + limit;

                    var prefixSize = MyUtils.FormatByteSizePrefix(ref sessionFormattedSize);

                    var modListToolTip = new StringBuilder();

                    int displayedModsMax = 15;
                    int lastMod          = Math.Min(displayedModsMax, modCount - 1);
                    foreach (var mod in MyMultiplayerLobby.GetLobbyMods(lobby))
                    {
                        if (displayedModsMax-- <= 0)
                        {
                            modListToolTip.Append("...");
                            break;
                        }

                        if (lastMod-- <= 0)
                        {
                            modListToolTip.Append(mod.FriendlyName);
                        }
                        else
                        {
                            modListToolTip.AppendLine(mod.FriendlyName);
                        }
                    }

                    //row.AddCell(new MyGuiControlTable.Cell(text: m_textCache.Clear().Append(MyMultiplayerLobby.HasSameData(lobby) ? "" : "*")));
                    row.AddCell(new MyGuiControlTable.Cell(text: m_textCache.Clear().Append(sessionName), userData: lobby.LobbyId, toolTip: m_textCache.ToString()));
                    row.AddCell(new MyGuiControlTable.Cell(text: m_gameTypeText, toolTip: (m_gameTypeToolTip.Length > 0) ? m_gameTypeToolTip.ToString() : null));
                    row.AddCell(new MyGuiControlTable.Cell(text: new StringBuilder(sessionFormattedSize.ToString("0.") + prefixSize + "B    ")));
                    row.AddCell(new MyGuiControlTable.Cell(text: m_textCache.Clear().Append(owner), toolTip: m_textCache.ToString()));
                    row.AddCell(new MyGuiControlTable.Cell(text: new StringBuilder(userCount)));
                    row.AddCell(new MyGuiControlTable.Cell(text: m_textCache.Clear().Append(modCount == 0 ? "---" : modCount.ToString()), toolTip: modListToolTip.ToString()));
                    m_gamesTable.Add(row);
                    shownGames++;
                }

                m_lobbyPage.Text = new StringBuilder().Append(MyTexts.Get(MySpaceTexts.JoinGame_TabTitle_Lobbies).ToString()).Append(" (").Append(shownGames).Append(")");
            }

            //m_gameDataLabel.Visible = m_incompatibleGameData;

            m_gamesTable.SelectedRowIndex = null;
        }
예제 #11
0
        void OnServerBattleData(ref ServerBattleDataMsg msg)
        {
            Battle = true;

            m_worldName = msg.WorldName;
            m_gameMode = msg.GameMode;
            m_hostName = msg.HostName;
            m_worldSize = msg.WorldSize;
            m_appVersion = msg.AppVersion;
            m_membersLimit = msg.MembersLimit;
            m_dataHash = msg.DataHash;

            m_battleData.LoadData(msg.BattleData);
        }
예제 #12
0
        public static void LoadMission(string sessionPath, bool multiplayer, MyOnlineModeEnum onlineMode, short maxPlayers,
            MyGameModeEnum gameMode, MyObjectBuilder_Checkpoint checkpoint, ulong checkpointSizeInBytes)
        {
            var persistentEditMode = checkpoint.Settings.ScenarioEditMode;

            checkpoint.Settings.OnlineMode = onlineMode;
            checkpoint.Settings.MaxPlayers = maxPlayers;
            checkpoint.Settings.Scenario = true;
            checkpoint.Settings.GameMode = gameMode;
            checkpoint.Settings.ScenarioEditMode = false;

            if (!MySession.IsCompatibleVersion(checkpoint))
            {
                MyLog.Default.WriteLine(MyTexts.Get(MyCommonTexts.DialogTextIncompatibleWorldVersion).ToString());
                MyGuiSandbox.AddScreen(MyGuiSandbox.CreateMessageBox(
                    messageCaption: MyTexts.Get(MyCommonTexts.MessageBoxCaptionError),
                    messageText: MyTexts.Get(MyCommonTexts.DialogTextIncompatibleWorldVersion),
                    buttonType: MyMessageBoxButtonsType.OK));
                MyLog.Default.WriteLine("LoadSession() - End");
                return;
            }

            if (!MySteamWorkshop.CheckLocalModsAllowed(checkpoint.Mods, checkpoint.Settings.OnlineMode == MyOnlineModeEnum.OFFLINE))
            {
                MyLog.Default.WriteLine(MyTexts.Get(MyCommonTexts.DialogTextLocalModsDisabledInMultiplayer).ToString());
                MyGuiSandbox.AddScreen(MyGuiSandbox.CreateMessageBox(
                    messageCaption: MyTexts.Get(MyCommonTexts.MessageBoxCaptionError),
                    messageText: MyTexts.Get(MyCommonTexts.DialogTextLocalModsDisabledInMultiplayer),
                    buttonType: MyMessageBoxButtonsType.OK));
                MyLog.Default.WriteLine("LoadSession() - End");
                return;
            }

            m_checkpointData = new CheckpointData()
            {
                Checkpoint = checkpoint,
                CheckpointSize = checkpointSizeInBytes,
                PersistentEditMode = persistentEditMode,
                SessionPath = sessionPath,
            };

            if (checkpoint.BriefingVideo != null && checkpoint.BriefingVideo.Length > 0 && !MyFakes.XBOX_PREVIEW)
            {
                MyGuiSandbox.AddScreen(MyGuiSandbox.CreateMessageBox(
                    messageCaption: MyTexts.Get(MySpaceTexts.MessageBoxCaptionVideo),
                    messageText: MyTexts.Get(MySpaceTexts.MessageBoxTextWatchVideo),
                    buttonType: MyMessageBoxButtonsType.YES_NO,
                    callback: OnVideoMessageBox));
            }
            else
            {
                var checkpointData = m_checkpointData.Value;
                m_checkpointData = null;
                LoadMission(checkpointData);
            }
        }
예제 #13
0
        public static void LoadMission(string sessionPath, bool multiplayer, MyOnlineModeEnum onlineMode, short maxPlayers,
            MyGameModeEnum gameMode = MyGameModeEnum.Survival)
        {
            MyLog.Default.WriteLine("LoadSession() - Start");
            MyLog.Default.WriteLine(sessionPath);

            ulong checkpointSizeInBytes;
            var checkpoint = MyLocalCache.LoadCheckpoint(sessionPath, out checkpointSizeInBytes);

            CheckDx11AndLoad(sessionPath, multiplayer, onlineMode, maxPlayers, gameMode, checkpoint, checkpointSizeInBytes);
            }
예제 #14
0
 private static void CheckDx11AndLoad(string sessionPath, bool multiplayer, MyOnlineModeEnum onlineMode, short maxPlayers,
     MyGameModeEnum gameMode, MyObjectBuilder_Checkpoint checkpoint, ulong checkpointSizeInBytes)
 {
     bool needsDx11 = checkpoint.RequiresDX>=11;
     if (!needsDx11 || MySandboxGame.IsDirectX11)
     {
         LoadMission(sessionPath, multiplayer, onlineMode, maxPlayers, gameMode, checkpoint, checkpointSizeInBytes);
     }
     else
     {
         MyJoinGameHelper.HandleDx11Needed();
     }
 }