diff --git a/Barotrauma/BarotraumaServer/Source/GameMain.cs b/Barotrauma/BarotraumaServer/Source/GameMain.cs index d9e8b9c43..ab24be3ef 100644 --- a/Barotrauma/BarotraumaServer/Source/GameMain.cs +++ b/Barotrauma/BarotraumaServer/Source/GameMain.cs @@ -3,6 +3,7 @@ using FarseerPhysics.Dynamics; using Microsoft.Xna.Framework; using System; using System.Collections.Generic; +using System.Diagnostics; using System.Reflection; using System.Threading; using System.Xml.Linq; @@ -133,24 +134,32 @@ namespace Barotrauma Timing.Accumulator = 0.0; - DateTime prevTime = DateTime.Now; - + double frequency = (double)Stopwatch.Frequency; + if (frequency <= 1500) + { + DebugConsole.NewMessage("WARNING: Stopwatch frequency under 1500 ticks per second. Expect significant syncing accuracy issues.", Color.Yellow); + } + + Stopwatch stopwatch = Stopwatch.StartNew(); + long prevTicks = stopwatch.ElapsedTicks; while (ShouldRun) { - Timing.Accumulator += ((float)(DateTime.Now.Subtract(prevTime).Milliseconds) / 1000.0)/Timing.Step; - prevTime = DateTime.Now; - while (Timing.Accumulator>0.0) + long currTicks = stopwatch.ElapsedTicks; + Timing.Accumulator += (double)(currTicks - prevTicks) / frequency; + prevTicks = currTicks; + while (Timing.Accumulator>=Timing.Step) { DebugConsole.Update(); if (Screen.Selected != null) Screen.Selected.Update((float)Timing.Step); Server.Update((float)Timing.Step); CoroutineManager.Update((float)Timing.Step, (float)Timing.Step); - - Timing.Accumulator -= 1.0; + + Timing.Accumulator -= Timing.Step; } - int frameTime = DateTime.Now.Subtract(prevTime).Milliseconds; - Thread.Sleep(Math.Max((int)(Timing.Step * 1000.0) - frameTime/2,0)); + int frameTime = (int)(((double)(stopwatch.ElapsedTicks - prevTicks) / frequency)*1000.0); + Thread.Sleep(Math.Max(((int)(Timing.Step * 1000.0) - frameTime)/2,0)); } + stopwatch.Stop(); CloseServer(); @@ -168,7 +177,7 @@ namespace Barotrauma } } - public CoroutineHandle ShowLoading(IEnumerable loader, bool waitKeyHit = true) + public CoroutineHandle ShowLoadings(IEnumerable loader, bool waitKeyHit = true) { return CoroutineManager.StartCoroutine(loader); } diff --git a/Barotrauma/BarotraumaShared/Source/Networking/GameServerSettings.cs b/Barotrauma/BarotraumaShared/Source/Networking/GameServerSettings.cs index d6fe0543f..2d8560cae 100644 --- a/Barotrauma/BarotraumaShared/Source/Networking/GameServerSettings.cs +++ b/Barotrauma/BarotraumaShared/Source/Networking/GameServerSettings.cs @@ -18,7 +18,7 @@ namespace Barotrauma.Networking { No = 0, Maybe = 1, Yes = 2 } - + partial class GameServer : NetworkMember, ISerializableEntity { private class SavedClientPermission @@ -48,7 +48,7 @@ namespace Barotrauma.Networking get; private set; } - + public Dictionary extraCargo; public bool ShowNetStats; @@ -57,24 +57,24 @@ namespace Barotrauma.Networking private TimeSpan sparseUpdateInterval = new TimeSpan(0, 0, 0, 3); private SelectionMode subSelectionMode, modeSelectionMode; - + private bool registeredToMaster; private WhiteList whitelist; private BanList banList; private string password; - + public float AutoRestartTimer; - + private bool autoRestart; private bool isPublic; private int maxPlayers; - + private List clientPermissions = new List(); - + [Serialize(true, true)] public bool RandomizeSeed { @@ -170,7 +170,7 @@ namespace Barotrauma.Networking AutoRestartTimer = autoRestart ? AutoRestartInterval : 0.0f; } } - + [Serialize(true, true)] public bool AllowRespawn { @@ -193,7 +193,7 @@ namespace Barotrauma.Networking { get { return modeSelectionMode; } } - + public BanList BanList { get { return banList; } @@ -234,7 +234,7 @@ namespace Barotrauma.Networking private set; } - [Serialize(false,true)] + [Serialize(false, true)] public bool KarmaEnabled { get; @@ -246,7 +246,7 @@ namespace Barotrauma.Networking XDocument doc = new XDocument(new XElement("serversettings")); SerializableProperty.SerializeProperties(this, doc.Root, true); - + doc.Root.SetAttributeValue("name", name); doc.Root.SetAttributeValue("public", isPublic); doc.Root.SetAttributeValue("port", config.Port); @@ -257,7 +257,7 @@ namespace Barotrauma.Networking doc.Root.SetAttributeValue("SubSelection", subSelectionMode.ToString()); doc.Root.SetAttributeValue("ModeSelection", modeSelectionMode.ToString()); - + doc.Root.SetAttributeValue("TraitorsEnabled", TraitorsEnabled.ToString()); #if SERVER @@ -272,7 +272,7 @@ namespace Barotrauma.Networking { doc.Root.SetAttributeValue("ServerMessage", GameMain.NetLobbyScreen.ServerMessageText); } - + XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.NewLineOnAttributes = true; @@ -289,7 +289,7 @@ namespace Barotrauma.Networking if (File.Exists(SettingsFile)) { doc = XMLExtensions.TryLoadXml(SettingsFile); - } + } if (doc == null || doc.Root == null) { @@ -318,13 +318,16 @@ namespace Barotrauma.Networking Enum.TryParse(doc.Root.GetAttributeString("TraitorsEnabled", "No"), out traitorsEnabled); TraitorsEnabled = traitorsEnabled; GameMain.NetLobbyScreen.SetTraitorsEnabled(traitorsEnabled); - + if (GameMain.NetLobbyScreen != null #if CLIENT && GameMain.NetLobbyScreen.ServerMessage != null #endif ) { +#if SERVER + GameMain.NetLobbyScreen.ServerName = doc.Root.GetAttributeString("name", ""); +#endif GameMain.NetLobbyScreen.ServerMessageText = doc.Root.GetAttributeString("ServerMessage", ""); }