@@ -97,6 +97,7 @@ internal sealed partial class GameController : IGameControllerInternal
9797 [ Dependency ] private readonly IReloadManager _reload = default ! ;
9898 [ Dependency ] private readonly ILocalizationManager _loc = default ! ;
9999 [ Dependency ] private readonly ISystemFontManagerInternal _systemFontManager = default ! ;
100+ [ Dependency ] private readonly LoadingScreenManager _loadscr = default ! ;
100101
101102 private IWebViewManagerHook ? _webViewHook ;
102103
@@ -133,28 +134,39 @@ public string SplashLogo()
133134 return Options . SplashLogo ? . ToString ( ) ?? _resourceManifest ! . SplashLogo ?? "" ;
134135 }
135136
137+ public bool ShowLoadingBar ( )
138+ {
139+ return _resourceManifest ! . ShowLoadingBar ?? _configurationManager . GetCVar ( CVars . LoadingShowBar ) ;
140+ }
141+
136142 internal bool StartupContinue ( DisplayMode displayMode )
137143 {
138144 DebugTools . AssertNotNull ( _resourceManifest ) ;
139145
146+ _loadscr . Initialize ( 42 ) ;
147+
148+ _loadscr . BeginLoadingSection ( "Init graphics" , dontRender : true ) ;
140149 _clyde . InitializePostWindowing ( ) ;
141- _audio . InitializePostWindowing ( ) ;
142150 _clyde . SetWindowTitle ( GameTitle ( ) ) ;
151+ _loadscr . EndLoadingSection ( ) ;
143152
144- _taskManager . Initialize ( ) ;
145- _parallelMgr . Initialize ( ) ;
153+ _loadscr . LoadingStep ( _audio . InitializePostWindowing , "Init audio" ) ;
154+
155+ _loadscr . LoadingStep ( _taskManager . Initialize , _taskManager ) ;
156+ _loadscr . LoadingStep ( _parallelMgr . Initialize , _parallelMgr ) ;
146157 _fontManager . SetFontDpi ( ( uint ) _configurationManager . GetCVar ( CVars . DisplayFontDpi ) ) ;
147- _systemFontManager . Initialize ( ) ;
158+
159+ _loadscr . LoadingStep ( _systemFontManager . Initialize , "System fonts" ) ;
148160
149161 // Load optional Robust modules.
150- LoadOptionalRobustModules ( displayMode , _resourceManifest ! ) ;
162+ _loadscr . LoadingStep ( ( ) => LoadOptionalRobustModules ( displayMode , _resourceManifest ! ) , "Robust Modules" ) ;
151163
164+ _loadscr . BeginLoadingSection ( _modLoader ) ;
152165 // Disable load context usage on content start.
153166 // This prevents Content.Client being loaded twice and things like csi blowing up because of it.
154167 _modLoader . SetUseLoadContext ( ! ContentStart ) ;
155168 var disableSandbox = Environment . GetEnvironmentVariable ( "ROBUST_DISABLE_SANDBOX" ) == "1" ;
156169 _modLoader . SetEnableSandboxing ( ! disableSandbox && Options . Sandboxing ) ;
157-
158170 if ( ! LoadModules ( ) )
159171 return false ;
160172
@@ -163,16 +175,23 @@ internal bool StartupContinue(DisplayMode displayMode)
163175 _configurationManager . LoadCVarsFromAssembly ( loadedModule ) ;
164176 }
165177
166- _serializationManager . Initialize ( ) ;
167- _loc . Initialize ( ) ;
178+ _loadscr . EndLoadingSection ( ) ;
179+
180+ _loadscr . LoadingStep ( _serializationManager . Initialize , _serializationManager ) ;
181+ _loadscr . LoadingStep ( _loc . Initialize , _loc ) ;
168182
169183 // Call Init in game assemblies.
170- _modLoader . BroadcastRunLevel ( ModRunLevel . PreInit ) ;
184+ _loadscr . LoadingStep ( ( ) => _modLoader . BroadcastRunLevel ( ModRunLevel . PreInit ) , "Content PreInit" ) ;
171185
172- // Finish initialization of WebView if loaded.
173- _webViewHook ? . Initialize ( ) ;
186+ _loadscr . LoadingStep ( ( ) =>
187+ {
188+ // Finish initialization of WebView if loaded.
189+ if ( _webViewHook != null )
190+ _loadscr . LoadingStep ( _webViewHook . Initialize , _webViewHook ) ;
191+ } ,
192+ "WebView init" ) ;
174193
175- _modLoader . BroadcastRunLevel ( ModRunLevel . Init ) ;
194+ _loadscr . LoadingStep ( ( ) => _modLoader . BroadcastRunLevel ( ModRunLevel . Init ) , "Content Init" ) ;
176195
177196 // Start bad file extensions check after content init,
178197 // in case content screws with the VFS.
@@ -181,42 +200,51 @@ internal bool StartupContinue(DisplayMode displayMode)
181200 _configurationManager ,
182201 _logManager . GetSawmill ( "res" ) ) ;
183202
184- _resourceCache . PreloadTextures ( ) ;
185- _networkManager . Initialize ( false ) ;
186- _configurationManager . SetupNetworking ( ) ;
187- _serializer . Initialize ( ) ;
188- _inputManager . Initialize ( ) ;
189- _console . Initialize ( ) ;
203+ _loadscr . LoadingStep ( _resourceCache . PreloadTextures , "Texture preload" ) ;
204+ _loadscr . LoadingStep ( ( ) => { _networkManager . Initialize ( false ) ; } , _networkManager ) ;
205+ _loadscr . LoadingStep ( _configurationManager . SetupNetworking , _configurationManager ) ;
206+ _loadscr . LoadingStep ( _serializer . Initialize , _serializer ) ;
207+ _loadscr . LoadingStep ( _inputManager . Initialize , _inputManager ) ;
208+ _loadscr . LoadingStep ( _console . Initialize , _console ) ;
190209
191210 // Make sure this is done before we try to load prototypes,
192211 // avoid any possibility of race conditions causing the check to not finish
193212 // before prototype load.
194- ProgramShared . FinishCheckBadFileExtensions ( checkBadExtensions ) ;
213+ _loadscr . LoadingStep (
214+ ( ) => ProgramShared . FinishCheckBadFileExtensions ( checkBadExtensions ) ,
215+ "Check bad file extensions" ) ;
195216
196- _reload . Initialize ( ) ;
197- _reflectionManager . Initialize ( ) ;
217+ _loadscr . LoadingStep ( _reload . Initialize , _reload ) ;
218+ _loadscr . LoadingStep ( _reflectionManager . Initialize , _reflectionManager ) ;
219+ _loadscr . BeginLoadingSection ( _prototypeManager ) ;
198220 _prototypeManager . Initialize ( ) ;
199221 _prototypeManager . LoadDefaultPrototypes ( ) ;
200- _xamlProxyManager . Initialize ( ) ;
201- _xamlHotReloadManager . Initialize ( ) ;
202- _userInterfaceManager . Initialize ( ) ;
203- _eyeManager . Initialize ( ) ;
204- _entityManager . Initialize ( ) ;
205- _mapManager . Initialize ( ) ;
206- _gameStateManager . Initialize ( ) ;
207- _placementManager . Initialize ( ) ;
208- _viewVariablesManager . Initialize ( ) ;
209- _scriptClient . Initialize ( ) ;
210- _client . Initialize ( ) ;
211- _discord . Initialize ( ) ;
212- _tagManager . Initialize ( ) ;
213- _protoLoadMan . Initialize ( ) ;
214- _netResMan . Initialize ( ) ;
215- _replayLoader . Initialize ( ) ;
216- _replayPlayback . Initialize ( ) ;
217- _replayRecording . Initialize ( ) ;
218- _userInterfaceManager . PostInitialize ( ) ;
219- _modLoader . BroadcastRunLevel ( ModRunLevel . PostInit ) ;
222+ _loadscr . EndLoadingSection ( ) ;
223+ _loadscr . LoadingStep ( _xamlProxyManager . Initialize , _xamlProxyManager ) ;
224+ _loadscr . LoadingStep ( _xamlHotReloadManager . Initialize , _xamlHotReloadManager ) ;
225+ _loadscr . LoadingStep ( _userInterfaceManager . Initialize , "UI init" ) ;
226+ _loadscr . LoadingStep ( _eyeManager . Initialize , _eyeManager ) ;
227+ _loadscr . LoadingStep ( _entityManager . Initialize , _entityManager ) ;
228+ _loadscr . LoadingStep ( _mapManager . Initialize , _mapManager ) ;
229+ _loadscr . LoadingStep ( _gameStateManager . Initialize , _gameStateManager ) ;
230+ _loadscr . LoadingStep ( _placementManager . Initialize , _placementManager ) ;
231+ _loadscr . LoadingStep ( _viewVariablesManager . Initialize , _viewVariablesManager ) ;
232+ _loadscr . LoadingStep ( _scriptClient . Initialize , _scriptClient ) ;
233+ _loadscr . LoadingStep ( _client . Initialize , _client ) ;
234+ _loadscr . LoadingStep ( _discord . Initialize , _discord ) ;
235+ _loadscr . LoadingStep ( _tagManager . Initialize , _tagManager ) ;
236+ _loadscr . LoadingStep ( _protoLoadMan . Initialize , _protoLoadMan ) ;
237+ _loadscr . LoadingStep ( _netResMan . Initialize , _netResMan ) ;
238+ _loadscr . LoadingStep ( _replayLoader . Initialize , _replayLoader ) ;
239+ _loadscr . LoadingStep ( _replayPlayback . Initialize , _replayPlayback ) ;
240+ _loadscr . LoadingStep ( _replayRecording . Initialize , _replayRecording ) ;
241+ _loadscr . LoadingStep ( _userInterfaceManager . PostInitialize , "UI postinit" ) ;
242+
243+ // Init stuff before this if at all possible.
244+
245+ _loadscr . LoadingStep ( ( ) => _modLoader . BroadcastRunLevel ( ModRunLevel . PostInit ) , "Content PostInit" ) ;
246+
247+ _loadscr . Finish ( ) ;
220248
221249 if ( _commandLineArgs ? . Username != null )
222250 {
@@ -423,7 +451,8 @@ internal bool StartupSystemSplash(
423451 _configurationManager . OverrideConVars ( new [ ]
424452 {
425453 ( CVars . DisplayWindowIconSet . Name , WindowIconSet ( ) ) ,
426- ( CVars . DisplaySplashLogo . Name , SplashLogo ( ) )
454+ ( CVars . DisplaySplashLogo . Name , SplashLogo ( ) ) ,
455+ ( CVars . LoadingShowBar . Name , ShowLoadingBar ( ) . ToString ( ) ) ,
427456 } ) ;
428457 }
429458
@@ -488,10 +517,18 @@ private void ReadInitialLaunchState()
488517
489518 public void Shutdown ( string ? reason = null )
490519 {
491- DebugTools . AssertNotNull ( _mainLoop ) ;
520+ if ( _mainLoop == null )
521+ {
522+ if ( ! _dontStart )
523+ {
524+ _logger . Info ( $ "Shutdown called before client init completed: { reason ?? "No reason provided" } ") ;
525+ _dontStart = true ;
526+ }
527+ return ;
528+ }
492529
493530 // Already got shut down I assume,
494- if ( ! _mainLoop ! . Running )
531+ if ( ! _mainLoop . Running )
495532 {
496533 return ;
497534 }
0 commit comments