Commit cffaacc682924d96028c90e0adf73b336973b9c5

Authored by Mumfrey
1 parent 97de196e

clean up LiteLoaderTweaker a bit and don't rely on singleton for some public contracts

java/common/com/mumfrey/liteloader/core/LiteLoaderBootstrap.java
@@ -17,6 +17,7 @@ import org.apache.logging.log4j.core.Logger; @@ -17,6 +17,7 @@ import org.apache.logging.log4j.core.Logger;
17 import org.apache.logging.log4j.core.appender.FileAppender; 17 import org.apache.logging.log4j.core.appender.FileAppender;
18 import org.apache.logging.log4j.core.layout.PatternLayout; 18 import org.apache.logging.log4j.core.layout.PatternLayout;
19 19
  20 +import net.minecraft.launchwrapper.ITweaker;
20 import net.minecraft.launchwrapper.Launch; 21 import net.minecraft.launchwrapper.Launch;
21 import net.minecraft.launchwrapper.LaunchClassLoader; 22 import net.minecraft.launchwrapper.LaunchClassLoader;
22 23
@@ -120,6 +121,10 @@ class LiteLoaderBootstrap implements LoaderBootstrap, LoaderEnvironment, LoaderP @@ -120,6 +121,10 @@ class LiteLoaderBootstrap implements LoaderBootstrap, LoaderEnvironment, LoaderP
120 private String branding = null; 121 private String branding = null;
121 122
122 private boolean loadTweaks = true; 123 private boolean loadTweaks = true;
  124 +
  125 + private LaunchClassLoader classLoader;
  126 +
  127 + private final ITweaker tweaker;
123 128
124 private final APIRegistry apiRegistry; 129 private final APIRegistry apiRegistry;
125 130
@@ -140,13 +145,13 @@ class LiteLoaderBootstrap implements LoaderBootstrap, LoaderEnvironment, LoaderP @@ -140,13 +145,13 @@ class LiteLoaderBootstrap implements LoaderBootstrap, LoaderEnvironment, LoaderP
140 private EnabledModsList enabledModsList; 145 private EnabledModsList enabledModsList;
141 146
142 /** 147 /**
143 - * @param gameDirectory  
144 - * @param assetsDirectory  
145 - * @param profile 148 + * @param env
  149 + * @param tweaker
146 */ 150 */
147 - public LiteLoaderBootstrap(StartupEnvironment env) 151 + public LiteLoaderBootstrap(StartupEnvironment env, ITweaker tweaker)
148 { 152 {
149 this.environmentType = EnvironmentType.values()[env.getEnvironmentTypeId()]; 153 this.environmentType = EnvironmentType.values()[env.getEnvironmentTypeId()];
  154 + this.tweaker = tweaker;
150 155
151 this.apiRegistry = new APIRegistry(this.getEnvironment(), this.getProperties()); 156 this.apiRegistry = new APIRegistry(this.getEnvironment(), this.getProperties());
152 157
@@ -255,12 +260,19 @@ class LiteLoaderBootstrap implements LoaderBootstrap, LoaderEnvironment, LoaderP @@ -255,12 +260,19 @@ class LiteLoaderBootstrap implements LoaderBootstrap, LoaderEnvironment, LoaderP
255 return this; 260 return this;
256 } 261 }
257 262
  263 + @Override
  264 + public ITweaker getTweaker()
  265 + {
  266 + return this.tweaker;
  267 + }
  268 +
