using Content.Server.Acz; using Content.Server.Administration; using Content.Server.Administration.Logs; using Content.Server.Administration.Managers; using Content.Server.Afk; using Content.Server.Chat.Managers; using Content.Server.Connection; using Content.Server.Database; using Content.Server.EUI; using Content.Server.GameTicking; using Content.Server.GhostKick; using Content.Server.GuideGenerator; using Content.Server.Info; using Content.Server.IoC; using Content.Server.Maps; using Content.Server.NodeContainer.NodeGroups; using Content.Server.Players.PlayTimeTracking; using Content.Server.Preferences.Managers; using Content.Server.ServerInfo; using Content.Server.ServerUpdates; using Content.Server.Voting.Managers; using Content.Shared.CCVar; using Content.Shared.Kitchen; using Content.Shared.Localizations; using Robust.Server; using Robust.Server.ServerStatus; using Robust.Shared.Configuration; using Robust.Shared.ContentPack; using Robust.Shared.Prototypes; using Robust.Shared.Timing; using Robust.Shared.Utility; namespace Content.Server.Entry { public sealed class EntryPoint : GameServer { internal const string ConfigPresetsDir = "/ConfigPresets/"; private const string ConfigPresetsDirBuild = $"{ConfigPresetsDir}Build/"; private EuiManager _euiManager = default!; private IVoteManager _voteManager = default!; private ServerUpdateManager _updateManager = default!; private PlayTimeTrackingManager? _playTimeTracking; private IEntitySystemManager? _sysMan; private IServerDbManager? _dbManager; /// public override void Init() { base.Init(); var cfg = IoCManager.Resolve(); var res = IoCManager.Resolve(); var logManager = IoCManager.Resolve(); LoadConfigPresets(cfg, res, logManager.GetSawmill("configpreset")); var aczProvider = new ContentMagicAczProvider(IoCManager.Resolve()); IoCManager.Resolve().SetMagicAczProvider(aczProvider); var factory = IoCManager.Resolve(); var prototypes = IoCManager.Resolve(); factory.DoAutoRegistrations(); factory.IgnoreMissingComponents("Visuals"); factory.RegisterIgnore(IgnoredComponents.List); prototypes.RegisterIgnore("parallax"); prototypes.RegisterIgnore("guideEntry"); ServerContentIoC.Register(); foreach (var callback in TestingCallbacks) { var cast = (ServerModuleTestingCallbacks) callback; cast.ServerBeforeIoC?.Invoke(); } IoCManager.BuildGraph(); factory.GenerateNetIds(); var configManager = IoCManager.Resolve(); var dest = configManager.GetCVar(CCVars.DestinationFile); IoCManager.Resolve().Initialize(); if (string.IsNullOrEmpty(dest)) //hacky but it keeps load times for the generator down. { _euiManager = IoCManager.Resolve(); _voteManager = IoCManager.Resolve(); _updateManager = IoCManager.Resolve(); _playTimeTracking = IoCManager.Resolve(); _sysMan = IoCManager.Resolve(); _dbManager = IoCManager.Resolve(); logManager.GetSawmill("Storage").Level = LogLevel.Info; logManager.GetSawmill("db.ef").Level = LogLevel.Info; IoCManager.Resolve().Initialize(); IoCManager.Resolve().Initialize(); _dbManager.Init(); IoCManager.Resolve().Init(); IoCManager.Resolve().Initialize(); IoCManager.Resolve().Initialize(); IoCManager.Resolve().Initialize(); IoCManager.Resolve().Initialize(); _voteManager.Initialize(); _updateManager.Initialize(); _playTimeTracking.Initialize(); } } public override void PostInit() { base.PostInit(); IoCManager.Resolve().Initialize(); IoCManager.Resolve().Initialize(); var configManager = IoCManager.Resolve(); var resourceManager = IoCManager.Resolve(); var dest = configManager.GetCVar(CCVars.DestinationFile); if (!string.IsNullOrEmpty(dest)) { var resPath = new ResPath(dest).ToRootedPath(); var file = resourceManager.UserData.OpenWriteText(resPath.WithName("chem_" + dest)); ChemistryJsonGenerator.PublishJson(file); file.Flush(); file = resourceManager.UserData.OpenWriteText(resPath.WithName("react_" + dest)); ReactionJsonGenerator.PublishJson(file); file.Flush(); IoCManager.Resolve().Shutdown("Data generation done"); } else { IoCManager.Resolve().Initialize(); IoCManager.Resolve().Initialize(); IoCManager.Resolve().Initialize(); IoCManager.Resolve().Initialize(); _euiManager.Initialize(); IoCManager.Resolve().Initialize(); IoCManager.Resolve().GetEntitySystem().PostInitialize(); IoCManager.Resolve().Initialize(); } } public override void Update(ModUpdateLevel level, FrameEventArgs frameEventArgs) { base.Update(level, frameEventArgs); switch (level) { case ModUpdateLevel.PostEngine: { _euiManager.SendUpdates(); _voteManager.Update(); break; } case ModUpdateLevel.FramePostEngine: _updateManager.Update(); _playTimeTracking?.Update(); break; } } protected override void Dispose(bool disposing) { _playTimeTracking?.Shutdown(); _dbManager?.Shutdown(); } private static void LoadConfigPresets(IConfigurationManager cfg, IResourceManager res, ISawmill sawmill) { LoadBuildConfigPresets(cfg, res, sawmill); var presets = cfg.GetCVar(CCVars.ConfigPresets); if (presets == "") return; foreach (var preset in presets.Split(',')) { var path = $"{ConfigPresetsDir}{preset}.toml"; if (!res.TryContentFileRead(path, out var file)) { sawmill.Error("Unable to load config preset {Preset}!", path); continue; } cfg.LoadDefaultsFromTomlStream(file); sawmill.Info("Loaded config preset: {Preset}", path); } } private static void LoadBuildConfigPresets(IConfigurationManager cfg, IResourceManager res, ISawmill sawmill) { #if TOOLS Load(CCVars.ConfigPresetDevelopment, "development"); #endif #if DEBUG Load(CCVars.ConfigPresetDebug, "debug"); #endif void Load(CVarDef cVar, string name) { var path = $"{ConfigPresetsDirBuild}{name}.toml"; if (cfg.GetCVar(cVar) && res.TryContentFileRead(path, out var file)) { cfg.LoadDefaultsFromTomlStream(file); sawmill.Info("Loaded config preset: {Preset}", path); } } } } }