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,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 | } |