258 /* (non-Javadoc) 269 /* (non-Javadoc)
259 * @see com.mumfrey.liteloader.launch.ILoaderBootstrap#preInit(net.minecraft.launchwrapper.LaunchClassLoader, boolean) 270 * @see com.mumfrey.liteloader.launch.ILoaderBootstrap#preInit(net.minecraft.launchwrapper.LaunchClassLoader, boolean)
260 */ 271 */
261 @Override 272 @Override
262 public void preInit(LaunchClassLoader classLoader, boolean loadTweaks, List<String> modsToLoad) 273 public void preInit(LaunchClassLoader classLoader, boolean loadTweaks, List<String> modsToLoad)
263 { 274 {
  275 + this.classLoader = classLoader;
264 this.loadTweaks = loadTweaks; 276 this.loadTweaks = loadTweaks;
265 277
266 LiteLoaderLogger.info("LiteLoader begin PREINIT..."); 278 LiteLoaderLogger.info("LiteLoader begin PREINIT...");
@@ -315,12 +327,12 @@ class LiteLoaderBootstrap implements LoaderBootstrap, LoaderEnvironment, LoaderP @@ -315,12 +327,12 @@ class LiteLoaderBootstrap implements LoaderBootstrap, LoaderEnvironment, LoaderP
315 * @see com.mumfrey.liteloader.launch.ILoaderBootstrap#init(java.util.List, net.minecraft.launchwrapper.LaunchClassLoader) 327 * @see com.mumfrey.liteloader.launch.ILoaderBootstrap#init(java.util.List, net.minecraft.launchwrapper.LaunchClassLoader)
316 */ 328 */
317 @Override 329 @Override
318 - public void init(LaunchClassLoader classLoader) 330 + public void init()
319 { 331 {
320 // PreInit failed 332 // PreInit failed
321 if (this.enumerator == null) return; 333 if (this.enumerator == null) return;
322 334
323 - LiteLoader.createInstance(this.getEnvironment(), this.getProperties(), classLoader); 335 + LiteLoader.createInstance(this.getEnvironment(), this.getProperties(), this.classLoader);
324 LiteLoader.invokeInit(); 336 LiteLoader.invokeInit();
325 } 337 }
326 338
java/common/com/mumfrey/liteloader/core/LiteLoaderEnumerator.java
@@ -69,6 +69,8 @@ public class LiteLoaderEnumerator implements LoaderEnumerator @@ -69,6 +69,8 @@ public class LiteLoaderEnumerator implements LoaderEnumerator
69 private final LoaderEnvironment environment; 69 private final LoaderEnvironment environment;
70 70
71 private final LoaderProperties properties; 71 private final LoaderProperties properties;
  72 +
  73 + private final LiteLoaderTweaker tweaker;
72 74
73 /** 75 /**
74 * Reference to the launch classloader 76 * Reference to the launch classloader
@@ -124,6 +126,7 @@ public class LiteLoaderEnumerator implements LoaderEnumerator @@ -124,6 +126,7 @@ public class LiteLoaderEnumerator implements LoaderEnumerator
124 { 126 {
125 this.environment = environment; 127 this.environment = environment;
126 this.properties = properties; 128 this.properties = properties;
  129 + this.tweaker = (LiteLoaderTweaker)environment.getTweaker();
127 this.classLoader = classLoader; 130 this.classLoader = classLoader;
128 this.supportedPrefixes = this.getSupportedPrefixes(environment); 131 this.supportedPrefixes = this.getSupportedPrefixes(environment);
129 132
@@ -548,7 +551,7 @@ public class LiteLoaderEnumerator implements LoaderEnumerator @@ -548,7 +551,7 @@ public class LiteLoaderEnumerator implements LoaderEnumerator
548 String tweakClass = container.getTweakClassName(); 551 String tweakClass = container.getTweakClassName();
549 int tweakPriority = container.getTweakPriority(); 552 int tweakPriority = container.getTweakPriority();
550 LiteLoaderLogger.info("Mod file '%s' provides tweakClass '%s', adding to Launch queue with priority %d", container.getName(), tweakClass, tweakPriority); 553 LiteLoaderLogger.info("Mod file '%s' provides tweakClass '%s', adding to Launch queue with priority %d", container.getName(), tweakClass, tweakPriority);
551 - if (LiteLoaderTweaker.addCascadedTweaker(tweakClass, tweakPriority)) 554 + if (this.tweaker.addCascadedTweaker(tweakClass, tweakPriority))
552 { 555 {
553 LiteLoaderLogger.info("tweakClass '%s' was successfully added", tweakClass); 556 LiteLoaderLogger.info("tweakClass '%s' was successfully added", tweakClass);
554 container.injectIntoClassPath(this.classLoader, true); 557 container.injectIntoClassPath(this.classLoader, true);
@@ -589,7 +592,7 @@ public class LiteLoaderEnumerator implements LoaderEnumerator @@ -589,7 +592,7 @@ public class LiteLoaderEnumerator implements LoaderEnumerator
589 for (String classTransformerClass : classTransformerClasses) 592 for (String classTransformerClass : classTransformerClasses)
590 { 593 {
591 LiteLoaderLogger.info("Mod file '%s' provides classTransformer '%s', adding to class loader", container.getName(), classTransformerClass); 594 LiteLoaderLogger.info("Mod file '%s' provides classTransformer '%s', adding to class loader", container.getName(), classTransformerClass);
592 - if (LiteLoaderTweaker.getTransformerManager().injectTransformer(classTransformerClass)) 595 + if (this.tweaker.getTransformerManager().injectTransformer(classTransformerClass))
593 { 596 {
594 LiteLoaderLogger.info("classTransformer '%s' was successfully added", classTransformerClass); 597 LiteLoaderLogger.info("classTransformer '%s' was successfully added", classTransformerClass);
595 container.injectIntoClassPath(this.classLoader, true); 598 container.injectIntoClassPath(this.classLoader, true);
java/common/com/mumfrey/liteloader/core/LiteLoaderMods.java
@@ -59,6 +59,11 @@ public class LiteLoaderMods @@ -59,6 +59,11 @@ public class LiteLoaderMods
59 protected final LoaderEnumerator enumerator; 59 protected final LoaderEnumerator enumerator;
60 60
61 /** 61 /**
  62 + * Tweaker
  63 + */
  64 + private final LiteLoaderTweaker tweaker;
  65 +
  66 + /**
62 * Configuration manager 67 * Configuration manager
63 */ 68 */
64 private final ConfigManager configManager; 69 private final ConfigManager configManager;
@@ -100,6 +105,7 @@ public class LiteLoaderMods @@ -100,6 +105,7 @@ public class LiteLoaderMods
100 this.loader = loader; 105 this.loader = loader;
101 this.environment = environment; 106 this.environment = environment;
102 this.enumerator = environment.getEnumerator(); 107 this.enumerator = environment.getEnumerator();
  108 + this.tweaker = (LiteLoaderTweaker)environment.getTweaker();
103 this.properties = properties; 109 this.properties = properties;
104 this.configManager = configManager; 110 this.configManager = configManager;
105 } 111 }
@@ -681,7 +687,7 @@ public class LiteLoaderMods @@ -681,7 +687,7 @@ public class LiteLoaderMods
681 */ 687 */
682 private void validateModTransformers() 688 private void validateModTransformers()
683 { 689 {
684 - ClassTransformerManager transformerManager = LiteLoaderTweaker.getTransformerManager(); 690 + ClassTransformerManager transformerManager = this.tweaker.getTransformerManager();
685 Set<String> injectedTransformers = transformerManager.getInjectedTransformers(); 691 Set<String> injectedTransformers = transformerManager.getInjectedTransformers();
686 692
687 for (Mod mod : this.loadedMods) 693 for (Mod mod : this.loadedMods)
@@ -737,7 +743,7 @@ public class LiteLoaderMods @@ -737,7 +743,7 @@ public class LiteLoaderMods
737 { 743 {
738 if (!mod.hasClassTransformers()) return false; 744 if (!mod.hasClassTransformers()) return false;
739 745
740 - Set<String> injectedTransformers = LiteLoaderTweaker.getTransformerManager().getInjectedTransformers(); 746 + Set<String> injectedTransformers = this.tweaker.getTransformerManager().getInjectedTransformers();
741 List<String> modTransformers = ((TweakContainer<?>)mod.getContainer()).getClassTransformerClassNames(); 747 List<String> modTransformers = ((TweakContainer<?>)mod.getContainer()).getClassTransformerClassNames();
742 748
743 for (String modTransformer : modTransformers) 749 for (String modTransformer : modTransformers)
java/common/com/mumfrey/liteloader/launch/LiteLoaderTweaker.java
@@ -14,7 +14,6 @@ import net.minecraft.launchwrapper.ITweaker; @@ -14,7 +14,6 @@ import net.minecraft.launchwrapper.ITweaker;
14 import net.minecraft.launchwrapper.Launch; 14 import net.minecraft.launchwrapper.Launch;
15 import net.minecraft.launchwrapper.LaunchClassLoader; 15 import net.minecraft.launchwrapper.LaunchClassLoader;
16 16
17 -import com.google.common.base.Throwables;  
18 import com.mumfrey.liteloader.util.SortableValue; 17 import com.mumfrey.liteloader.util.SortableValue;
19 import com.mumfrey.liteloader.util.log.LiteLoaderLogger; 18 import com.mumfrey.liteloader.util.log.LiteLoaderLogger;
20 19
@@ -162,16 +161,39 @@ public class LiteLoaderTweaker implements ITweaker @@ -162,16 +161,39 @@ public class LiteLoaderTweaker implements ITweaker
162 } 161 }
163 } 162 }
164 163
165 - private static LiteLoaderTweaker instance; 164 + /**
  165 + * Singleton instance, mainly for delegating from injected callbacks which need a static method to call
  166 + */
  167 + protected static LiteLoaderTweaker instance;
