55
66package net .minecraftforge .fml .loading ;
77
8+ import cpw .mods .modlauncher .Launcher ;
9+ import cpw .mods .modlauncher .api .IModuleLayerManager ;
810import net .minecraftforge .fml .loading .progress .ProgressMeter ;
911import net .minecraftforge .fml .loading .progress .StartupNotificationManager ;
1012import org .apache .logging .log4j .LogManager ;
@@ -23,28 +25,44 @@ public class ImmediateWindowHandler {
2325
2426 private static ProgressMeter earlyProgress ;
2527 public static void load (final String launchTarget , final String [] arguments ) {
28+ final var serviceLayer = Launcher .INSTANCE .findLayerManager ()
29+ .flatMap (manager -> manager .getLayer (IModuleLayerManager .Layer .SERVICE ))
30+ .orElse (null );
31+ final var providerName = FMLConfig .getConfigValue (FMLConfig .ConfigValue .EARLY_WINDOW_PROVIDER );
32+
2633 if (!List .of ("forgeclient" , "forgeclientuserdev" , "forgeclientdev" ).contains (launchTarget )) {
27- provider = new DummyProvider ();
2834 LOGGER .info ("ImmediateWindowProvider not loading because launch target is {}" , launchTarget );
2935 } else if (!FMLConfig .getBoolConfigValue (FMLConfig .ConfigValue .EARLY_WINDOW_CONTROL )) {
30- provider = new DummyProvider ();
3136 LOGGER .info ("ImmediateWindowProvider not loading because splash screen is disabled" );
37+ } else if (providerName == null ) {
38+ LOGGER .info ("ImmediateWindowProvider not loading because splash screen provider is null" );
39+ } else if (serviceLayer == null ) {
40+ LOGGER .error ("Failed to find service layer for ImmediateWindowProvider" );
3241 } else {
33- final var providername = FMLConfig .getConfigValue (FMLConfig .ConfigValue .EARLY_WINDOW_PROVIDER );
34- LOGGER .info ("Loading ImmediateWindowProvider {}" , providername );
35- final var maybeProvider = ServiceLoader .load (ImmediateWindowProvider .class )
36- .stream ()
37- .map (ServiceLoader .Provider ::get )
38- .filter (p -> Objects .equals (p .name (), providername ))
39- .findFirst ();
40- provider = maybeProvider .or (() -> {
41- LOGGER .info ("Failed to find ImmediateWindowProvider {}, disabling" , providername );
42- return Optional .of (new DummyProvider ());
43- }).orElseThrow ();
42+ LOGGER .info ("Loading ImmediateWindowProvider {}" , providerName );
43+
44+ for (var itr = ServiceLoader .load (serviceLayer , ImmediateWindowProvider .class ).iterator (); itr .hasNext (); ) {
45+ try {
46+ var srvc = itr .next ();
47+ if (providerName .equals (srvc .name ())) {
48+ provider = new Wrapper (srvc );
49+ break ;
50+ }
51+ } catch (ServiceConfigurationError e ) {
52+ LOGGER .error ("Failed to initalize ImmediateWindowProvider Service" , e );
53+ }
54+ }
55+
56+ if (provider == null )
57+ LOGGER .info ("Failed to find ImmediateWindowProvider {}, disabling" , providerName );
4458 }
59+
4560 // Only update config if the provider isn't the dummy provider
46- if (! Objects . equals ( provider . name (), "dummyprovider" ) )
61+ if (provider != null )
4762 FMLConfig .updateConfig (FMLConfig .ConfigValue .EARLY_WINDOW_PROVIDER , provider .name ());
63+ else
64+ provider = new DummyProvider ();
65+
4866 FMLLoader .progressWindowTick = provider .initialize (arguments );
4967 earlyProgress = StartupNotificationManager .addProgressBar ("EARLY" , 0 );
5068 earlyProgress .label ("Bootstrapping Minecraft" );
@@ -78,6 +96,7 @@ public static void renderTick() {
7896 public static String getGLVersion () {
7997 return provider .getGLVersion ();
8098 }
99+
81100 public static void updateProgress (final String message ) {
82101 earlyProgress .label (message );
83102 }
@@ -156,4 +175,94 @@ public void periodicTick() {
156175 // NOOP
157176 }
158177 }
178+
179+ // We create a wrapper because we want to log errors to the log files, which not all paths of ModLauncher do. Little dirty, but works for now.
180+ private static class Wrapper implements ImmediateWindowProvider {
181+ private final ImmediateWindowProvider delegate ;
182+
183+ private Wrapper (ImmediateWindowProvider delegate ) {
184+ this .delegate = delegate ;
185+ }
186+
187+ public String name () {
188+ try {
189+ return delegate .name ();
190+ } catch (Throwable t ) {
191+ LOGGER .error ("Failed to call provider.name" , t );
192+ throw t ;
193+ }
194+ }
195+
196+ public Runnable initialize (String [] arguments ) {
197+ try {
198+ return delegate .initialize (arguments );
199+ } catch (Throwable t ) {
200+ LOGGER .error ("Failed to call provider.initialize" , t );
201+ throw t ;
202+ }
203+ }
204+
205+ public void updateFramebufferSize (IntConsumer width , IntConsumer height ) {
206+ try {
207+ delegate .updateFramebufferSize (width , height );
208+ } catch (Throwable t ) {
209+ LOGGER .error ("Failed to call provider.updateFramebufferSize" , t );
210+ throw t ;
211+ }
212+ }
213+
214+ public long setupMinecraftWindow (IntSupplier width , IntSupplier height , Supplier <String > title , LongSupplier monitor ) {
215+ try {
216+ return delegate .setupMinecraftWindow (width , height , title , monitor );
217+ } catch (Throwable t ) {
218+ LOGGER .error ("Failed to call provider.setupMinecraftWindow" , t );
219+ throw t ;
220+ }
221+ }
222+
223+ public boolean positionWindow (Optional <Object > monitor , IntConsumer widthSetter , IntConsumer heightSetter , IntConsumer xSetter , IntConsumer ySetter ) {
224+ try {
225+ return delegate .positionWindow (monitor , widthSetter , heightSetter , xSetter , ySetter );
226+ } catch (Throwable t ) {
227+ LOGGER .error ("Failed to call provider.positionWindow" , t );
228+ throw t ;
229+ }
230+ }
231+
232+ public <T > Supplier <T > loadingOverlay (Supplier <?> mc , Supplier <?> ri , Consumer <Optional <Throwable >> ex , boolean fade ) {
233+ try {
234+ return delegate .loadingOverlay (mc , ri , ex , fade );
235+ } catch (Throwable t ) {
236+ LOGGER .error ("Failed to call provider.loadingOverlay" , t );
237+ throw t ;
238+ }
239+ }
240+
241+ public void updateModuleReads (ModuleLayer layer ) {
242+ try {
243+ delegate .updateModuleReads (layer );
244+ } catch (Throwable t ) {
245+ LOGGER .error ("Failed to call provider.updateModuleReads" , t );
246+ throw t ;
247+ }
248+ }
249+
250+ public void periodicTick () {
251+ try {
252+ delegate .periodicTick ();
253+ } catch (Throwable t ) {
254+ LOGGER .error ("Failed to call provider.periodicTick" , t );
255+ throw t ;
256+ }
257+ }
258+
259+ public String getGLVersion () {
260+ try {
261+ return delegate .getGLVersion ();
262+ } catch (Throwable t ) {
263+ LOGGER .error ("Failed to call provider.getGLVersion" , t );
264+ throw t ;
265+ }
266+ }
267+ }
159268}
0 commit comments