EntryPoint.cs 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. using Content.Server.Acz;
  2. using Content.Server.Administration;
  3. using Content.Server.Administration.Logs;
  4. using Content.Server.Administration.Managers;
  5. using Content.Server.Afk;
  6. using Content.Server.Chat.Managers;
  7. using Content.Server.Connection;
  8. using Content.Server.Database;
  9. using Content.Server.EUI;
  10. using Content.Server.GameTicking;
  11. using Content.Server.GhostKick;
  12. using Content.Server.GuideGenerator;
  13. using Content.Server.Info;
  14. using Content.Server.IoC;
  15. using Content.Server.Maps;
  16. using Content.Server.NodeContainer.NodeGroups;
  17. using Content.Server.Objectives;
  18. using Content.Server.Players;
  19. using Content.Server.Players.JobWhitelist;
  20. using Content.Server.Players.PlayTimeTracking;
  21. using Content.Server.Players.RateLimiting;
  22. using Content.Server.Preferences.Managers;
  23. using Content.Server.ServerInfo;
  24. using Content.Server.ServerUpdates;
  25. using Content.Server.Voting.Managers;
  26. using Content.Shared.CCVar;
  27. using Content.Shared.Kitchen;
  28. using Content.Shared.Localizations;
  29. using Robust.Server;
  30. using Robust.Server.ServerStatus;
  31. using Robust.Shared.Configuration;
  32. using Robust.Shared.ContentPack;
  33. using Robust.Shared.Prototypes;
  34. using Robust.Shared.Timing;
  35. using Robust.Shared.Utility;
  36. namespace Content.Server.Entry
  37. {
  38. public sealed class EntryPoint : GameServer
  39. {
  40. internal const string ConfigPresetsDir = "/ConfigPresets/";
  41. private const string ConfigPresetsDirBuild = $"{ConfigPresetsDir}Build/";
  42. private EuiManager _euiManager = default!;
  43. private IVoteManager _voteManager = default!;
  44. private ServerUpdateManager _updateManager = default!;
  45. private PlayTimeTrackingManager? _playTimeTracking;
  46. private IEntitySystemManager? _sysMan;
  47. private IServerDbManager? _dbManager;
  48. private IWatchlistWebhookManager _watchlistWebhookManager = default!;
  49. private IConnectionManager? _connectionManager;
  50. /// <inheritdoc />
  51. public override void Init()
  52. {
  53. base.Init();
  54. var cfg = IoCManager.Resolve<IConfigurationManager>();
  55. var res = IoCManager.Resolve<IResourceManager>();
  56. var logManager = IoCManager.Resolve<ILogManager>();
  57. LoadConfigPresets(cfg, res, logManager.GetSawmill("configpreset"));
  58. var aczProvider = new ContentMagicAczProvider(IoCManager.Resolve<IDependencyCollection>());
  59. IoCManager.Resolve<IStatusHost>().SetMagicAczProvider(aczProvider);
  60. var factory = IoCManager.Resolve<IComponentFactory>();
  61. var prototypes = IoCManager.Resolve<IPrototypeManager>();
  62. factory.DoAutoRegistrations();
  63. factory.IgnoreMissingComponents("Visuals");
  64. factory.RegisterIgnore(IgnoredComponents.List);
  65. prototypes.RegisterIgnore("parallax");
  66. ServerContentIoC.Register();
  67. foreach (var callback in TestingCallbacks)
  68. {
  69. var cast = (ServerModuleTestingCallbacks) callback;
  70. cast.ServerBeforeIoC?.Invoke();
  71. }
  72. IoCManager.BuildGraph();
  73. factory.GenerateNetIds();
  74. var configManager = IoCManager.Resolve<IConfigurationManager>();
  75. var dest = configManager.GetCVar(CCVars.DestinationFile);
  76. IoCManager.Resolve<ContentLocalizationManager>().Initialize();
  77. if (string.IsNullOrEmpty(dest)) //hacky but it keeps load times for the generator down.
  78. {
  79. _euiManager = IoCManager.Resolve<EuiManager>();
  80. _voteManager = IoCManager.Resolve<IVoteManager>();
  81. _updateManager = IoCManager.Resolve<ServerUpdateManager>();
  82. _playTimeTracking = IoCManager.Resolve<PlayTimeTrackingManager>();
  83. _connectionManager = IoCManager.Resolve<IConnectionManager>();
  84. _sysMan = IoCManager.Resolve<IEntitySystemManager>();
  85. _dbManager = IoCManager.Resolve<IServerDbManager>();
  86. _watchlistWebhookManager = IoCManager.Resolve<IWatchlistWebhookManager>();
  87. logManager.GetSawmill("Storage").Level = LogLevel.Info;
  88. logManager.GetSawmill("db.ef").Level = LogLevel.Info;
  89. IoCManager.Resolve<IAdminLogManager>().Initialize();
  90. IoCManager.Resolve<IConnectionManager>().Initialize();
  91. _dbManager.Init();
  92. IoCManager.Resolve<IServerPreferencesManager>().Init();
  93. IoCManager.Resolve<INodeGroupFactory>().Initialize();
  94. IoCManager.Resolve<ContentNetworkResourceManager>().Initialize();
  95. IoCManager.Resolve<GhostKickManager>().Initialize();
  96. IoCManager.Resolve<ServerInfoManager>().Initialize();
  97. IoCManager.Resolve<ServerApi>().Initialize();
  98. _voteManager.Initialize();
  99. _updateManager.Initialize();
  100. _playTimeTracking.Initialize();
  101. _watchlistWebhookManager.Initialize();
  102. IoCManager.Resolve<JobWhitelistManager>().Initialize();
  103. IoCManager.Resolve<PlayerRateLimitManager>().Initialize();
  104. }
  105. }
  106. public override void PostInit()
  107. {
  108. base.PostInit();
  109. IoCManager.Resolve<IChatSanitizationManager>().Initialize();
  110. IoCManager.Resolve<IChatManager>().Initialize();
  111. var configManager = IoCManager.Resolve<IConfigurationManager>();
  112. var resourceManager = IoCManager.Resolve<IResourceManager>();
  113. var dest = configManager.GetCVar(CCVars.DestinationFile);
  114. if (!string.IsNullOrEmpty(dest))
  115. {
  116. var resPath = new ResPath(dest).ToRootedPath();
  117. var file = resourceManager.UserData.OpenWriteText(resPath.WithName("chem_" + dest));
  118. ChemistryJsonGenerator.PublishJson(file);
  119. file.Flush();
  120. file = resourceManager.UserData.OpenWriteText(resPath.WithName("react_" + dest));
  121. ReactionJsonGenerator.PublishJson(file);
  122. file.Flush();
  123. IoCManager.Resolve<IBaseServer>().Shutdown("Data generation done");
  124. }
  125. else
  126. {
  127. IoCManager.Resolve<RecipeManager>().Initialize();
  128. IoCManager.Resolve<IAdminManager>().Initialize();
  129. IoCManager.Resolve<IAfkManager>().Initialize();
  130. IoCManager.Resolve<RulesManager>().Initialize();
  131. _euiManager.Initialize();
  132. IoCManager.Resolve<IGameMapManager>().Initialize();
  133. IoCManager.Resolve<IEntitySystemManager>().GetEntitySystem<GameTicker>().PostInitialize();
  134. IoCManager.Resolve<IBanManager>().Initialize();
  135. IoCManager.Resolve<IConnectionManager>().PostInit();
  136. IoCManager.Resolve<MultiServerKickManager>().Initialize();
  137. IoCManager.Resolve<CVarControlManager>().Initialize();
  138. }
  139. }
  140. public override void Update(ModUpdateLevel level, FrameEventArgs frameEventArgs)
  141. {
  142. base.Update(level, frameEventArgs);
  143. switch (level)
  144. {
  145. case ModUpdateLevel.PostEngine:
  146. {
  147. _euiManager.SendUpdates();
  148. _voteManager.Update();
  149. break;
  150. }
  151. case ModUpdateLevel.FramePostEngine:
  152. _updateManager.Update();
  153. _playTimeTracking?.Update();
  154. _watchlistWebhookManager.Update();
  155. _connectionManager?.Update();
  156. break;
  157. }
  158. }
  159. protected override void Dispose(bool disposing)
  160. {
  161. _playTimeTracking?.Shutdown();
  162. _dbManager?.Shutdown();
  163. IoCManager.Resolve<ServerApi>().Shutdown();
  164. }
  165. private static void LoadConfigPresets(IConfigurationManager cfg, IResourceManager res, ISawmill sawmill)
  166. {
  167. LoadBuildConfigPresets(cfg, res, sawmill);
  168. var presets = cfg.GetCVar(CCVars.ConfigPresets);
  169. if (presets == "")
  170. return;
  171. foreach (var preset in presets.Split(','))
  172. {
  173. var path = $"{ConfigPresetsDir}{preset}.toml";
  174. if (!res.TryContentFileRead(path, out var file))
  175. {
  176. sawmill.Error("Unable to load config preset {Preset}!", path);
  177. continue;
  178. }
  179. cfg.LoadDefaultsFromTomlStream(file);
  180. sawmill.Info("Loaded config preset: {Preset}", path);
  181. }
  182. }
  183. private static void LoadBuildConfigPresets(IConfigurationManager cfg, IResourceManager res, ISawmill sawmill)
  184. {
  185. #if TOOLS
  186. Load(CCVars.ConfigPresetDevelopment, "development");
  187. #endif
  188. #if DEBUG
  189. Load(CCVars.ConfigPresetDebug, "debug");
  190. #endif
  191. void Load(CVarDef<bool> cVar, string name)
  192. {
  193. var path = $"{ConfigPresetsDirBuild}{name}.toml";
  194. if (cfg.GetCVar(cVar) && res.TryContentFileRead(path, out var file))
  195. {
  196. cfg.LoadDefaultsFromTomlStream(file);
  197. sawmill.Info("Loaded config preset: {Preset}", path);
  198. }
  199. }
  200. }
  201. }
  202. }