166 168
167 - protected URL jarUrl; 169 + /**
  170 + * Approximate location of the minecraft jar, used for "base" injection position in ClassPathUtilities
  171 + */
  172 + protected static URL jarUrl;
168 173
  174 + /**
  175 + * "Order" value for inserted tweakers, used as disambiguating sort criteria for injected tweakers which have the same priority
  176 + */
169 protected int tweakOrder = 0; 177 protected int tweakOrder = 0;
  178 +
  179 + /**
  180 + * All tweakers, used to avoid injecting duplicates
  181 + */
170 protected Set<String> allCascadingTweaks = new HashSet<String>(); 182 protected Set<String> allCascadingTweaks = new HashSet<String>();
  183 +
  184 + /**
  185 + * Sorted list of tweakers, used to sort tweakers before injecting
  186 + */
171 protected Set<SortableValue<String>> sortedCascadingTweaks = new TreeSet<SortableValue<String>>(); 187 protected Set<SortableValue<String>> sortedCascadingTweaks = new TreeSet<SortableValue<String>>();
172 188
  189 + /**
  190 + * True if this is the primary tweak, not known until at least PREJOINGAME
  191 + */
173 protected boolean isPrimary; 192 protected boolean isPrimary;
174 193
  194 + /**
  195 + * Startup environment information, used to store info about the current startup in one place, also handles parsing command line arguments
  196 + */
