From 8abea5c0c723b1a31704a01f3db61cf5f2dabb43 Mon Sep 17 00:00:00 2001 From: Regalis Date: Thu, 21 Jul 2016 21:18:09 +0300 Subject: [PATCH] - gameServerSettings refactoring: using ObjectProperties for saving/loading instead of doing it manually - tabs for different types of server settings - moved banlist to server settings - option to select autorestart delay - character name is always the same as client name (less griefing potential) --- Subsurface/Source/Networking/BanList.cs | 38 +- Subsurface/Source/Networking/GameServer.cs | 14 +- .../Source/Networking/GameServerSettings.cs | 364 +++++++++++------- Subsurface/Source/Properties.cs | 31 +- Subsurface/Source/Screens/MainMenuScreen.cs | 4 +- Subsurface/Source/Screens/NetLobbyScreen.cs | 65 ++-- 6 files changed, 302 insertions(+), 214 deletions(-) diff --git a/Subsurface/Source/Networking/BanList.cs b/Subsurface/Source/Networking/BanList.cs index 35ef31005..d17591ba2 100644 --- a/Subsurface/Source/Networking/BanList.cs +++ b/Subsurface/Source/Networking/BanList.cs @@ -13,9 +13,9 @@ namespace Barotrauma.Networking private List bannedPlayers; - private GUIFrame banFrame; + private GUIComponent banFrame; - public GUIFrame BanFrame + public GUIComponent BanFrame { get { return banFrame; } } @@ -58,22 +58,13 @@ namespace Barotrauma.Networking { return bannedPlayers.FirstOrDefault(bp => bp.IP == IP)!=null; } - - public bool ToggleBanFrame(GUIButton button, object obj) + + public GUIComponent CreateBanFrame(GUIComponent parent) { - banFrame = CreateBanFrame(); + //GUIFrame banFrame = new GUIFrame(new Rectangle(0,0,0,0), null, Alignment.Center, GUI.Style, parent); - return true; - } - - private GUIFrame CreateBanFrame() - { - banFrame = new GUIFrame(new Rectangle(0,0,GameMain.GraphicsWidth,GameMain.GraphicsHeight), Color.Black*0.5f); - - GUIFrame innerFrame = new GUIFrame(new Rectangle(0,0,400,300), null, Alignment.Center, GUI.Style, banFrame); - - new GUITextBlock(new Rectangle(0, -10, 0, 30), "Banned IPs:", GUI.Style, Alignment.Left, Alignment.Left, innerFrame, false, GUI.LargeFont); - var banList = new GUIListBox(new Rectangle(0, 30, 0, 0), GUI.Style, innerFrame); + //new GUITextBlock(new Rectangle(0, -10, 0, 30), "Banned IPs:", GUI.Style, Alignment.Left, Alignment.Left, banFrame, false, GUI.LargeFont); + banFrame = new GUIListBox(new Rectangle(0,0,0,0), GUI.Style, parent); foreach (BannedPlayer bannedPlayer in bannedPlayers) { @@ -81,17 +72,17 @@ namespace Barotrauma.Networking new Rectangle(0, 0, 0, 25), bannedPlayer.IP+" ("+bannedPlayer.Name+")", GUI.Style, - Alignment.Left, Alignment.Left, banList); + Alignment.Left, Alignment.Left, banFrame); textBlock.Padding = new Vector4(10.0f, 0.0f, 0.0f, 0.0f); - textBlock.UserData = banList; + textBlock.UserData = banFrame; var removeButton = new GUIButton(new Rectangle(0,00,100,20), "Remove", Alignment.Right | Alignment.CenterY, GUI.Style, textBlock); removeButton.UserData = bannedPlayer; removeButton.OnClicked = RemoveBan; } - var closeButton = new GUIButton(new Rectangle(0,30,100,20), "Close", Alignment.BottomRight, GUI.Style, innerFrame); - closeButton.OnClicked = CloseFrame; + //var closeButton = new GUIButton(new Rectangle(0,30,100,20), "Close", Alignment.BottomRight, GUI.Style, banFrame); + //closeButton.OnClicked = CloseFrame; return banFrame; @@ -104,7 +95,12 @@ namespace Barotrauma.Networking bannedPlayers.Remove(banned); - CreateBanFrame(); + + if (banFrame != null) + { + banFrame.Parent.RemoveChild(banFrame); + CreateBanFrame(banFrame.Parent); + } return true; } diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs index 9ef055e9e..4684a84e5 100644 --- a/Subsurface/Source/Networking/GameServer.cs +++ b/Subsurface/Source/Networking/GameServer.cs @@ -290,7 +290,7 @@ namespace Barotrauma.Networking //restart if all characters are dead or submarine is at the end of the level if ((autoRestart && isCrewDead) || - (endRoundAtLevelEnd && Submarine.MainSub != null && Submarine.MainSub.AtEndPosition)) + (EndRoundAtLevelEnd && Submarine.MainSub != null && Submarine.MainSub.AtEndPosition)) { if (AutoRestart && isCrewDead) { @@ -458,7 +458,7 @@ namespace Barotrauma.Networking outmsg.Write(sender.ID); outmsg.Write(gameStarted); outmsg.Write(gameStarted && sender.Character != null); - outmsg.Write(allowSpectating); + outmsg.Write(AllowSpectating); //notify the client about other clients already logged in outmsg.Write((byte)((characterInfo == null) ? connectedClients.Count - 1 : connectedClients.Count)); @@ -549,7 +549,7 @@ namespace Barotrauma.Networking break; case (byte)PacketTypes.RequestFile: - if (!allowFileTransfers) + if (!AllowFileTransfers) { SendCancelTransferMessage(dataSender, "File transfers have been disabled by the server."); break; @@ -611,7 +611,7 @@ namespace Barotrauma.Networking UpdateVoteStatus(); break; case (byte)PacketTypes.SpectateRequest: - if (gameStarted && allowSpectating) + if (gameStarted && AllowSpectating) { var startMessage = CreateStartMessage(roundStartSeed, Submarine.MainSub, GameMain.GameSession.gameMode.Preset); server.SendMessage(startMessage, inc.SenderConnection, NetDeliveryMethod.ReliableUnordered); @@ -1098,7 +1098,7 @@ namespace Barotrauma.Networking if (autoRestart) AutoRestartTimer = 20.0f; - if (saveServerLogs) log.Save(); + if (SaveServerLogs) log.Save(); return true; } @@ -1789,7 +1789,7 @@ namespace Barotrauma.Networking public static void Log(string line, Color? color) { - if (GameMain.Server == null || !GameMain.Server.saveServerLogs) return; + if (GameMain.Server == null || !GameMain.Server.SaveServerLogs) return; GameMain.Server.log.WriteLine(line, color); } @@ -1845,7 +1845,7 @@ namespace Barotrauma.Networking restClient = null; } - if (saveServerLogs) + if (SaveServerLogs) { Log("Shutting down server...", Color.Cyan); log.Save(); diff --git a/Subsurface/Source/Networking/GameServerSettings.cs b/Subsurface/Source/Networking/GameServerSettings.cs index e1a74f496..5b0771e42 100644 --- a/Subsurface/Source/Networking/GameServerSettings.cs +++ b/Subsurface/Source/Networking/GameServerSettings.cs @@ -18,10 +18,16 @@ namespace Barotrauma.Networking No = 0, Maybe = 1, Yes = 2 } - partial class GameServer : NetworkMember + partial class GameServer : NetworkMember, IPropertyObject { public const string SettingsFile = "serversettings.xml"; + public Dictionary ObjectProperties + { + get; + private set; + } + public bool ShowNetStats; private TimeSpan refreshMasterInterval = new TimeSpan(0, 0, 30); @@ -29,7 +35,6 @@ namespace Barotrauma.Networking private SelectionMode subSelectionMode, modeSelectionMode; - private bool randomizeSeed = true; private bool registeredToMaster; @@ -38,18 +43,67 @@ namespace Barotrauma.Networking private string password; private GUIFrame settingsFrame; + private GUIFrame[] settingsTabs; + private int settingsTabIndex; public float AutoRestartTimer; private bool autoRestart; - private bool allowSpectating = true; + [HasDefaultValue(true, true)] + public bool RandomizeSeed + { + get; + private set; + } - private bool endRoundAtLevelEnd = true; + [HasDefaultValue(60.0f, true)] + public float AutoRestartInterval + { + get; + private set; + } - private bool saveServerLogs = true; + [HasDefaultValue(true, true)] + public bool AllowSpectating + { + get; + private set; + } - private bool allowFileTransfers = true; + [HasDefaultValue(true, true)] + public bool EndRoundAtLevelEnd + { + get; + private set; + } + + [HasDefaultValue(true, true)] + public bool SaveServerLogs + { + get; + private set; + } + + [HasDefaultValue(true, true)] + public bool AllowFileTransfers + { + get; + private set; + } + + [HasDefaultValue(800, true)] + private int LinesPerLogFile + { + get + { + return log.LinesPerFile; + } + set + { + log.LinesPerFile = value; + } + } public bool AutoRestart { @@ -58,7 +112,7 @@ namespace Barotrauma.Networking { autoRestart = value; - AutoRestartTimer = autoRestart ? 20.0f : 0.0f; + AutoRestartTimer = autoRestart ? AutoRestartInterval : 0.0f; } } @@ -68,6 +122,7 @@ namespace Barotrauma.Networking set; } + [HasDefaultValue(true, true)] public bool AllowRespawn { get; @@ -83,22 +138,12 @@ namespace Barotrauma.Networking { get { return modeSelectionMode; } } - - public bool RandomizeSeed - { - get { return randomizeSeed; } - } - + public BanList BanList { get { return banList; } } - - public bool AllowSpectating - { - get { return allowSpectating; } - } - + public bool AllowVoteKick { get; @@ -111,54 +156,36 @@ namespace Barotrauma.Networking private void SaveSettings() { + XDocument doc = new XDocument(new XElement("serversettings")); + + ObjectProperty.SaveProperties(this, doc.Root, true); + + doc.Root.SetAttributeValue("SubSelection", subSelectionMode.ToString()); + doc.Root.SetAttributeValue("ModeSelection", modeSelectionMode.ToString()); + + doc.Root.SetAttributeValue("MaxFileTransferDuration", FileStreamSender.MaxTransferDuration.TotalSeconds); + XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.NewLineOnAttributes = true; using (var writer = XmlWriter.Create(SettingsFile, settings)) { - writer.WriteStartElement("serversettings"); - writer.WriteAttributeString("AllowSpectating", allowSpectating.ToString()); - writer.WriteAttributeString("RandomizeSeed", randomizeSeed.ToString()); - - writer.WriteAttributeString("EndRoundAtLevelEnd", endRoundAtLevelEnd.ToString()); - writer.WriteAttributeString("AllowFileTransfers", allowFileTransfers.ToString()); - writer.WriteAttributeString("MaxFileTransferDuration", ((int)FileStreamSender.MaxTransferDuration.TotalSeconds).ToString()); - writer.WriteAttributeString("SaveServerLogs", saveServerLogs.ToString()); - writer.WriteAttributeString("LinesPerLogFile", log.LinesPerFile.ToString()); - writer.WriteAttributeString("SubSelection", subSelectionMode.ToString()); - writer.WriteAttributeString("ModeSelection", modeSelectionMode.ToString()); - - writer.WriteAttributeString("AllowRespawn", AllowRespawn.ToString()); - - writer.Flush(); + doc.Save(writer); } } private void LoadSettings() { XDocument doc = null; - if (System.IO.File.Exists(SettingsFile)) - { - doc = ToolBox.TryLoadXml(SettingsFile); - } - else - { - return; - } + doc = ToolBox.TryLoadXml(SettingsFile); - if (doc == null) + if (doc == null || doc.Root == null) { doc = new XDocument(new XElement("serversettings")); } - allowSpectating = ToolBox.GetAttributeBool(doc.Root, "AllowSpectating", true); - randomizeSeed = ToolBox.GetAttributeBool(doc.Root, "RandomizeSeed", true); - endRoundAtLevelEnd = ToolBox.GetAttributeBool(doc.Root, "EndRoundAtLevelEnd", true); - allowFileTransfers = ToolBox.GetAttributeBool(doc.Root, "AllowFileTransfers", true); - - saveServerLogs = ToolBox.GetAttributeBool(doc.Root, "SaveServerLogs", true); - log.LinesPerFile = ToolBox.GetAttributeInt(doc.Root, "LinesPerLogFile", 800); + ObjectProperties = ObjectProperty.InitProperties(this, doc.Root); subSelectionMode = SelectionMode.Manual; Enum.TryParse(ToolBox.GetAttributeString(doc.Root, "SubSelection", "Manual"), out subSelectionMode); @@ -167,9 +194,7 @@ namespace Barotrauma.Networking modeSelectionMode = SelectionMode.Manual; Enum.TryParse(ToolBox.GetAttributeString(doc.Root, "ModeSelection", "Manual"), out modeSelectionMode); Voting.AllowModeVoting = modeSelectionMode == SelectionMode.Vote; - - AllowRespawn = ToolBox.GetAttributeBool(doc.Root, "AllowRespawn", true); - + FileStreamSender.MaxTransferDuration = new TimeSpan(0,0,ToolBox.GetAttributeInt(doc.Root, "MaxFileTransferDuration", 150)); } @@ -180,18 +205,72 @@ namespace Barotrauma.Networking GUIFrame innerFrame = new GUIFrame(new Rectangle(0, 0, 400, 420), null, Alignment.Center, GUI.Style, settingsFrame); innerFrame.Padding = new Vector4(20.0f, 20.0f, 20.0f, 20.0f); - new GUITextBlock(new Rectangle(0, -5, 0, 20), "Server settings", GUI.Style, innerFrame, GUI.LargeFont); + new GUITextBlock(new Rectangle(0, -5, 0, 20), "Settings", GUI.Style, innerFrame, GUI.LargeFont); - int y = 40; + string[] tabNames = { "Rounds", "Server", "Banlist" }; + settingsTabs = new GUIFrame[tabNames.Length]; + for (int i = 0; i < tabNames.Length; i++) + { + settingsTabs[i] = new GUIFrame(new Rectangle(0, 15, 0, innerFrame.Rect.Height - 120), null, Alignment.Center, GUI.Style, innerFrame); + settingsTabs[i].Padding = new Vector4(40.0f, 20.0f, 40.0f, 40.0f); - var endBox = new GUITickBox(new Rectangle(0, y, 20, 20), "End round when destination reached", Alignment.Left, innerFrame); - endBox.Selected = endRoundAtLevelEnd; - endBox.OnSelected = (GUITickBox) => { endRoundAtLevelEnd = GUITickBox.Selected; return true; }; + var tabButton = new GUIButton(new Rectangle(105 * i, 35, 100, 20), tabNames[i], GUI.Style, innerFrame); + tabButton.UserData = i; + tabButton.OnClicked = SelectSettingsTab; + } + settingsTabs[2].Padding = Vector4.Zero; + + //var gameTabButton = new GUIButton(new Rectangle(0, 35, 100, 20), "Rounds", GUI.Style, innerFrame); + //gameTabButton.UserData = 0; + //gameTabButton.OnClicked = SelectSettingsTab; + + //var serverTabButton = new GUIButton(new Rectangle(105, 35, 100, 20), "Server", GUI.Style, innerFrame); + //serverTabButton.UserData = 1; + //serverTabButton.OnClicked = SelectSettingsTab; + + SelectSettingsTab(null, 0); + + var closeButton = new GUIButton(new Rectangle(10, 10, 100, 20), "Close", Alignment.BottomRight, GUI.Style, innerFrame); + closeButton.OnClicked = ToggleSettingsFrame; + + //-------------------------------------------------------------------------------- + // game settings + //-------------------------------------------------------------------------------- + + int y = 0; + + new GUITextBlock(new Rectangle(0, y, 100, 20), "Submarine selection:", GUI.Style, settingsTabs[0]); + var selectionFrame = new GUIFrame(new Rectangle(0, y + 20, 300, 20), null, settingsTabs[0]); + for (int i = 0; i < 3; i++) + { + var selectionTick = new GUITickBox(new Rectangle(i * 100, 0, 20, 20), ((SelectionMode)i).ToString(), Alignment.Left, selectionFrame); + selectionTick.Selected = i == (int)subSelectionMode; + selectionTick.OnSelected = SwitchSubSelection; + selectionTick.UserData = (SelectionMode)i; + } + + y += 45; + + new GUITextBlock(new Rectangle(0, y, 100, 20), "Mode selection:", GUI.Style, settingsTabs[0]); + selectionFrame = new GUIFrame(new Rectangle(0, y + 20, 300, 20), null, settingsTabs[0]); + for (int i = 0; i < 3; i++) + { + var selectionTick = new GUITickBox(new Rectangle(i * 100, 0, 20, 20), ((SelectionMode)i).ToString(), Alignment.Left, selectionFrame); + selectionTick.Selected = i == (int)modeSelectionMode; + selectionTick.OnSelected = SwitchModeSelection; + selectionTick.UserData = (SelectionMode)i; + } + + y += 60; + + var endBox = new GUITickBox(new Rectangle(0, y, 20, 20), "End round when destination reached", Alignment.Left, settingsTabs[0]); + endBox.Selected = EndRoundAtLevelEnd; + endBox.OnSelected = (GUITickBox) => { EndRoundAtLevelEnd = GUITickBox.Selected; return true; }; y += 30; - var endVoteBox = new GUITickBox(new Rectangle(0, y, 20, 20), "End round by voting", Alignment.Left, innerFrame); + var endVoteBox = new GUITickBox(new Rectangle(0, y, 20, 20), "End round by voting", Alignment.Left, settingsTabs[0]); endVoteBox.Selected = Voting.AllowEndVoting; endVoteBox.OnSelected = (GUITickBox) => { @@ -200,20 +279,10 @@ namespace Barotrauma.Networking return true; }; - y += 30; - var respawnBox = new GUITickBox(new Rectangle(0, y, 20, 20), "Allow respawning", Alignment.Left, innerFrame); - respawnBox.Selected = AllowRespawn; - respawnBox.OnSelected = (GUITickBox) => - { - AllowRespawn = !AllowRespawn; - return true; - }; + var votesRequiredText = new GUITextBlock(new Rectangle(20, y + 20, 20, 20), "Votes required: 50 %", GUI.Style, settingsTabs[0], GUI.SmallFont); - - var votesRequiredText = new GUITextBlock(new Rectangle(20, y + 20, 20, 20), "Votes required: 50 %", GUI.Style, innerFrame, GUI.SmallFont); - - var votesRequiredSlider = new GUIScrollBar(new Rectangle(150, y + 22, 100, 10), GUI.Style, 0.1f, innerFrame); + var votesRequiredSlider = new GUIScrollBar(new Rectangle(150, y + 22, 100, 10), GUI.Style, 0.1f, settingsTabs[0]); votesRequiredSlider.UserData = votesRequiredText; votesRequiredSlider.Step = 0.2f; votesRequiredSlider.BarScroll = (EndVoteRequiredRatio - 0.5f) * 2.0f; @@ -229,7 +298,66 @@ namespace Barotrauma.Networking y += 40; - var voteKickBox = new GUITickBox(new Rectangle(0, y, 20, 20), "Allow vote kicking", Alignment.Left, innerFrame); + var respawnBox = new GUITickBox(new Rectangle(0, y, 20, 20), "Allow respawning", Alignment.Left, settingsTabs[0]); + respawnBox.Selected = AllowRespawn; + respawnBox.OnSelected = (GUITickBox) => + { + AllowRespawn = !AllowRespawn; + return true; + }; + + y += 40; + + + var randomizeLevelBox = new GUITickBox(new Rectangle(0, y, 20, 20), "Randomize level seed between rounds", Alignment.Left, settingsTabs[0]); + randomizeLevelBox.Selected = RandomizeSeed; + randomizeLevelBox.OnSelected = (GUITickBox) => + { + RandomizeSeed = GUITickBox.Selected; + return true; + }; + + y += 40; + + + //-------------------------------------------------------------------------------- + // game settings + //-------------------------------------------------------------------------------- + + y = 0; + + + var startIntervalText = new GUITextBlock(new Rectangle(-10, y, 100, 20), "Autorestart delay", GUI.Style, settingsTabs[1]); + var startIntervalSlider = new GUIScrollBar(new Rectangle(10, y + 22, 100, 10), GUI.Style, 0.1f, settingsTabs[1]); + startIntervalSlider.UserData = startIntervalText; + startIntervalSlider.Step = 0.1f; + startIntervalSlider.BarScroll = AutoRestartInterval / 300.0f; + startIntervalSlider.OnMoved = (GUIScrollBar scrollBar, float barScroll) => + { + GUITextBlock text = scrollBar.UserData as GUITextBlock; + + AutoRestartInterval = Math.Max(barScroll * 300.0f, 10.0f); + + var timeSpan = new TimeSpan(0, 0, (int)AutoRestartInterval); + + text.Text = "Autorestart delay: " + timeSpan.ToString("mm':'ss"); + return true; + }; + startIntervalSlider.OnMoved(startIntervalSlider, startIntervalSlider.BarScroll); + + y += 45; + + var allowSpecBox = new GUITickBox(new Rectangle(0, y, 20, 20), "Allow spectating", Alignment.Left, settingsTabs[1]); + allowSpecBox.Selected = AllowSpectating; + allowSpecBox.OnSelected = (GUITickBox) => + { + AllowSpectating = GUITickBox.Selected; + return true; + }; + + y += 40; + + var voteKickBox = new GUITickBox(new Rectangle(0, y, 20, 20), "Allow vote kicking", Alignment.Left, settingsTabs[1]); voteKickBox.Selected = Voting.AllowVoteKick; voteKickBox.OnSelected = (GUITickBox) => { @@ -238,9 +366,9 @@ namespace Barotrauma.Networking return true; }; - var kickVotesRequiredText = new GUITextBlock(new Rectangle(20, y + 20, 20, 20), "Votes required: 50 %", GUI.Style, innerFrame, GUI.SmallFont); + var kickVotesRequiredText = new GUITextBlock(new Rectangle(20, y + 20, 20, 20), "Votes required: 50 %", GUI.Style, settingsTabs[1], GUI.SmallFont); - var kickVoteSlider = new GUIScrollBar(new Rectangle(150, y + 22, 100, 10), GUI.Style, 0.1f, innerFrame); + var kickVoteSlider = new GUIScrollBar(new Rectangle(150, y + 22, 100, 10), GUI.Style, 0.1f, settingsTabs[1]); kickVoteSlider.UserData = kickVotesRequiredText; kickVoteSlider.Step = 0.2f; kickVoteSlider.BarScroll = (KickVoteRequiredRatio - 0.5f) * 2.0f; @@ -254,75 +382,35 @@ namespace Barotrauma.Networking }; kickVoteSlider.OnMoved(kickVoteSlider, kickVoteSlider.BarScroll); - y += 40; - - var randomizeLevelBox = new GUITickBox(new Rectangle(0, y, 20, 20), "Randomize level seed between rounds", Alignment.Left, innerFrame); - randomizeLevelBox.Selected = randomizeSeed; - randomizeLevelBox.OnSelected = (GUITickBox) => - { - randomizeSeed = GUITickBox.Selected; - return true; - }; - - y += 40; - - var shareSubsBox = new GUITickBox(new Rectangle(0, y, 20, 20), "Share submarine files with players", Alignment.Left, innerFrame); - shareSubsBox.Selected = allowFileTransfers; - shareSubsBox.OnSelected = (GUITickBox) => - { - allowFileTransfers = GUITickBox.Selected; - return true; - }; - - - y += 40; - - - new GUITextBlock(new Rectangle(0, y, 100, 20), "Submarine selection:", GUI.Style, innerFrame); - var selectionFrame = new GUIFrame(new Rectangle(0, y+20, 300, 20), null, innerFrame); - for (int i = 0; i<3; i++) - { - var selectionTick = new GUITickBox(new Rectangle(i * 100, 0, 20, 20), ((SelectionMode)i).ToString(), Alignment.Left, selectionFrame); - selectionTick.Selected = i == (int)subSelectionMode; - selectionTick.OnSelected = SwitchSubSelection; - selectionTick.UserData = (SelectionMode)i; - } - y += 45; - new GUITextBlock(new Rectangle(0, y, 100, 20), "Mode selection:", GUI.Style, innerFrame); - selectionFrame = new GUIFrame(new Rectangle(0, y+20, 300, 20), null, innerFrame); - for (int i = 0; i<3; i++) + var shareSubsBox = new GUITickBox(new Rectangle(0, y, 20, 20), "Share submarine files with players", Alignment.Left, settingsTabs[1]); + shareSubsBox.Selected = AllowFileTransfers; + shareSubsBox.OnSelected = (GUITickBox) => { - var selectionTick = new GUITickBox(new Rectangle(i*100, 0, 20, 20), ((SelectionMode)i).ToString(), Alignment.Left, selectionFrame); - selectionTick.Selected = i == (int)modeSelectionMode; - selectionTick.OnSelected = SwitchModeSelection; - selectionTick.UserData = (SelectionMode)i; - } - - y += 60; - - var allowSpecBox = new GUITickBox(new Rectangle(0, y, 20, 20), "Allow spectating", Alignment.Left, innerFrame); - allowSpecBox.Selected = allowSpectating; - allowSpecBox.OnSelected = (GUITickBox) => - { - allowSpectating = GUITickBox.Selected; + AllowFileTransfers = GUITickBox.Selected; return true; }; - y += 30; - var saveLogsBox = new GUITickBox(new Rectangle(0, y, 20, 20), "Save server logs", Alignment.Left, innerFrame); - saveLogsBox.Selected = saveServerLogs; + y += 40; + + var saveLogsBox = new GUITickBox(new Rectangle(0, y, 20, 20), "Save server logs", Alignment.Left, settingsTabs[1]); + saveLogsBox.Selected = SaveServerLogs; saveLogsBox.OnSelected = (GUITickBox) => { - saveServerLogs = GUITickBox.Selected; - showLogButton.Visible = saveServerLogs; + SaveServerLogs = GUITickBox.Selected; + showLogButton.Visible = SaveServerLogs; return true; }; - - var closeButton = new GUIButton(new Rectangle(0, 0, 100, 20), "Close", Alignment.BottomRight, GUI.Style, innerFrame); - closeButton.OnClicked = ToggleSettingsFrame; + + + //-------------------------------------------------------------------------------- + // banlist + //-------------------------------------------------------------------------------- + + + banList.CreateBanFrame(settingsTabs[2]); } private bool SwitchSubSelection(GUITickBox tickBox) @@ -345,6 +433,18 @@ namespace Barotrauma.Networking return true; } + private bool SelectSettingsTab(GUIButton button, object obj) + { + settingsTabIndex = (int)obj; + + for (int i = 0; i < settingsTabs.Length; i++ ) + { + settingsTabs[i].Visible = i == settingsTabIndex; + } + + return true; + } + private bool SwitchModeSelection(GUITickBox tickBox) { modeSelectionMode = (SelectionMode)tickBox.UserData; diff --git a/Subsurface/Source/Properties.cs b/Subsurface/Source/Properties.cs index 42ee6c224..6308624fd 100644 --- a/Subsurface/Source/Properties.cs +++ b/Subsurface/Source/Properties.cs @@ -247,7 +247,7 @@ namespace Barotrauma return dictionary; } - public static void SaveProperties(IPropertyObject obj, XElement element) + public static void SaveProperties(IPropertyObject obj, XElement element, bool saveIfDefault = false) { var saveProperties = GetProperties(obj); foreach (var property in saveProperties) @@ -255,22 +255,25 @@ namespace Barotrauma object value = property.GetValue(); if (value == null) continue; - //only save - // - if the attribute is saveable - // - and it's different from the default value or can be changed in the editor - bool save = false; - foreach (var attribute in property.Attributes.OfType()) + if (!saveIfDefault) { - if (!attribute.isSaveable) continue; - - if (!attribute.defaultValue.Equals(value) || property.Attributes.OfType().Any()) + //only save + // - if the attribute is saveable + // - and it's different from the default value or can be changed in the editor + bool save = false; + foreach (var attribute in property.Attributes.OfType()) { - save = true; - break; - } - } + if (!attribute.isSaveable) continue; - if (!save) continue; + if (!attribute.defaultValue.Equals(value) || property.Attributes.OfType().Any()) + { + save = true; + break; + } + } + + if (!save) continue; + } string stringValue; if (value is float) diff --git a/Subsurface/Source/Screens/MainMenuScreen.cs b/Subsurface/Source/Screens/MainMenuScreen.cs index 250ab5554..f61f6daa6 100644 --- a/Subsurface/Source/Screens/MainMenuScreen.cs +++ b/Subsurface/Source/Screens/MainMenuScreen.cs @@ -111,7 +111,6 @@ namespace Barotrauma saveNameBox = new GUITextBox(new Rectangle((int)(mapList.Rect.Width + 30), 30, 180, 20), Alignment.TopLeft, GUI.Style, menuTabs[(int)Tab.NewGame]); - saveNameBox.Text = SaveUtil.CreateSavePath(); new GUITextBlock(new Rectangle((int)(mapList.Rect.Width + 20), 60, 100, 20), "Map Seed: ", GUI.Style, Alignment.Left, Alignment.Left, menuTabs[(int)Tab.NewGame]); @@ -236,6 +235,9 @@ namespace Barotrauma switch (selectedTab) { + case (int)Tab.NewGame: + saveNameBox.Text = SaveUtil.CreateSavePath(); + break; case (int)Tab.LoadGame: UpdateLoadScreen(); break; diff --git a/Subsurface/Source/Screens/NetLobbyScreen.cs b/Subsurface/Source/Screens/NetLobbyScreen.cs index 626bbff1d..5033aa858 100644 --- a/Subsurface/Source/Screens/NetLobbyScreen.cs +++ b/Subsurface/Source/Screens/NetLobbyScreen.cs @@ -345,7 +345,7 @@ namespace Barotrauma infoFrame.RemoveChild(infoFrame.children.Find(c => c.UserData as string == "settingsButton")); infoFrame.RemoveChild(infoFrame.children.Find(c => c.UserData as string == "spectateButton")); - playerList.Parent.RemoveChild(playerList.Parent.children.Find(c => c.UserData as string == "banListButton")); + //playerList.Parent.RemoveChild(playerList.Parent.children.Find(c => c.UserData as string == "banListButton")); if (IsServer && GameMain.Server != null) { @@ -370,9 +370,6 @@ namespace Barotrauma settingsButton.OnClicked = GameMain.Server.ToggleSettingsFrame; settingsButton.UserData = "settingsButton"; - var banListButton = new GUIButton(new Rectangle(0, 30, 100, 20), "Banned IPs", Alignment.BottomRight, GUI.Style, playerList.Parent); - banListButton.OnClicked = GameMain.Server.BanList.ToggleBanFrame; - banListButton.UserData = "banListButton"; if (subList.CountChildren > 0 && subList.Selected == null) { @@ -428,11 +425,11 @@ namespace Barotrauma playYourself.UserData = "playyourself"; } - new GUITextBlock(new Rectangle(100, 30, 200, 30), "Name: ", GUI.Style, myPlayerFrame); + //new GUITextBlock(new Rectangle(100, 30, 200, 30), "Name: ", GUI.Style, myPlayerFrame); - GUITextBox playerName = new GUITextBox(new Rectangle(100, 55, 0, 20), Alignment.TopLeft, GUI.Style, myPlayerFrame); - playerName.Text = characterInfo.Name; - playerName.OnEnterPressed += ChangeCharacterName; + //GUITextBox playerName = new GUITextBox(new Rectangle(100, 55, 0, 20), Alignment.TopLeft, GUI.Style, myPlayerFrame); + //playerName.Text = characterInfo.Name; + //playerName.OnEnterPressed += ChangeCharacterName; GUIButton toggleHead = new GUIButton(new Rectangle(0, 50, 15, 15), "<", GUI.Style, myPlayerFrame); toggleHead.UserData = -1; @@ -441,21 +438,21 @@ namespace Barotrauma toggleHead.UserData = 1; toggleHead.OnClicked = ToggleHead; - new GUITextBlock(new Rectangle(0, 90, 200, 30), "Gender: ", GUI.Style, myPlayerFrame); + new GUITextBlock(new Rectangle(100, 30, 200, 30), "Gender: ", GUI.Style, myPlayerFrame); - GUIButton maleButton = new GUIButton(new Rectangle(0, 110, 60, 20), "Male", + GUIButton maleButton = new GUIButton(new Rectangle(100, 50, 60, 20), "Male", Alignment.TopLeft, GUI.Style, myPlayerFrame); maleButton.UserData = Gender.Male; maleButton.OnClicked += SwitchGender; - GUIButton femaleButton = new GUIButton(new Rectangle(70, 110, 60, 20), "Female", + GUIButton femaleButton = new GUIButton(new Rectangle(170, 50, 60, 20), "Female", Alignment.TopLeft, GUI.Style, myPlayerFrame); femaleButton.UserData = Gender.Female; femaleButton.OnClicked += SwitchGender; - new GUITextBlock(new Rectangle(0, 150, 200, 30), "Job preferences:", GUI.Style, myPlayerFrame); + new GUITextBlock(new Rectangle(0, 120, 20, 30), "Job preferences:", GUI.Style, myPlayerFrame); - jobList = new GUIListBox(new Rectangle(0, 180, 0, 0), GUI.Style, myPlayerFrame); + jobList = new GUIListBox(new Rectangle(0, 150, 0, 0), GUI.Style, myPlayerFrame); jobList.Enabled = false; @@ -798,12 +795,7 @@ namespace Barotrauma { autoRestartTimer = Math.Max(autoRestartTimer - (float)deltaTime, 0.0f); } - - if (GameMain.Server != null && GameMain.Server.BanList != null) - { - if (GameMain.Server.BanList.BanFrame != null) GameMain.Server.BanList.BanFrame.Update((float)deltaTime); - } - + if (valueChanged && GameMain.Server != null) { networkUpdateTimer -= (float)deltaTime; @@ -839,12 +831,7 @@ namespace Barotrauma //if (previewPlayer!=null) previewPlayer.Draw(spriteBatch); if (playerFrame != null) playerFrame.Draw(spriteBatch); - - if (GameMain.Server!=null && GameMain.Server.BanList!=null) - { - if (GameMain.Server.BanList.BanFrame != null) GameMain.Server.BanList.BanFrame.Draw(spriteBatch); - } - + GUI.Draw((float)deltaTime, spriteBatch, null); spriteBatch.End(); @@ -949,24 +936,24 @@ namespace Barotrauma return true; } - private bool ChangeCharacterName(GUITextBox textBox, string newName) - { - if (string.IsNullOrEmpty(newName)) return false; + //private bool ChangeCharacterName(GUITextBox textBox, string newName) + //{ + // if (string.IsNullOrEmpty(newName)) return false; - if (GameMain.NetworkMember == null || GameMain.NetworkMember.CharacterInfo == null) return true; + // if (GameMain.NetworkMember == null || GameMain.NetworkMember.CharacterInfo == null) return true; - GameMain.NetworkMember.CharacterInfo.Name = newName; - if (GameMain.Client != null) - { - GameMain.Client.Name = newName; - GameMain.Client.SendCharacterData(); - } + // GameMain.NetworkMember.CharacterInfo.Name = newName; + // if (GameMain.Client != null) + // { + // GameMain.Client.Name = newName; + // GameMain.Client.SendCharacterData(); + // } - textBox.Text = newName; - textBox.Selected = false; + // textBox.Text = newName; + // textBox.Selected = false; - return true; - } + // return true; + //} private bool ViewJobInfo(GUIButton button, object obj) {