using Barotrauma.Networking; using Microsoft.Xna.Framework; using System; using System.Collections.Generic; using System.Linq; namespace Barotrauma { partial class NetLobbyScreen : Screen { private SubmarineInfo selectedSub; private SubmarineInfo selectedShuttle; public bool RadiationEnabled = true; public SubmarineInfo SelectedSub { get { return selectedSub; } set { selectedSub = value; lastUpdateID++; if (GameMain.NetworkMember?.ServerSettings != null) { GameMain.NetworkMember.ServerSettings.ServerDetailsChanged = true; } } } public SubmarineInfo SelectedShuttle { get { return selectedShuttle; } set { selectedShuttle = value; lastUpdateID++; } } public GameModePreset[] GameModes { get; } private int selectedModeIndex; public int SelectedModeIndex { get { return selectedModeIndex; } set { lastUpdateID++; selectedModeIndex = MathHelper.Clamp(value, 0, GameModes.Length - 1); if (SelectedMode != GameModePreset.MultiPlayerCampaign && GameMain.GameSession?.GameMode is CampaignMode && Selected == this) { GameMain.GameSession = null; } if (GameMain.NetworkMember?.ServerSettings != null) { GameMain.NetworkMember.ServerSettings.GameModeIdentifier = SelectedModeIdentifier; GameMain.NetworkMember.ServerSettings.ServerDetailsChanged = true; } } } public Identifier SelectedModeIdentifier { get { return GameModes[SelectedModeIndex].Identifier; } set { if (SelectedModeIdentifier == value) { return; } for (int i = 0; i < GameModes.Length; i++) { if (GameModes[i].Identifier == value) { SelectedModeIndex = i; break; } } if (GameMain.NetworkMember?.ServerSettings != null) { GameMain.NetworkMember.ServerSettings.GameModeIdentifier = SelectedModeIdentifier; GameMain.NetworkMember.ServerSettings.ServerDetailsChanged = true; } } } public GameModePreset SelectedMode { get { return GameModes[SelectedModeIndex]; } } private MissionType missionType; public MissionType MissionType { get { return missionType; } set { lastUpdateID++; missionType = value; if (GameMain.NetworkMember?.ServerSettings != null) { GameMain.NetworkMember.ServerSettings.MissionType = missionType.ToString(); } } } public string MissionTypeName { get { return missionType.ToString(); } set { Enum.TryParse(value, out MissionType type); MissionType = type; } } public NetLobbyScreen() { LevelSeed = ToolBox.RandomSeed(8); subs = SubmarineInfo.SavedSubmarines .Where(s => s.Type == SubmarineType.Player && !s.HasTag(SubmarineTag.HideInMenus)) .ToList(); if (subs == null || subs.Count == 0) { throw new Exception("No submarines are available."); } selectedSub = subs.FirstOrDefault(s => !s.HasTag(SubmarineTag.Shuttle)); if (selectedSub == null) { //no subs available, use a shuttle DebugConsole.ThrowError("No full-size submarines available - choosing a shuttle as the main submarine."); selectedSub = subs[0]; } selectedShuttle = subs.First(s => s.HasTag(SubmarineTag.Shuttle)); if (selectedShuttle == null) { //no shuttles available, use a sub DebugConsole.ThrowError("No shuttles available - choosing a full-size submarine as the shuttle."); selectedShuttle = subs[0]; } DebugConsole.NewMessage("Selected sub: " + SelectedSub.Name, Color.White); DebugConsole.NewMessage("Selected shuttle: " + SelectedShuttle.Name, Color.White); GameModes = GameModePreset.List.ToArray(); } private readonly List subs; public IReadOnlyList GetSubList() => subs; public string LevelSeed { get { return levelSeed; } set { if (levelSeed == value) { return; } lastUpdateID++; levelSeed = value; LocationType.Random(new MTRandom(ToolBox.StringToInt(levelSeed))); //call to sync up with clients } } public void ToggleCampaignMode(bool enabled) { for (int i = 0; i < GameModes.Length; i++) { if ((GameModes[i] == GameModePreset.MultiPlayerCampaign) == enabled) { selectedModeIndex = i; break; } } lastUpdateID++; } public override void Select() { base.Select(); Voting.ResetVotes(GameMain.Server.ConnectedClients, resetKickVotes: false); if (SelectedMode != GameModePreset.MultiPlayerCampaign && GameMain.GameSession?.GameMode is CampaignMode && Selected == this) { GameMain.GameSession = null; } if (GameMain.Server.ServerSettings.SelectedSubmarine.IsNullOrEmpty()) { //if no sub is selected in the settings, //select the random sub we selected in the constructor GameMain.Server.ServerSettings.SelectedSubmarine = SelectedSub?.Name; } } public void RandomizeSettings() { if (GameMain.Server.ServerSettings.RandomizeSeed) { LevelSeed = ToolBox.RandomSeed(8); } //don't touch any of these settings if a campaign is running! if (GameMain.GameSession?.Campaign == null) { if (GameMain.Server.ServerSettings.SubSelectionMode == SelectionMode.Random) { var nonShuttles = SubmarineInfo.SavedSubmarines.Where(c => !c.HasTag(SubmarineTag.Shuttle) && !c.HasTag(SubmarineTag.HideInMenus) && c.IsPlayer).ToList(); SelectedSub = nonShuttles[Rand.Range(0, nonShuttles.Count)]; } if (GameMain.Server.ServerSettings.ModeSelectionMode == SelectionMode.Random) { var allowedGameModes = Array.FindAll(GameModes, m => !m.IsSinglePlayer && m != GameModePreset.MultiPlayerCampaign); SelectedModeIdentifier = allowedGameModes[Rand.Range(0, allowedGameModes.Length)].Identifier; } GameMain.Server.ServerSettings.SelectNonHiddenSubmarine(); } } } }