175 protected StartupEnvironment env; 197 protected StartupEnvironment env;
176 198
177 /** 199 /**
@@ -179,22 +201,78 @@ public class LiteLoaderTweaker implements ITweaker @@ -179,22 +201,78 @@ public class LiteLoaderTweaker implements ITweaker
179 */ 201 */
180 protected LoaderBootstrap bootstrap; 202 protected LoaderBootstrap bootstrap;
181 203
182 - protected LoaderProperties properties;  
183 -  
184 /** 204 /**
185 * Transformer manager 205 * Transformer manager
186 */ 206 */
187 protected ClassTransformerManager transformerManager; 207 protected ClassTransformerManager transformerManager;
188 208
  209 + /* (non-Javadoc)
  210 + * @see net.minecraft.launchwrapper.ITweaker#acceptOptions(java.util.List, java.io.File, java.io.File, java.lang.String)
  211 + */
189 @Override 212 @Override
190 public void acceptOptions(List<String> args, File gameDirectory, File assetsDirectory, String profile) 213 public void acceptOptions(List<String> args, File gameDirectory, File assetsDirectory, String profile)
191 { 214 {
192 Launch.classLoader.addClassLoaderExclusion("com.google.common."); 215 Launch.classLoader.addClassLoaderExclusion("com.google.common.");
193 LiteLoaderTweaker.instance = this; 216 LiteLoaderTweaker.instance = this;
194 217
195 - this.prepare(args, gameDirectory, assetsDirectory, profile); 218 + this.onPrepare(args, gameDirectory, assetsDirectory, profile);
196 219
197 - this.preInit(); 220 + this.onPreInit();
  221 + }
  222 +
  223 + /* (non-Javadoc)
  224 + * @see net.minecraft.launchwrapper.ITweaker#injectIntoClassLoader(net.minecraft.launchwrapper.LaunchClassLoader)
  225 + */
  226 + @Override
  227 + public void injectIntoClassLoader(LaunchClassLoader classLoader)
  228 + {
  229 + classLoader.addClassLoaderExclusion("com.mumfrey.liteloader.core.runtime.Obf");
  230 + classLoader.addClassLoaderExclusion("com.mumfrey.liteloader.core.runtime.Packets");
  231 +
  232 + this.transformerManager.injectUpstreamTransformers(classLoader);
  233 +
  234 + for (String transformerClassName : this.bootstrap.getRequiredDownstreamTransformers())
  235 + {
  236 + LiteLoaderLogger.info("Queuing required class transformer '%s'", transformerClassName);
  237 + this.transformerManager.injectTransformer(transformerClassName);
  238 + }
  239 + }
  240 +
  241 + /* (non-Javadoc)
  242 + * @see net.minecraft.launchwrapper.ITweaker#getLaunchTarget()
  243 + */
  244 + @Override
  245 + public String getLaunchTarget()
  246 + {
  247 + this.isPrimary = true;
  248 + this.onPreBeginGame();
  249 +
  250 + return "net.minecraft.client.main.Main";
  251 + }
  252 +
  253 + /* (non-Javadoc)
  254 + * @see net.minecraft.launchwrapper.ITweaker#getLaunchArguments()
  255 + */
  256 + @Override
  257 + public String[] getLaunchArguments()
  258 + {
  259 + return this.env.getLaunchArguments();
  260 + }
  261 +
  262 + /**
  263 + * Return true if this is the primary tweaker
  264 + */
  265 + public boolean isPrimary()
  266 + {
  267 + return this.isPrimary;
  268 + }
  269 +
  270 + /**
  271 + * Get the class transformer manager
  272 + */
  273 + public ClassTransformerManager getTransformerManager()
  274 + {
  275 + return this.transformerManager;
198 } 276 }
199 277
200 /** 278 /**
@@ -203,7 +281,7 @@ public class LiteLoaderTweaker implements ITweaker @@ -203,7 +281,7 @@ public class LiteLoaderTweaker implements ITweaker
203 * @param profile 281 * @param profile
204 * @param apisToLoad 282 * @param apisToLoad
205 */ 283 */
206 - private void prepare(List<String> args, File gameDirectory, File assetsDirectory, String profile) 284 + private void onPrepare(List<String> args, File gameDirectory, File assetsDirectory, String profile)
207 { 285 {
208 LiteLoaderLogger.info("Bootstrapping LiteLoader " + LiteLoaderTweaker.VERSION); 286 LiteLoaderLogger.info("Bootstrapping LiteLoader " + LiteLoaderTweaker.VERSION);
209 287
@@ -212,7 +290,6 @@ public class LiteLoaderTweaker implements ITweaker @@ -212,7 +290,6 @@ public class LiteLoaderTweaker implements ITweaker
212 this.initEnvironment(args, gameDirectory, assetsDirectory, profile); 290 this.initEnvironment(args, gameDirectory, assetsDirectory, profile);
213 291
214 this.bootstrap = this.spawnBootstrap(LiteLoaderTweaker.bootstrapClassName, Launch.classLoader); 292 this.bootstrap = this.spawnBootstrap(LiteLoaderTweaker.bootstrapClassName, Launch.classLoader);
215 - this.properties = this.bootstrap.getProperties();  
216 293
217 this.transformerManager = new ClassTransformerManager(this.bootstrap.getRequiredTransformers()); 294 this.transformerManager = new ClassTransformerManager(this.bootstrap.getRequiredTransformers());
218 this.transformerManager.injectTransformers(this.bootstrap.getPacketTransformers()); 295 this.transformerManager.injectTransformers(this.bootstrap.getPacketTransformers());
@@ -228,7 +305,7 @@ public class LiteLoaderTweaker implements ITweaker @@ -228,7 +305,7 @@ public class LiteLoaderTweaker implements ITweaker
228 /** 305 /**
229 * Do the first stage of loader startup, which enumerates mod sources and finds tweakers 306 * Do the first stage of loader startup, which enumerates mod sources and finds tweakers
230 */ 307 */
231 - private void preInit() 308 + private void onPreInit()
232 { 309 {
233 StartupState.PREINIT.gotoState(); 310 StartupState.PREINIT.gotoState();
234 311
@@ -245,13 +322,16 @@ public class LiteLoaderTweaker implements ITweaker @@ -245,13 +322,16 @@ public class LiteLoaderTweaker implements ITweaker
245 } 322 }
246 } 323 }
247 324
248 - public static void preBeginGame() 325 + /**
  326 + *
  327 + */
  328 + private void onPreBeginGame()
