public void TestZero() { Assert.Equal(new DateTime(2000, 1, 1), Epoch.ToDateTime(0)); Assert.Equal(0u, Epoch.FromDateTime(new DateTime(2000, 1, 1))); Assert.Equal(new DateTimeOffset(2000, 1, 1, 0, 0, 0, TimeSpan.Zero), Epoch.ToDateTimeOffset(0)); Assert.Equal(0u, Epoch.FromDateTimeOffset(new DateTimeOffset(2000, 1, 1, 0, 0, 0, TimeSpan.Zero))); }
public void TestPreEphoch() { ArgumentOutOfRangeException exc; var dateTime = new DateTime(1999, 12, 30); exc = Assert.Throws <ArgumentOutOfRangeException>(() => Epoch.FromDateTime(dateTime)); Assert.Equal("dateTime", exc.ParamName); Assert.Equal(dateTime, exc.ActualValue); Assert.Equal($"dateTime is before the ripple epoch of 2000-01-01 (Parameter 'dateTime'){Environment.NewLine}Actual value was {dateTime}.", exc.Message); var dateTimeOffset = new DateTimeOffset(1999, 12, 30, 0, 0, 0, TimeSpan.Zero); exc = Assert.Throws <ArgumentOutOfRangeException>(() => Epoch.FromDateTimeOffset(dateTimeOffset)); Assert.Equal("dateTimeOffset", exc.ParamName); Assert.Equal(dateTimeOffset, exc.ActualValue); Assert.Equal($"dateTimeOffset is before the ripple epoch of 2000-01-01 (Parameter 'dateTimeOffset'){Environment.NewLine}Actual value was {dateTimeOffset}.", exc.Message); }
public override void Execute() { AppInfo appInfo = Facepunch.Pool.Get <AppInfo>(); appInfo.name = ConVar.Server.hostname; appInfo.headerImage = ConVar.Server.headerimage; appInfo.logoImage = ConVar.Server.logoimage; appInfo.url = ConVar.Server.url; appInfo.map = World.Name; appInfo.mapSize = World.Size; appInfo.wipeTime = (uint)Epoch.FromDateTime(SaveRestore.SaveCreatedTime.ToUniversalTime()); appInfo.players = (uint)BasePlayer.activePlayerList.Count; appInfo.maxPlayers = (uint)ConVar.Server.maxplayers; appInfo.queuedPlayers = (uint)SingletonComponent <ServerMgr> .Instance.connectionQueue.Queued; appInfo.seed = World.Seed; appInfo.salt = World.Salt; AppResponse appResponse = Facepunch.Pool.Get <AppResponse>(); appResponse.info = appInfo; Send(appResponse); }
public void TestDateTimeRoundTrip(uint timestamp) { Assert.Equal(timestamp, Epoch.FromDateTime(Epoch.ToDateTime(timestamp))); }
static bool Prefix(ServerMgr serverMgr) { if (!SteamServer.IsValid) { return(false); } using (TimeWarning.New("UpdateServerInformation", 0)) { SteamServer.ServerName = ConVar.Server.hostname; SteamServer.MaxPlayers = ConVar.Server.maxplayers; SteamServer.Passworded = false; SteamServer.MapName = global::World.Name; string text = "stok"; if (serverMgr.Restarting) { text = "strst"; } string text2 = string.Format("born{0}", Epoch.FromDateTime(global::SaveRestore.SaveCreatedTime)); string text3 = string.Format("gm{0}", global::ServerMgr.GamemodeName()); SteamServer.GameTags = string.Format("mp{0},cp{1},qp{5},v{2}{3},h{4},{6},{7},{8}", new object[] { ConVar.Server.maxplayers, global::BasePlayer.activePlayerList.Count, typeof(Protocol).GetFields().Single(x => x.Name == "network").GetRawConstantValue(), ConVar.Server.pve ? ",pve" : string.Empty, AssemblyHash, SingletonComponent <global::ServerMgr> .Instance.connectionQueue.Queued, text, text2, text3 }); Interface.CallHook("IOnUpdateServerInformation"); if (ConVar.Server.description != null && ConVar.Server.description.Length > 100) { string[] array = ConVar.Server.description.SplitToChunks(100).ToArray <string>(); Interface.CallHook("IOnUpdateServerDescription"); for (int i = 0; i < 16; i++) { if (i < array.Length) { SteamServer.SetKey(string.Format("description_{0:00}", i), array[i]); } else { SteamServer.SetKey(string.Format("description_{0:00}", i), string.Empty); } } } else { SteamServer.SetKey("description_0", ConVar.Server.description); for (int j = 1; j < 16; j++) { SteamServer.SetKey(string.Format("description_{0:00}", j), string.Empty); } } SteamServer.SetKey("hash", AssemblyHash); SteamServer.SetKey("world.seed", global::World.Seed.ToString()); SteamServer.SetKey("world.size", global::World.Size.ToString()); SteamServer.SetKey("pve", ConVar.Server.pve.ToString()); SteamServer.SetKey("headerimage", ConVar.Server.headerimage); SteamServer.SetKey("url", ConVar.Server.url); SteamServer.SetKey("gmn", global::ServerMgr.GamemodeName()); SteamServer.SetKey("gmt", global::ServerMgr.GamemodeTitle()); SteamServer.SetKey("gmd", global::ServerMgr.GamemodeDesc()); SteamServer.SetKey("gmu", global::ServerMgr.GamemodeUrl()); SteamServer.SetKey("uptime", ((int)UnityEngine.Time.realtimeSinceStartup).ToString()); SteamServer.SetKey("gc_mb", global::Performance.report.memoryAllocations.ToString()); SteamServer.SetKey("gc_cl", global::Performance.report.memoryCollections.ToString()); SteamServer.SetKey("fps", global::Performance.report.frameRate.ToString()); SteamServer.SetKey("fps_avg", global::Performance.report.frameRateAverage.ToString("0.00")); SteamServer.SetKey("ent_cnt", global::BaseNetworkable.serverEntities.Count.ToString()); SteamServer.SetKey("build", BuildInfo.Current.Scm.ChangeId); } return(false); }
private void UpdateServerInformation() { if (Global.get_SteamServer() == null) { return; } using (TimeWarning.New(nameof(UpdateServerInformation), 0.1f)) { Global.get_SteamServer().set_ServerName(ConVar.Server.hostname); Global.get_SteamServer().set_MaxPlayers(ConVar.Server.maxplayers); Global.get_SteamServer().set_Passworded(false); Global.get_SteamServer().set_MapName(World.Name); string str1 = "stok"; if (this.Restarting) { str1 = "strst"; } string str2 = string.Format("born{0}", (object)Epoch.FromDateTime(SaveRestore.SaveCreatedTime)); string str3 = string.Format("mp{0},cp{1},qp{5},v{2}{3},h{4},{6},{7}", (object)ConVar.Server.maxplayers, (object)BasePlayer.activePlayerList.Count, (object)2161, ConVar.Server.pve ? (object)",pve" : (object)string.Empty, (object)this.AssemblyHash, (object)((ServerMgr)SingletonComponent <ServerMgr> .Instance).connectionQueue.Queued, (object)str1, (object)str2) + ",oxide"; if (Interface.get_Oxide().get_Config().get_Options().Modded != null) { str3 += ",modded"; } Global.get_SteamServer().set_GameTags(str3); if (ConVar.Server.description != null && ConVar.Server.description.Length > 100) { string[] array = StringEx.SplitToChunks(ConVar.Server.description, 100).ToArray <string>(); for (int index = 0; index < 16; ++index) { if (index < array.Length) { Global.get_SteamServer().SetKey(string.Format("description_{0:00}", (object)index), array[index]); } else { Global.get_SteamServer().SetKey(string.Format("description_{0:00}", (object)index), string.Empty); } } } else { Global.get_SteamServer().SetKey("description_0", ConVar.Server.description); for (int index = 1; index < 16; ++index) { Global.get_SteamServer().SetKey(string.Format("description_{0:00}", (object)index), string.Empty); } } Global.get_SteamServer().SetKey("hash", this.AssemblyHash); Facepunch.Steamworks.Server steamServer1 = Global.get_SteamServer(); uint num = World.Seed; string str4 = num.ToString(); steamServer1.SetKey("world.seed", str4); Facepunch.Steamworks.Server steamServer2 = Global.get_SteamServer(); num = World.Size; string str5 = num.ToString(); steamServer2.SetKey("world.size", str5); Global.get_SteamServer().SetKey("pve", ConVar.Server.pve.ToString()); Global.get_SteamServer().SetKey("headerimage", ConVar.Server.headerimage); Global.get_SteamServer().SetKey("url", ConVar.Server.url); Global.get_SteamServer().SetKey("uptime", ((int)Time.get_realtimeSinceStartup()).ToString()); Global.get_SteamServer().SetKey("gc_mb", Performance.report.memoryAllocations.ToString()); Global.get_SteamServer().SetKey("gc_cl", Performance.report.memoryCollections.ToString()); Global.get_SteamServer().SetKey("fps", Performance.report.frameRate.ToString()); Global.get_SteamServer().SetKey("fps_avg", Performance.report.frameRateAverage.ToString("0.00")); Global.get_SteamServer().SetKey("ent_cnt", BaseNetworkable.serverEntities.Count.ToString()); Global.get_SteamServer().SetKey("build", BuildInfo.get_Current().get_Scm().get_ChangeId()); } }
public static IEnumerator Save(string strFilename, bool AndWait = false) { if (Application.isQuitting == null) { Stopwatch timerCache = new Stopwatch(); Stopwatch timerWrite = new Stopwatch(); Stopwatch timerDisk = new Stopwatch(); int iEnts = 0; timerCache.Start(); TimeWarning timeWarning = TimeWarning.New("SaveCache", 100L); try { Stopwatch sw = Stopwatch.StartNew(); BaseEntity[] baseEntityArray = BaseEntity.saveList.ToArray <BaseEntity>(); for (int index = 0; index < baseEntityArray.Length; ++index) { BaseEntity ent = baseEntityArray[index]; if (!Object.op_Equality((Object)ent, (Object)null)) { if (ent.IsValid()) { try { ent.GetSaveCache(); } catch (Exception ex) { Debug.LogException(ex); } if (sw.Elapsed.TotalMilliseconds > 5.0) { if (!AndWait) { yield return((object)CoroutineEx.waitForEndOfFrame); } sw.Reset(); sw.Start(); } } } } baseEntityArray = (BaseEntity[])null; sw = (Stopwatch)null; } finally { ((IDisposable)timeWarning)?.Dispose(); } timeWarning = (TimeWarning)null; timerCache.Stop(); SaveRestore.SaveBuffer.Position = 0L; SaveRestore.SaveBuffer.SetLength(0L); timerWrite.Start(); timeWarning = TimeWarning.New("SaveWrite", 100L); try { BinaryWriter writer = new BinaryWriter((Stream)SaveRestore.SaveBuffer); writer.Write((sbyte)83); writer.Write((sbyte)65); writer.Write((sbyte)86); writer.Write((sbyte)82); writer.Write((sbyte)68); writer.Write(Epoch.FromDateTime(SaveRestore.SaveCreatedTime)); writer.Write(177U); new BaseNetworkable.SaveInfo().forDisk = true; if (!AndWait) { yield return((object)CoroutineEx.waitForEndOfFrame); } foreach (BaseEntity save in BaseEntity.saveList) { if (Object.op_Equality((Object)save, (Object)null) || save.IsDestroyed) { Debug.LogWarning((object)("Entity is NULL but is still in saveList - not destroyed properly? " + (object)save), (Object)save); } else { MemoryStream memoryStream = (MemoryStream)null; try { memoryStream = save.GetSaveCache(); } catch (Exception ex) { Debug.LogException(ex); } if (memoryStream == null || memoryStream.Length <= 0L) { Debug.LogWarningFormat("Skipping saving entity {0} - because {1}", new object[2] { (object)save, memoryStream == null ? (object)"savecache is null" : (object)"savecache is 0" }); } else { writer.Write((uint)memoryStream.Length); writer.Write(memoryStream.GetBuffer(), 0, (int)memoryStream.Length); ++iEnts; } } } writer = (BinaryWriter)null; } finally { ((IDisposable)timeWarning)?.Dispose(); } timeWarning = (TimeWarning)null; timerWrite.Stop(); if (!AndWait) { yield return((object)CoroutineEx.waitForEndOfFrame); } timerDisk.Start(); using (TimeWarning.New("SaveDisk", 100L)) { try { if (File.Exists(strFilename + ".new")) { File.Delete(strFilename + ".new"); } try { File.WriteAllBytes(strFilename + ".new", SaveRestore.SaveBuffer.ToArray()); } catch (Exception ex) { Debug.LogWarning((object)("Couldn't write save file! We got an exception: " + (object)ex)); if (File.Exists(strFilename + ".new")) { File.Delete(strFilename + ".new"); } } if (File.Exists(strFilename)) { File.Delete(strFilename); } File.Move(strFilename + ".new", strFilename); } catch (Exception ex) { Debug.LogWarning((object)("Error when saving to disk: " + (object)ex)); } } timerDisk.Stop(); Debug.LogFormat("Saved {0} ents, cache({1}), write({2}), disk({3}).", new object[4] { (object)iEnts.ToString("N0"), (object)timerCache.Elapsed.TotalSeconds.ToString("0.00"), (object)timerWrite.Elapsed.TotalSeconds.ToString("0.00"), (object)timerDisk.Elapsed.TotalSeconds.ToString("0.00") }); } }