EntryPoint.cs 9.5 KB

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