249 { 329 {
250 StartupState.BEGINGAME.gotoState(); 330 StartupState.BEGINGAME.gotoState();
251 try 331 try
252 { 332 {
253 - LiteLoaderTweaker.instance.transformerManager.injectDownstreamTransformers(Launch.classLoader);  
254 - LiteLoaderTweaker.instance.bootstrap.preBeginGame(); 333 + this.transformerManager.injectDownstreamTransformers(Launch.classLoader);
  334 + this.bootstrap.preBeginGame();
255 StartupState.BEGINGAME.completed(); 335 StartupState.BEGINGAME.completed();
256 } 336 }
257 catch (Throwable th) 337 catch (Throwable th)
@@ -263,13 +343,13 @@ public class LiteLoaderTweaker implements ITweaker @@ -263,13 +343,13 @@ public class LiteLoaderTweaker implements ITweaker
263 /** 343 /**
264 * Do the second stage of loader startup 344 * Do the second stage of loader startup
265 */ 345 */
266 - public static void init() 346 + private void onInit()
267 { 347 {
268 StartupState.INIT.gotoState(); 348 StartupState.INIT.gotoState();
269 349
270 try 350 try
271 { 351 {
272 - LiteLoaderTweaker.instance.bootstrap.init(Launch.classLoader); 352 + this.bootstrap.init();
273 StartupState.INIT.completed(); 353 StartupState.INIT.completed();
274 } 354 }
275 catch (Throwable th) 355 catch (Throwable th)
@@ -281,13 +361,13 @@ public class LiteLoaderTweaker implements ITweaker @@ -281,13 +361,13 @@ public class LiteLoaderTweaker implements ITweaker
281 /** 361 /**
282 * Do the second stage of loader startup 362 * Do the second stage of loader startup
283 */ 363 */
284 - public static void postInit() 364 + private void onPostInit()
285 { 365 {
286 StartupState.POSTINIT.gotoState(); 366 StartupState.POSTINIT.gotoState();
287 367
288 try 368 try
289 { 369 {
290 - LiteLoaderTweaker.instance.bootstrap.postInit(); 370 + this.bootstrap.postInit();
291 StartupState.POSTINIT.completed(); 371 StartupState.POSTINIT.completed();
292 372
293 StartupState.DONE.gotoState(); 373 StartupState.DONE.gotoState();
@@ -298,81 +378,25 @@ public class LiteLoaderTweaker implements ITweaker @@ -298,81 +378,25 @@ public class LiteLoaderTweaker implements ITweaker
298 } 378 }
299 } 379 }
300 380
301 - protected void initEnvironment(List<String> args, File gameDirectory, File assetsDirectory, String profile) 381 + /**
  382 + * Set up the startup environment
  383 + *
  384 + * @param args
  385 + * @param gameDirectory
  386 + * @param assetsDirectory
  387 + * @param profile
  388 + */
  389 + private void initEnvironment(List<String> args, File gameDirectory, File assetsDirectory, String profile)
302 { 390 {
303 - this.env = new StartupEnvironment(args, gameDirectory, assetsDirectory, profile)  
304 - {  
305 - @Override  
306 - public void registerCoreAPIs(List<String> apisToLoad)  
307 - {  
308 - apisToLoad.add(0, "com.mumfrey.liteloader.client.api.LiteLoaderCoreAPIClient");  
309 - }  
310 -  
311 - @Override  
312 - public int getEnvironmentTypeId()  
313 - {  
314 - return LiteLoaderTweaker.ENV_TYPE_CLIENT;  
315 - }  
316 - }; 391 + this.env = this.spawnStartupEnvironment(args, gameDirectory, assetsDirectory, profile);
317 392
318 URL[] urls = Launch.classLoader.getURLs(); 393 URL[] urls = Launch.classLoader.getURLs();
319 - this.jarUrl = urls[urls.length - 1]; // probably?  
320 - }  
321 -  
322 - @Override  
323 - public void injectIntoClassLoader(LaunchClassLoader classLoader)  
324 - {  
325 - classLoader.addClassLoaderExclusion("com.mumfrey.liteloader.core.runtime.Obf");  
326 - classLoader.addClassLoaderExclusion("com.mumfrey.liteloader.core.runtime.Packets");  
327 -  
328 - LiteLoaderTweaker.instance.transformerManager.injectUpstreamTransformers(classLoader);  
329 -  
330 - for (String transformerClassName : this.bootstrap.getRequiredDownstreamTransformers())  
331 - {  
332 - LiteLoaderLogger.info("Queuing required class transformer '%s'", transformerClassName);  
333 - LiteLoaderTweaker.instance.transformerManager.injectTransformer(transformerClassName);  
334 - }  
335 - }  
336 -  
337 - @Override  
338 - public String getLaunchTarget()  
339 - {  
340 - this.isPrimary = true;  
341 - LiteLoaderTweaker.preBeginGame();  
342 -  
343 - return "net.minecraft.client.main.Main";  
344 - }  
345 -  
346 - @Override  
347 - public String[] getLaunchArguments()  
348 - {  
349 - return this.env.getLaunchArguments();  
350 - }  
351 -  
352 - public static boolean addCascadedTweaker(String tweakClass, int priority)  
353 - {  
354 - return LiteLoaderTweaker.instance.addTweakToSortedList(tweakClass, priority);  
355 - }  
356 -  
357 - private boolean addTweakToSortedList(String tweakClass, int priority)  
358 - {  
359 - if (tweakClass != null && !this.allCascadingTweaks.contains(tweakClass))  
360 - {  
361 - if (this.getClass().getName().equals(tweakClass))  
362 - return false;  
363 -  
364 - if (LiteLoaderTweaker.isTweakAlreadyEnqueued(tweakClass))  
365 - return false;  
366 -  
367 - this.allCascadingTweaks.add(tweakClass);  
368 - this.sortedCascadingTweaks.add(new SortableValue<String>(priority, this.tweakOrder++, tweakClass));  
369 - return true;  
370 - }  
371 -  
372 - return false; 394 + LiteLoaderTweaker.jarUrl = urls[urls.length - 1]; // probably?
373 } 395 }
374 396
375 - @SuppressWarnings("unchecked") 397 + /**
  398 + * Injects discovered tweak classes
  399 + */
376 private void injectDiscoveredTweakClasses() 400 private void injectDiscoveredTweakClasses()
377 { 401 {
378 if (this.sortedCascadingTweaks.size() > 0) 402 if (this.sortedCascadingTweaks.size() > 0)
@@ -385,7 +409,9 @@ public class LiteLoaderTweaker implements ITweaker @@ -385,7 +409,9 @@ public class LiteLoaderTweaker implements ITweaker
385 409
386 LiteLoaderLogger.info("Injecting cascaded tweakers..."); 410 LiteLoaderLogger.info("Injecting cascaded tweakers...");
387 411
  412 + @SuppressWarnings("unchecked")
388 List<String> tweakClasses = (List<String>)Launch.blackboard.get("TweakClasses"); 413 List<String> tweakClasses = (List<String>)Launch.blackboard.get("TweakClasses");
  414 + @SuppressWarnings("unchecked")
389 List<ITweaker> tweakers = (List<ITweaker>)Launch.blackboard.get("Tweaks"); 415 List<ITweaker> tweakers = (List<ITweaker>)Launch.blackboard.get("Tweaks");
390 if (tweakClasses != null && tweakers != null) 416 if (tweakClasses != null && tweakers != null)
391 { 417 {
@@ -420,32 +446,37 @@ public class LiteLoaderTweaker implements ITweaker @@ -420,32 +446,37 @@ public class LiteLoaderTweaker implements ITweaker
420 tweakClasses.add(tweakClass); 446 tweakClasses.add(tweakClass);
421 } 447 }
422 } 448 }
423 - 449 +
424 /** 450 /**
425 - * @param url URL to add 451 + * @param tweakClass
  452 + * @param priority
  453 + * @return
426 */ 454 */
427 - public static boolean addURLToParentClassLoader(URL url) 455 + public boolean addCascadedTweaker(String tweakClass, int priority)
428 { 456 {
429 - if (StartupState.getCurrent() == StartupState.PREINIT && StartupState.PREINIT.isInState()) 457 + if (tweakClass != null && !this.allCascadingTweaks.contains(tweakClass))
430 { 458 {
431 - try  
432 - {  
433 - URLClassLoader classLoader = (URLClassLoader)Launch.class.getClassLoader();  
434 - Method mAddUrl = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);  
435 - mAddUrl.setAccessible(true);  
436 - mAddUrl.invoke(classLoader, url);  
437 -  
438 - return true;  
439 - }  
440 - catch (Exception ex)  
441 - {  
442 - LiteLoaderLogger.warning(ex, "addURLToParentClassLoader failed: %s", ex.getMessage());  
443 - }  
444 - } 459 + if (this.getClass().getName().equals(tweakClass))
  460 + return false;
445 461
  462 + if (LiteLoaderTweaker.isTweakAlreadyEnqueued(tweakClass))
  463 + return false;
  464 +
  465 + this.allCascadingTweaks.add(tweakClass);
  466 + this.sortedCascadingTweaks.add(new SortableValue<String>(priority, this.tweakOrder++, tweakClass));
  467 + return true;
  468 + }
  469 +
446 return false; 470 return false;
447 } 471 }
448 472
  473 + /**
  474 + * The bootstrap object has to be spawned using reflection for obvious reasons,
  475 + *
  476 + * @param bootstrapClassName
  477 + * @param classLoader
  478 + * @return
  479 + */
449 protected LoaderBootstrap spawnBootstrap(String bootstrapClassName, ClassLoader classLoader) 480 protected LoaderBootstrap spawnBootstrap(String bootstrapClassName, ClassLoader classLoader)
450 { 481 {
451 if (!StartupState.PREPARE.isInState()) 482 if (!StartupState.PREPARE.isInState())
@@ -464,27 +495,72 @@ public class LiteLoaderTweaker implements ITweaker @@ -464,27 +495,72 @@ public class LiteLoaderTweaker implements ITweaker
464 } 495 }
465 catch (Throwable th) 496 catch (Throwable th)
466 { 497 {
467 - Throwables.propagate(th); 498 + throw new RuntimeException(th);
468 } 499 }
469 -  
470 - return null;  
471 } 500 }
472 -  
473 - public static URL getJarUrl() 501 +
  502 + /**
  503 + * @param args
  504 + * @param gameDirectory
  505 + * @param assetsDirectory
  506 + * @param profile
  507 + * @return
  508 + */
  509 + protected StartupEnvironment spawnStartupEnvironment(List<String> args, File gameDirectory, File assetsDirectory, String profile)
474 { 510 {
475 - return LiteLoaderTweaker.instance.jarUrl; 511 + return new StartupEnvironment(args, gameDirectory, assetsDirectory, profile)
  512 + {
  513 + @Override
  514 + public void registerCoreAPIs(List<String> apisToLoad)
  515 + {
  516 + apisToLoad.add(0, "com.mumfrey.liteloader.client.api.LiteLoaderCoreAPIClient");
  517 + }
  518 +
  519 + @Override
  520 + public int getEnvironmentTypeId()
  521 + {
  522 + return LiteLoaderTweaker.ENV_TYPE_CLIENT;
  523 + }
  524 + };
476 } 525 }
477 -  
478 - public static boolean isPrimary() 526 +
  527 + /**
  528 + * @return
  529 + */
  530 + public static URL getJarUrl()
479 { 531 {
480 - return LiteLoaderTweaker.instance.isPrimary; 532 + return LiteLoaderTweaker.jarUrl;
481 } 533 }
482 534
483 - public static ClassTransformerManager getTransformerManager() 535 + /**
  536 + * @param url URL to add
  537 + */
  538 + public static boolean addURLToParentClassLoader(URL url)
484 { 539 {
485 - return LiteLoaderTweaker.instance.transformerManager; 540 + if (StartupState.getCurrent() == StartupState.PREINIT && StartupState.PREINIT.isInState())
  541 + {
  542 + try
  543 + {
  544 + URLClassLoader classLoader = (URLClassLoader)Launch.class.getClassLoader();
  545 + Method mAddUrl = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
  546 + mAddUrl.setAccessible(true);
  547 + mAddUrl.invoke(classLoader, url);
  548 +
  549 + return true;
  550 + }
  551 + catch (Exception ex)
  552 + {
  553 + LiteLoaderLogger.warning(ex, "addURLToParentClassLoader failed: %s", ex.getMessage());
  554 + }
  555 + }
  556 +
  557 + return false;
486 } 558 }
487 - 559 +
  560 + /**
  561 + * @param clazz
  562 + * @return
  563 + */
488 @SuppressWarnings("unchecked") 564 @SuppressWarnings("unchecked")
489 private static boolean isTweakAlreadyEnqueued(String clazz) 565 private static boolean isTweakAlreadyEnqueued(String clazz)
490 { 566 {
@@ -510,8 +586,36 @@ public class LiteLoaderTweaker implements ITweaker @@ -510,8 +586,36 @@ public class LiteLoaderTweaker implements ITweaker
510 return false; 586 return false;
511 } 587 }
512 588
  589 + /**
  590 + * @return
  591 + */
513 public static boolean loadingBarEnabled() 592 public static boolean loadingBarEnabled()
514 { 593 {
515 - return LiteLoaderTweaker.instance.properties != null ? LiteLoaderTweaker.instance.properties.getBooleanProperty("loadingbar") : false; 594 + LoaderProperties properties = LiteLoaderTweaker.instance.bootstrap.getProperties();
  595 + return properties != null && properties.getBooleanProperty("loadingbar");
  596 + }
  597 +
  598 + /**
  599 + * Callback from the "Main" class, do the PREBEGINGAME steps (inject "downstream" transformers)
  600 + */
  601 + public static void preBeginGame()
  602 + {
  603 + LiteLoaderTweaker.instance.onPreBeginGame();
  604 + }
  605 +
  606 + /**
  607 + * Callback from Minecraft::startGame() do early mod initialisation
  608 + */
  609 + public static void init()
  610 + {
  611 + LiteLoaderTweaker.instance.onInit();
  612 + }
  613 +
  614 + /**
  615 + * Callback from Minecraft::startGame() do late mod initialisation
  616 + */
  617 + public static void postInit()
  618 + {
  619 + LiteLoaderTweaker.instance.onPostInit();
516 } 620 }
517 } 621 }
518 \ No newline at end of file 622 \ No newline at end of file
java/common/com/mumfrey/liteloader/launch/LiteLoaderTweakerServer.java
1 package com.mumfrey.liteloader.launch; 1 package com.mumfrey.liteloader.launch;
2 2
3 import java.io.File; 3 import java.io.File;
4 -import java.net.URL;  
5 import java.util.List; 4 import java.util.List;
6 5
7 -import net.minecraft.launchwrapper.Launch;  
8 -  
9 public class LiteLoaderTweakerServer extends LiteLoaderTweaker 6 public class LiteLoaderTweakerServer extends LiteLoaderTweaker
10 { 7 {
11 @Override 8 @Override
12 - protected void initEnvironment(List<String> args, File gameDirectory, File assetsDirectory, String profile) 9 + protected StartupEnvironment spawnStartupEnvironment(List<String> args, File gameDirectory, File assetsDirectory, String profile)
13 { 10 {
14 - this.env = new StartupEnvironment(args, gameDirectory, assetsDirectory, profile) 11 + return new StartupEnvironment(args, gameDirectory, assetsDirectory, profile)
15 { 12 {
16 @Override 13 @Override
17 public void registerCoreAPIs(List<String> apisToLoad) 14 public void registerCoreAPIs(List<String> apisToLoad)
@@ -25,9 +22,6 @@ public class LiteLoaderTweakerServer extends LiteLoaderTweaker @@ -25,9 +22,6 @@ public class LiteLoaderTweakerServer extends LiteLoaderTweaker
25 return LiteLoaderTweaker.ENV_TYPE_DEDICATEDSERVER; 22 return LiteLoaderTweaker.ENV_TYPE_DEDICATEDSERVER;
26 } 23 }
27 }; 24 };
28 -  
29 - URL[] urls = Launch.classLoader.getURLs();  
30 - this.jarUrl = urls[urls.length - 1]; // probably?  
31 } 25 }
32 26
33 @Override 27 @Override
java/common/com/mumfrey/liteloader/launch/LoaderBootstrap.java
@@ -30,7 +30,7 @@ public interface LoaderBootstrap @@ -30,7 +30,7 @@ public interface LoaderBootstrap
30 /** 30 /**
31 * Init, create the loader instance and load mods 31 * Init, create the loader instance and load mods
32 */ 32 */
33 - public abstract void init(LaunchClassLoader classLoader); 33 + public abstract void init();
34 34
35 /** 35 /**
36 * Post-init, initialise loaded mods 36 * Post-init, initialise loaded mods
java/common/com/mumfrey/liteloader/launch/LoaderEnvironment.java
@@ -2,6 +2,8 @@ package com.mumfrey.liteloader.launch; @@ -2,6 +2,8 @@ package com.mumfrey.liteloader.launch;
2 2
3 import java.io.File; 3 import java.io.File;
4 4
  5 +import net.minecraft.launchwrapper.ITweaker;
  6 +
5 import com.mumfrey.liteloader.api.manager.APIAdapter; 7 import com.mumfrey.liteloader.api.manager.APIAdapter;
6 import com.mumfrey.liteloader.api.manager.APIProvider; 8 import com.mumfrey.liteloader.api.manager.APIProvider;
7 import com.mumfrey.liteloader.core.EnabledModsList; 9 import com.mumfrey.liteloader.core.EnabledModsList;
@@ -73,4 +75,9 @@ public interface LoaderEnvironment extends GameEnvironment @@ -73,4 +75,9 @@ public interface LoaderEnvironment extends GameEnvironment
73 * @return 75 * @return
74 */ 76 */
75 public abstract File inflectVersionedConfigPath(LiteLoaderVersion version); 77 public abstract File inflectVersionedConfigPath(LiteLoaderVersion version);
  78 +
  79 + /**
  80 + * Get the tweaker
  81 + */
  82 + public abstract ITweaker getTweaker();
76 } 83 }