Commit cffaacc682924d96028c90e0adf73b336973b9c5
1 parent
97de196e
clean up LiteLoaderTweaker a bit and don't rely on singleton for some public contracts
Showing
7 changed files
with
263 additions
and
137 deletions
java/common/com/mumfrey/liteloader/core/LiteLoaderBootstrap.java
| ... | ... | @@ -17,6 +17,7 @@ import org.apache.logging.log4j.core.Logger; |
| 17 | 17 | import org.apache.logging.log4j.core.appender.FileAppender; |
| 18 | 18 | import org.apache.logging.log4j.core.layout.PatternLayout; |
| 19 | 19 | |
| 20 | +import net.minecraft.launchwrapper.ITweaker; | |
| 20 | 21 | import net.minecraft.launchwrapper.Launch; |
| 21 | 22 | import net.minecraft.launchwrapper.LaunchClassLoader; |
| 22 | 23 | |
| ... | ... | @@ -120,6 +121,10 @@ class LiteLoaderBootstrap implements LoaderBootstrap, LoaderEnvironment, LoaderP |
| 120 | 121 | private String branding = null; |
| 121 | 122 | |
| 122 | 123 | private boolean loadTweaks = true; |
| 124 | + | |
| 125 | + private LaunchClassLoader classLoader; | |
| 126 | + | |
| 127 | + private final ITweaker tweaker; | |
| 123 | 128 | |
| 124 | 129 | private final APIRegistry apiRegistry; |
| 125 | 130 | |
| ... | ... | @@ -140,13 +145,13 @@ class LiteLoaderBootstrap implements LoaderBootstrap, LoaderEnvironment, LoaderP |
| 140 | 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 | 153 | this.environmentType = EnvironmentType.values()[env.getEnvironmentTypeId()]; |
| 154 | + this.tweaker = tweaker; | |
| 150 | 155 | |
| 151 | 156 | this.apiRegistry = new APIRegistry(this.getEnvironment(), this.getProperties()); |
| 152 | 157 | |
| ... | ... | @@ -255,12 +260,19 @@ class LiteLoaderBootstrap implements LoaderBootstrap, LoaderEnvironment, LoaderP |
| 255 | 260 | return this; |
| 256 | 261 | } |
| 257 | 262 | |
| 263 | + @Override | |
| 264 | + public ITweaker getTweaker() | |
| 265 | + { | |
| 266 | + return this.tweaker; | |
| 267 | + } | |
| 268 | + | |
| 258 | 269 | /* (non-Javadoc) |
| 259 | 270 | * @see com.mumfrey.liteloader.launch.ILoaderBootstrap#preInit(net.minecraft.launchwrapper.LaunchClassLoader, boolean) |
| 260 | 271 | */ |
| 261 | 272 | @Override |
| 262 | 273 | public void preInit(LaunchClassLoader classLoader, boolean loadTweaks, List<String> modsToLoad) |
| 263 | 274 | { |
| 275 | + this.classLoader = classLoader; | |
| 264 | 276 | this.loadTweaks = loadTweaks; |
| 265 | 277 | |
| 266 | 278 | LiteLoaderLogger.info("LiteLoader begin PREINIT..."); |
| ... | ... | @@ -315,12 +327,12 @@ class LiteLoaderBootstrap implements LoaderBootstrap, LoaderEnvironment, LoaderP |
| 315 | 327 | * @see com.mumfrey.liteloader.launch.ILoaderBootstrap#init(java.util.List, net.minecraft.launchwrapper.LaunchClassLoader) |
| 316 | 328 | */ |
| 317 | 329 | @Override |
| 318 | - public void init(LaunchClassLoader classLoader) | |
| 330 | + public void init() | |
| 319 | 331 | { |
| 320 | 332 | // PreInit failed |
| 321 | 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 | 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 | 69 | private final LoaderEnvironment environment; |
| 70 | 70 | |
| 71 | 71 | private final LoaderProperties properties; |
| 72 | + | |
| 73 | + private final LiteLoaderTweaker tweaker; | |
| 72 | 74 | |
| 73 | 75 | /** |
| 74 | 76 | * Reference to the launch classloader |
| ... | ... | @@ -124,6 +126,7 @@ public class LiteLoaderEnumerator implements LoaderEnumerator |
| 124 | 126 | { |
| 125 | 127 | this.environment = environment; |
| 126 | 128 | this.properties = properties; |
| 129 | + this.tweaker = (LiteLoaderTweaker)environment.getTweaker(); | |
| 127 | 130 | this.classLoader = classLoader; |
| 128 | 131 | this.supportedPrefixes = this.getSupportedPrefixes(environment); |
| 129 | 132 | |
| ... | ... | @@ -548,7 +551,7 @@ public class LiteLoaderEnumerator implements LoaderEnumerator |
| 548 | 551 | String tweakClass = container.getTweakClassName(); |
| 549 | 552 | int tweakPriority = container.getTweakPriority(); |
| 550 | 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 | 556 | LiteLoaderLogger.info("tweakClass '%s' was successfully added", tweakClass); |
| 554 | 557 | container.injectIntoClassPath(this.classLoader, true); |
| ... | ... | @@ -589,7 +592,7 @@ public class LiteLoaderEnumerator implements LoaderEnumerator |
| 589 | 592 | for (String classTransformerClass : classTransformerClasses) |
| 590 | 593 | { |
| 591 | 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 | 597 | LiteLoaderLogger.info("classTransformer '%s' was successfully added", classTransformerClass); |
| 595 | 598 | container.injectIntoClassPath(this.classLoader, true); | ... | ... |
java/common/com/mumfrey/liteloader/core/LiteLoaderMods.java
| ... | ... | @@ -59,6 +59,11 @@ public class LiteLoaderMods |
| 59 | 59 | protected final LoaderEnumerator enumerator; |
| 60 | 60 | |
| 61 | 61 | /** |
| 62 | + * Tweaker | |
| 63 | + */ | |
| 64 | + private final LiteLoaderTweaker tweaker; | |
| 65 | + | |
| 66 | + /** | |
| 62 | 67 | * Configuration manager |
| 63 | 68 | */ |
| 64 | 69 | private final ConfigManager configManager; |
| ... | ... | @@ -100,6 +105,7 @@ public class LiteLoaderMods |
| 100 | 105 | this.loader = loader; |
| 101 | 106 | this.environment = environment; |
| 102 | 107 | this.enumerator = environment.getEnumerator(); |
| 108 | + this.tweaker = (LiteLoaderTweaker)environment.getTweaker(); | |
| 103 | 109 | this.properties = properties; |
| 104 | 110 | this.configManager = configManager; |
| 105 | 111 | } |
| ... | ... | @@ -681,7 +687,7 @@ public class LiteLoaderMods |
| 681 | 687 | */ |
| 682 | 688 | private void validateModTransformers() |
| 683 | 689 | { |
| 684 | - ClassTransformerManager transformerManager = LiteLoaderTweaker.getTransformerManager(); | |
| 690 | + ClassTransformerManager transformerManager = this.tweaker.getTransformerManager(); | |
| 685 | 691 | Set<String> injectedTransformers = transformerManager.getInjectedTransformers(); |
| 686 | 692 | |
| 687 | 693 | for (Mod mod : this.loadedMods) |
| ... | ... | @@ -737,7 +743,7 @@ public class LiteLoaderMods |
| 737 | 743 | { |
| 738 | 744 | if (!mod.hasClassTransformers()) return false; |
| 739 | 745 | |
| 740 | - Set<String> injectedTransformers = LiteLoaderTweaker.getTransformerManager().getInjectedTransformers(); | |
| 746 | + Set<String> injectedTransformers = this.tweaker.getTransformerManager().getInjectedTransformers(); | |
| 741 | 747 | List<String> modTransformers = ((TweakContainer<?>)mod.getContainer()).getClassTransformerClassNames(); |
| 742 | 748 | |
| 743 | 749 | for (String modTransformer : modTransformers) | ... | ... |
java/common/com/mumfrey/liteloader/launch/LiteLoaderTweaker.java
| ... | ... | @@ -14,7 +14,6 @@ import net.minecraft.launchwrapper.ITweaker; |
| 14 | 14 | import net.minecraft.launchwrapper.Launch; |
| 15 | 15 | import net.minecraft.launchwrapper.LaunchClassLoader; |
| 16 | 16 | |
| 17 | -import com.google.common.base.Throwables; | |
| 18 | 17 | import com.mumfrey.liteloader.util.SortableValue; |
| 19 | 18 | import com.mumfrey.liteloader.util.log.LiteLoaderLogger; |
| 20 | 19 | |
| ... | ... | @@ -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 | 177 | protected int tweakOrder = 0; |
| 178 | + | |
| 179 | + /** | |
| 180 | + * All tweakers, used to avoid injecting duplicates | |
| 181 | + */ | |
| 170 | 182 | protected Set<String> allCascadingTweaks = new HashSet<String>(); |
| 183 | + | |
| 184 | + /** | |
| 185 | + * Sorted list of tweakers, used to sort tweakers before injecting | |
| 186 | + */ | |
| 171 | 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 | 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 | 197 | protected StartupEnvironment env; |
| 176 | 198 | |
| 177 | 199 | /** |
| ... | ... | @@ -179,22 +201,78 @@ public class LiteLoaderTweaker implements ITweaker |
| 179 | 201 | */ |
| 180 | 202 | protected LoaderBootstrap bootstrap; |
| 181 | 203 | |
| 182 | - protected LoaderProperties properties; | |
| 183 | - | |
| 184 | 204 | /** |
| 185 | 205 | * Transformer manager |
| 186 | 206 | */ |
| 187 | 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 | 212 | @Override |
| 190 | 213 | public void acceptOptions(List<String> args, File gameDirectory, File assetsDirectory, String profile) |
| 191 | 214 | { |
| 192 | 215 | Launch.classLoader.addClassLoaderExclusion("com.google.common."); |
| 193 | 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 | 281 | * @param profile |
| 204 | 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 | 286 | LiteLoaderLogger.info("Bootstrapping LiteLoader " + LiteLoaderTweaker.VERSION); |
| 209 | 287 | |
| ... | ... | @@ -212,7 +290,6 @@ public class LiteLoaderTweaker implements ITweaker |
| 212 | 290 | this.initEnvironment(args, gameDirectory, assetsDirectory, profile); |
| 213 | 291 | |
| 214 | 292 | this.bootstrap = this.spawnBootstrap(LiteLoaderTweaker.bootstrapClassName, Launch.classLoader); |
| 215 | - this.properties = this.bootstrap.getProperties(); | |
| 216 | 293 | |
| 217 | 294 | this.transformerManager = new ClassTransformerManager(this.bootstrap.getRequiredTransformers()); |
| 218 | 295 | this.transformerManager.injectTransformers(this.bootstrap.getPacketTransformers()); |
| ... | ... | @@ -228,7 +305,7 @@ public class LiteLoaderTweaker implements ITweaker |
| 228 | 305 | /** |
| 229 | 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 | 310 | StartupState.PREINIT.gotoState(); |
| 234 | 311 | |
| ... | ... | @@ -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 | 330 | StartupState.BEGINGAME.gotoState(); |
| 251 | 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 | 335 | StartupState.BEGINGAME.completed(); |
| 256 | 336 | } |
| 257 | 337 | catch (Throwable th) |
| ... | ... | @@ -263,13 +343,13 @@ public class LiteLoaderTweaker implements ITweaker |
| 263 | 343 | /** |
| 264 | 344 | * Do the second stage of loader startup |
| 265 | 345 | */ |
| 266 | - public static void init() | |
| 346 | + private void onInit() | |
| 267 | 347 | { |
| 268 | 348 | StartupState.INIT.gotoState(); |
| 269 | 349 | |
| 270 | 350 | try |
| 271 | 351 | { |
| 272 | - LiteLoaderTweaker.instance.bootstrap.init(Launch.classLoader); | |
| 352 | + this.bootstrap.init(); | |
| 273 | 353 | StartupState.INIT.completed(); |
| 274 | 354 | } |
| 275 | 355 | catch (Throwable th) |
| ... | ... | @@ -281,13 +361,13 @@ public class LiteLoaderTweaker implements ITweaker |
| 281 | 361 | /** |
| 282 | 362 | * Do the second stage of loader startup |
| 283 | 363 | */ |
| 284 | - public static void postInit() | |
| 364 | + private void onPostInit() | |
| 285 | 365 | { |
| 286 | 366 | StartupState.POSTINIT.gotoState(); |
| 287 | 367 | |
| 288 | 368 | try |
| 289 | 369 | { |
| 290 | - LiteLoaderTweaker.instance.bootstrap.postInit(); | |
| 370 | + this.bootstrap.postInit(); | |
| 291 | 371 | StartupState.POSTINIT.completed(); |
| 292 | 372 | |
| 293 | 373 | StartupState.DONE.gotoState(); |
| ... | ... | @@ -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 | 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 | 400 | private void injectDiscoveredTweakClasses() |
| 377 | 401 | { |
| 378 | 402 | if (this.sortedCascadingTweaks.size() > 0) |
| ... | ... | @@ -385,7 +409,9 @@ public class LiteLoaderTweaker implements ITweaker |
| 385 | 409 | |
| 386 | 410 | LiteLoaderLogger.info("Injecting cascaded tweakers..."); |
| 387 | 411 | |
| 412 | + @SuppressWarnings("unchecked") | |
| 388 | 413 | List<String> tweakClasses = (List<String>)Launch.blackboard.get("TweakClasses"); |
| 414 | + @SuppressWarnings("unchecked") | |
| 389 | 415 | List<ITweaker> tweakers = (List<ITweaker>)Launch.blackboard.get("Tweaks"); |
| 390 | 416 | if (tweakClasses != null && tweakers != null) |
| 391 | 417 | { |
| ... | ... | @@ -420,32 +446,37 @@ public class LiteLoaderTweaker implements ITweaker |
| 420 | 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 | 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 | 480 | protected LoaderBootstrap spawnBootstrap(String bootstrapClassName, ClassLoader classLoader) |
| 450 | 481 | { |
| 451 | 482 | if (!StartupState.PREPARE.isInState()) |
| ... | ... | @@ -464,27 +495,72 @@ public class LiteLoaderTweaker implements ITweaker |
| 464 | 495 | } |
| 465 | 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 | 564 | @SuppressWarnings("unchecked") |
| 489 | 565 | private static boolean isTweakAlreadyEnqueued(String clazz) |
| 490 | 566 | { |
| ... | ... | @@ -510,8 +586,36 @@ public class LiteLoaderTweaker implements ITweaker |
| 510 | 586 | return false; |
| 511 | 587 | } |
| 512 | 588 | |
| 589 | + /** | |
| 590 | + * @return | |
| 591 | + */ | |
| 513 | 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 | 622 | \ No newline at end of file | ... | ... |
java/common/com/mumfrey/liteloader/launch/LiteLoaderTweakerServer.java
| 1 | 1 | package com.mumfrey.liteloader.launch; |
| 2 | 2 | |
| 3 | 3 | import java.io.File; |
| 4 | -import java.net.URL; | |
| 5 | 4 | import java.util.List; |
| 6 | 5 | |
| 7 | -import net.minecraft.launchwrapper.Launch; | |
| 8 | - | |
| 9 | 6 | public class LiteLoaderTweakerServer extends LiteLoaderTweaker |
| 10 | 7 | { |
| 11 | 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 | 13 | @Override |
| 17 | 14 | public void registerCoreAPIs(List<String> apisToLoad) |
| ... | ... | @@ -25,9 +22,6 @@ public class LiteLoaderTweakerServer extends LiteLoaderTweaker |
| 25 | 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 | 27 | @Override | ... | ... |
java/common/com/mumfrey/liteloader/launch/LoaderBootstrap.java
java/common/com/mumfrey/liteloader/launch/LoaderEnvironment.java
| ... | ... | @@ -2,6 +2,8 @@ package com.mumfrey.liteloader.launch; |
| 2 | 2 | |
| 3 | 3 | import java.io.File; |
| 4 | 4 | |
| 5 | +import net.minecraft.launchwrapper.ITweaker; | |
| 6 | + | |
| 5 | 7 | import com.mumfrey.liteloader.api.manager.APIAdapter; |
| 6 | 8 | import com.mumfrey.liteloader.api.manager.APIProvider; |
| 7 | 9 | import com.mumfrey.liteloader.core.EnabledModsList; |
| ... | ... | @@ -73,4 +75,9 @@ public interface LoaderEnvironment extends GameEnvironment |
| 73 | 75 | * @return |
| 74 | 76 | */ |
| 75 | 77 | public abstract File inflectVersionedConfigPath(LiteLoaderVersion version); |
| 78 | + | |
| 79 | + /** | |
| 80 | + * Get the tweaker | |
| 81 | + */ | |
| 82 | + public abstract ITweaker getTweaker(); | |
| 76 | 83 | } | ... | ... |