Commit 36e210a016b36f9d5bc28dfcca5967e2f21f08f1

Authored by Mumfrey
1 parent 44a45235

Expose mixin functionality to mods

build.gradle
@@ -64,7 +64,7 @@ repositories { @@ -64,7 +64,7 @@ repositories {
64 } 64 }
65 65
66 dependencies { 66 dependencies {
67 - compile('org.spongepowered:mixin:0.4.10-SNAPSHOT') { 67 + compile('org.spongepowered:mixin:0.4.11-SNAPSHOT') {
68 exclude module: 'launchwrapper' 68 exclude module: 'launchwrapper'
69 exclude module: 'guava' 69 exclude module: 'guava'
70 } 70 }
@@ -113,7 +113,7 @@ javadoc { @@ -113,7 +113,7 @@ javadoc {
113 afterEvaluate { 113 afterEvaluate {
114 logger.lifecycle '=================================================' 114 logger.lifecycle '================================================='
115 logger.lifecycle ' LiteLoader' 115 logger.lifecycle ' LiteLoader'
116 - logger.lifecycle ' Copyright (C) 2011-2015 Adam Mummery-Smith' 116 + logger.lifecycle ' Copyright (C) 2011-2016 Adam Mummery-Smith'
117 logger.lifecycle ' Running in {} mode', (project.isReleaseBuild ? "RELEASE" : "SNAPSHOT") 117 logger.lifecycle ' Running in {} mode', (project.isReleaseBuild ? "RELEASE" : "SNAPSHOT")
118 logger.lifecycle '=================================================' 118 logger.lifecycle '================================================='
119 119
@@ -180,6 +180,14 @@ shadowJar { @@ -180,6 +180,14 @@ shadowJar {
180 classifier = 'release' 180 classifier = 'release'
181 } 181 }
182 182
  183 +sourceJar {
  184 + dependsOn retromapReplacedDebug
  185 + dependsOn retromapReplacedClient
  186 +
  187 + from zipTree(tasks.retromapReplacedDebug.out)
  188 + from zipTree(tasks.retromapReplacedClient.out)
  189 +}
  190 +
183 task javadocJar(type: Jar, dependsOn: javadoc) { 191 task javadocJar(type: Jar, dependsOn: javadoc) {
184 from javadoc.destinationDir 192 from javadoc.destinationDir
185 classifier = 'javadoc' 193 classifier = 'javadoc'
src/client/java/com/mumfrey/liteloader/client/api/LiteLoaderBrandingProvider.java
@@ -54,7 +54,7 @@ public class LiteLoaderBrandingProvider implements BrandingProvider @@ -54,7 +54,7 @@ public class LiteLoaderBrandingProvider implements BrandingProvider
54 @Override 54 @Override
55 public String getCopyrightText() 55 public String getCopyrightText()
56 { 56 {
57 - return "Copyright (c) 2012-2014 Adam Mummery-Smith"; 57 + return "Copyright (c) 2012-2016 Adam Mummery-Smith";
58 } 58 }
59 59
60 /* (non-Javadoc) 60 /* (non-Javadoc)
src/client/java/com/mumfrey/liteloader/client/api/LiteLoaderModInfoDecorator.java
@@ -74,6 +74,22 @@ public class LiteLoaderModInfoDecorator implements ModInfoDecorator @@ -74,6 +74,22 @@ public class LiteLoaderModInfoDecorator implements ModInfoDecorator
74 }); 74 });
75 } 75 }
76 76
  77 + if (mod.hasMixins())
  78 + {
  79 + icons.add(new IconAbsoluteClickable(LiteLoaderBrandingProvider.ABOUT_TEXTURE,
  80 + I18n.format("gui.mod.providesmixins"), 12, 12, 122, 104, 134, 116)
  81 + {
  82 + @Override
  83 + public void onClicked(Object source, Object container)
  84 + {
  85 + if (container instanceof GuiModListPanel)
  86 + {
  87 + ((GuiModListPanel)container).displayModHelpMessage(mod, "gui.mod.providesmixins", "gui.mod.help.mixins");
  88 + }
  89 + }
  90 + });
  91 + }
  92 +
77 if (mod.usesAPI()) 93 if (mod.usesAPI())
78 { 94 {
79 icons.add(new IconAbsolute(LiteLoaderBrandingProvider.ABOUT_TEXTURE, 95 icons.add(new IconAbsolute(LiteLoaderBrandingProvider.ABOUT_TEXTURE,
src/main/java/com/mumfrey/liteloader/core/LiteLoader.java
@@ -626,7 +626,6 @@ public final class LiteLoader @@ -626,7 +626,6 @@ public final class LiteLoader
626 * @param modNameOrId 626 * @param modNameOrId
627 * @param metaDataKey 627 * @param metaDataKey
628 * @param defaultValue 628 * @param defaultValue
629 - * @throws InvalidActivityException Thrown by getMod if init is not complete  
630 * @throws IllegalArgumentException Thrown by getMod if argument is null 629 * @throws IllegalArgumentException Thrown by getMod if argument is null
631 */ 630 */
632 public String getModMetaData(String modNameOrId, String metaDataKey, String defaultValue) throws IllegalArgumentException 631 public String getModMetaData(String modNameOrId, String metaDataKey, String defaultValue) throws IllegalArgumentException
src/main/java/com/mumfrey/liteloader/core/LiteLoaderEnumerator.java
@@ -15,8 +15,8 @@ import java.util.List; @@ -15,8 +15,8 @@ import java.util.List;
15 import java.util.Map; 15 import java.util.Map;
16 import java.util.Set; 16 import java.util.Set;
17 17
18 -import net.minecraft.launchwrapper.Launch;  
19 -import net.minecraft.launchwrapper.LaunchClassLoader; 18 +import org.spongepowered.asm.mixin.MixinEnvironment;
  19 +import org.spongepowered.asm.mixin.MixinEnvironment.Phase;
20 20
21 import com.google.common.base.Throwables; 21 import com.google.common.base.Throwables;
22 import com.mumfrey.liteloader.LiteMod; 22 import com.mumfrey.liteloader.LiteMod;
@@ -35,6 +35,7 @@ import com.mumfrey.liteloader.interfaces.Injectable; @@ -35,6 +35,7 @@ import com.mumfrey.liteloader.interfaces.Injectable;
35 import com.mumfrey.liteloader.interfaces.Loadable; 35 import com.mumfrey.liteloader.interfaces.Loadable;
36 import com.mumfrey.liteloader.interfaces.LoadableMod; 36 import com.mumfrey.liteloader.interfaces.LoadableMod;
37 import com.mumfrey.liteloader.interfaces.LoaderEnumerator; 37 import com.mumfrey.liteloader.interfaces.LoaderEnumerator;
  38 +import com.mumfrey.liteloader.interfaces.MixinContainer;
38 import com.mumfrey.liteloader.interfaces.TweakContainer; 39 import com.mumfrey.liteloader.interfaces.TweakContainer;
39 import com.mumfrey.liteloader.launch.ClassTransformerManager; 40 import com.mumfrey.liteloader.launch.ClassTransformerManager;
40 import com.mumfrey.liteloader.launch.LiteLoaderTweaker; 41 import com.mumfrey.liteloader.launch.LiteLoaderTweaker;
@@ -43,6 +44,9 @@ import com.mumfrey.liteloader.launch.LoaderProperties; @@ -43,6 +44,9 @@ import com.mumfrey.liteloader.launch.LoaderProperties;
43 import com.mumfrey.liteloader.util.log.LiteLoaderLogger; 44 import com.mumfrey.liteloader.util.log.LiteLoaderLogger;
44 import com.mumfrey.liteloader.util.log.LiteLoaderLogger.Verbosity; 45 import com.mumfrey.liteloader.util.log.LiteLoaderLogger.Verbosity;
45 46
  47 +import net.minecraft.launchwrapper.Launch;
  48 +import net.minecraft.launchwrapper.LaunchClassLoader;
  49 +
46 /** 50 /**
47 * The enumerator performs all mod discovery functions for LiteLoader, this 51 * The enumerator performs all mod discovery functions for LiteLoader, this
48 * includes locating mod files to load as well as searching for mod classes 52 * includes locating mod files to load as well as searching for mod classes
@@ -571,7 +575,12 @@ public class LiteLoaderEnumerator implements LoaderEnumerator @@ -571,7 +575,12 @@ public class LiteLoaderEnumerator implements LoaderEnumerator
571 575
572 if (tweakContainer.hasClassTransformers()) 576 if (tweakContainer.hasClassTransformers())
573 { 577 {
574 - this.addClassTransformersFrom(tweakContainer, tweakContainer.getClassTransformerClassNames()); 578 + this.addClassTransformersFrom(tweakContainer);
  579 + }
  580 +
  581 + if (tweakContainer.hasMixins())
  582 + {
  583 + this.addMixinsFrom(tweakContainer);
575 } 584 }
576 } 585 }
577 } 586 }
@@ -618,11 +627,11 @@ public class LiteLoaderEnumerator implements LoaderEnumerator @@ -618,11 +627,11 @@ public class LiteLoaderEnumerator implements LoaderEnumerator
618 } 627 }
619 } 628 }
620 629
621 - private void addClassTransformersFrom(TweakContainer<File> container, List<String> classTransformerClasses) 630 + private void addClassTransformersFrom(TweakContainer<File> container)
622 { 631 {
623 try 632 try
624 { 633 {
625 - for (String classTransformerClass : classTransformerClasses) 634 + for (String classTransformerClass : container.getClassTransformerClassNames())
626 { 635 {
627 LiteLoaderLogger.info(Verbosity.REDUCED, "Mod file '%s' provides classTransformer '%s', adding to class loader", 636 LiteLoaderLogger.info(Verbosity.REDUCED, "Mod file '%s' provides classTransformer '%s', adding to class loader",
628 container.getName(), classTransformerClass); 637 container.getName(), classTransformerClass);
@@ -639,6 +648,30 @@ public class LiteLoaderEnumerator implements LoaderEnumerator @@ -639,6 +648,30 @@ public class LiteLoaderEnumerator implements LoaderEnumerator
639 } 648 }
640 } 649 }
641 650
  651 + private void addMixinsFrom(MixinContainer<File> container)
  652 + {
  653 + for (String config : container.getMixinConfigs())
  654 + {
  655 + if (config.endsWith(".json"))
  656 + {
  657 + LiteLoaderLogger.info(Verbosity.REDUCED, "Registering mixin config %s for %s", config, container.getName());
  658 + MixinEnvironment.getDefaultEnvironment().addConfiguration(config);
  659 + }
  660 + else if (config.contains(".json@"))
  661 + {
  662 + int pos = config.indexOf(".json@");
  663 + String phaseName = config.substring(pos + 6);
  664 + config = config.substring(0, pos + 5);
  665 + Phase phase = Phase.forName(phaseName);
  666 + if (phase != null)
  667 + {
  668 + LiteLoaderLogger.info(Verbosity.REDUCED, "Registering mixin config %s for %s", config, container.getName());
  669 + MixinEnvironment.getEnvironment(phase).addConfiguration(config);
  670 + }
  671 + }
  672 + }
  673 + }
  674 +
642 /** 675 /**
643 * @param container 676 * @param container
644 */ 677 */
src/main/java/com/mumfrey/liteloader/core/ModInfo.java
@@ -9,6 +9,7 @@ import com.google.common.collect.ImmutableSet; @@ -9,6 +9,7 @@ import com.google.common.collect.ImmutableSet;
9 import com.mumfrey.liteloader.LiteMod; 9 import com.mumfrey.liteloader.LiteMod;
10 import com.mumfrey.liteloader.interfaces.Loadable; 10 import com.mumfrey.liteloader.interfaces.Loadable;
11 import com.mumfrey.liteloader.interfaces.LoadableMod; 11 import com.mumfrey.liteloader.interfaces.LoadableMod;
  12 +import com.mumfrey.liteloader.interfaces.MixinContainer;
12 import com.mumfrey.liteloader.interfaces.TweakContainer; 13 import com.mumfrey.liteloader.interfaces.TweakContainer;
13 14
14 /** 15 /**
@@ -179,6 +180,14 @@ public abstract class ModInfo&lt;TContainer extends Loadable&lt;?&gt;&gt; @@ -179,6 +180,14 @@ public abstract class ModInfo&lt;TContainer extends Loadable&lt;?&gt;&gt;
179 { 180 {
180 return (this.container instanceof TweakContainer && ((TweakContainer<?>)this.container).hasEventTransformers()); 181 return (this.container instanceof TweakContainer && ((TweakContainer<?>)this.container).hasEventTransformers());
181 } 182 }
  183 +
  184 + /**
  185 + * If this has mixins
  186 + */
  187 + public boolean hasMixins()
  188 + {
  189 + return (this.container instanceof MixinContainer && ((MixinContainer<?>)this.container).hasMixins());
  190 + }
182 191
183 /** 192 /**
184 * Get whether this mod uses external (3rd-party) API 193 * Get whether this mod uses external (3rd-party) API
src/main/java/com/mumfrey/liteloader/core/api/EnumeratorModuleClassPath.java
@@ -92,7 +92,7 @@ public class EnumeratorModuleClassPath implements EnumeratorModule @@ -92,7 +92,7 @@ public class EnumeratorModuleClassPath implements EnumeratorModule
92 if (enumerator.registerModContainer(classPathMod)) 92 if (enumerator.registerModContainer(classPathMod))
93 { 93 {
94 this.loadableMods.add(classPathMod); 94 this.loadableMods.add(classPathMod);
95 - if (classPathMod.hasTweakClass() || classPathMod.hasClassTransformers()) 95 + if (classPathMod.requiresPreInitInjection())
96 { 96 {
97 enumerator.registerTweakContainer(classPathMod); 97 enumerator.registerTweakContainer(classPathMod);
98 } 98 }
src/main/java/com/mumfrey/liteloader/core/api/LoadableModFile.java
@@ -187,6 +187,7 @@ public class LoadableModFile extends LoadableFile implements LoadableMod&lt;File&gt; @@ -187,6 +187,7 @@ public class LoadableModFile extends LoadableFile implements LoadableMod&lt;File&gt;
187 this.getMetaValuesInto(this.classTransformerClassNames, "classTransformerClasses", ","); 187 this.getMetaValuesInto(this.classTransformerClassNames, "classTransformerClasses", ",");
188 this.getMetaValuesInto(this.dependencies, "dependsOn", ","); 188 this.getMetaValuesInto(this.dependencies, "dependsOn", ",");
189 this.getMetaValuesInto(this.requiredAPIs, "requiredAPIs", ","); 189 this.getMetaValuesInto(this.requiredAPIs, "requiredAPIs", ",");
  190 + this.getMetaValuesInto(this.mixinConfigs, "mixinConfigs", ",");
190 } 191 }
191 catch (ClassCastException ex) 192 catch (ClassCastException ex)
192 { 193 {
src/main/java/com/mumfrey/liteloader/interfaces/Loadable.java
@@ -91,4 +91,10 @@ public interface Loadable&lt;L&gt; extends Comparable&lt;L&gt; @@ -91,4 +91,10 @@ public interface Loadable&lt;L&gt; extends Comparable&lt;L&gt;
91 * File instance, otherwise returns null. 91 * File instance, otherwise returns null.
92 */ 92 */
93 public abstract File toFile(); 93 public abstract File toFile();
  94 +
  95 + /**
  96 + * Get whether this container requires early injection, eg. it contains a
  97 + * tweaker, transformer or mixins
  98 + */
  99 + public abstract boolean requiresPreInitInjection();
94 } 100 }
src/main/java/com/mumfrey/liteloader/interfaces/LoadableFile.java
@@ -5,7 +5,6 @@ import java.io.IOException; @@ -5,7 +5,6 @@ import java.io.IOException;
5 import java.net.MalformedURLException; 5 import java.net.MalformedURLException;
6 import java.net.URL; 6 import java.net.URL;
7 import java.nio.charset.Charset; 7 import java.nio.charset.Charset;
8 -import java.util.ArrayList;  
9 import java.util.Collections; 8 import java.util.Collections;
10 import java.util.HashSet; 9 import java.util.HashSet;
11 import java.util.List; 10 import java.util.List;
@@ -30,6 +29,19 @@ import net.minecraft.launchwrapper.LaunchClassLoader; @@ -30,6 +29,19 @@ import net.minecraft.launchwrapper.LaunchClassLoader;
30 29
31 public class LoadableFile extends File implements TweakContainer<File> 30 public class LoadableFile extends File implements TweakContainer<File>
32 { 31 {
  32 + public static final String MFATT_MODTYPE = "ModType";
  33 + public static final String MFATT_TWEAK_CLASS = "TweakClass";
  34 + public static final String MFATT_CLASS_PATH = "Class-Path";
  35 + public static final String MFATT_TWEAK_ORDER = "TweakOrder";
  36 + public static final String MFATT_IMPLEMENTATION_TITLE = "Implementation-Title";
  37 + public static final String MFATT_TWEAK_NAME = "TweakName";
  38 + public static final String MFATT_IMPLEMENTATION_VERSION = "Implementation-Version";
  39 + public static final String MFATT_TWEAK_VERSION = "TweakVersion";
  40 + public static final String MFATT_IMPLEMENTATION_VENDOR = "Implementation-Vendor";
  41 + public static final String MFATT_TWEAK_AUTHOR = "TweakAuthor";
  42 + public static final String MFATT_MIXIN_CONFIGS = "MixinConfigs";
  43 + public static final String MFATT_INJECTION_STRATEGY = "TweakInjectionStrategy";
  44 +
33 private static final Pattern versionPattern = Pattern.compile("([0-9]+\\.)+[0-9]+([_A-Z0-9]+)?"); 45 private static final Pattern versionPattern = Pattern.compile("([0-9]+\\.)+[0-9]+([_A-Z0-9]+)?");
34 46
35 private static final long serialVersionUID = 1L; 47 private static final long serialVersionUID = 1L;
@@ -75,6 +87,11 @@ public class LoadableFile extends File implements TweakContainer&lt;File&gt; @@ -75,6 +87,11 @@ public class LoadableFile extends File implements TweakContainer&lt;File&gt;
75 protected boolean hasEventTransformers; 87 protected boolean hasEventTransformers;
76 88
77 /** 89 /**
  90 + * Mixin config resource names
  91 + */
  92 + protected Set<String> mixinConfigs = new HashSet<String>();
  93 +
  94 + /**
78 * Create a new tweak container wrapping the specified file 95 * Create a new tweak container wrapping the specified file
79 */ 96 */
80 public LoadableFile(File parent) 97 public LoadableFile(File parent)
@@ -145,12 +162,24 @@ public class LoadableFile extends File implements TweakContainer&lt;File&gt; @@ -145,12 +162,24 @@ public class LoadableFile extends File implements TweakContainer&lt;File&gt;
145 if (jar.getManifest() != null) 162 if (jar.getManifest() != null)
146 { 163 {
147 LiteLoaderLogger.info("Inspecting jar metadata in '%s'", this.getName()); 164 LiteLoaderLogger.info("Inspecting jar metadata in '%s'", this.getName());
148 - Attributes manifestAttributes = jar.getManifest().getMainAttributes();  
149 -  
150 - String modSystemList = manifestAttributes.getValue("ModType");  
151 - if (modSystemList != null) 165 + Attributes mfAttributes = jar.getManifest().getMainAttributes();
  166 +
  167 + String mfAttmodSystemList = mfAttributes.getValue(LoadableFile.MFATT_MODTYPE);
  168 + String mfAttTweakClass = mfAttributes.getValue(LoadableFile.MFATT_TWEAK_CLASS);
  169 + String mfAttClassPath = mfAttributes.getValue(LoadableFile.MFATT_CLASS_PATH);
  170 + String mfAttTweakOrder = mfAttributes.getValue(LoadableFile.MFATT_TWEAK_ORDER);
  171 + String mfAttDisplayName = mfAttributes.getValue(LoadableFile.MFATT_IMPLEMENTATION_TITLE);
  172 + String mfAttTweakName = mfAttributes.getValue(LoadableFile.MFATT_TWEAK_NAME);
  173 + String mfAttVersion = mfAttributes.getValue(LoadableFile.MFATT_IMPLEMENTATION_VERSION);
  174 + String mfAttTweakVersion = mfAttributes.getValue(LoadableFile.MFATT_TWEAK_VERSION);
  175 + String mfAttAuthor = mfAttributes.getValue(LoadableFile.MFATT_IMPLEMENTATION_VENDOR);
  176 + String mfAttTweakAuthor = mfAttributes.getValue(LoadableFile.MFATT_TWEAK_AUTHOR);
  177 + String mfAttMixinConfigs = mfAttributes.getValue(LoadableFile.MFATT_MIXIN_CONFIGS);
  178 + String mfAttInjectionStrategy = mfAttributes.getValue(LoadableFile.MFATT_INJECTION_STRATEGY);
  179 +
  180 + if (mfAttmodSystemList != null)
152 { 181 {
153 - for (String modSystem : modSystemList.split(",")) 182 + for (String modSystem : mfAttmodSystemList.split(","))
154 { 183 {
155 modSystem = modSystem.trim(); 184 modSystem = modSystem.trim();
156 if (modSystem.length() > 0) 185 if (modSystem.length() > 0)
@@ -160,57 +189,37 @@ public class LoadableFile extends File implements TweakContainer&lt;File&gt; @@ -160,57 +189,37 @@ public class LoadableFile extends File implements TweakContainer&lt;File&gt;
160 } 189 }
161 } 190 }
162 191
163 - this.tweakClassName = manifestAttributes.getValue("TweakClass");  
164 - if (this.tweakClassName != null) 192 + this.tweakClassName = mfAttTweakClass;
  193 + if (this.tweakClassName != null && mfAttClassPath != null)
165 { 194 {
166 - String classPath = manifestAttributes.getValue("Class-Path");  
167 - if (classPath != null)  
168 - {  
169 - this.classPathEntries = classPath.split(" ");  
170 - } 195 + this.classPathEntries = mfAttClassPath.split(" ");
171 } 196 }
172 197
173 - if (manifestAttributes.getValue("TweakOrder") != null) 198 + if (mfAttTweakOrder != null)
174 { 199 {
175 - Integer tweakOrder = Ints.tryParse(manifestAttributes.getValue("TweakOrder")); 200 + Integer tweakOrder = Ints.tryParse(mfAttTweakOrder);
176 if (tweakOrder != null) 201 if (tweakOrder != null)
177 { 202 {
178 this.tweakPriority = tweakOrder.intValue(); 203 this.tweakPriority = tweakOrder.intValue();
179 } 204 }
180 } 205 }
181 206
182 - if (manifestAttributes.getValue("Implementation-Title") != null) 207 + if (mfAttDisplayName != null) this.displayName = mfAttDisplayName;
  208 + if (mfAttTweakName != null) this.displayName = mfAttTweakName;
  209 + if (mfAttVersion != null) this.version = mfAttVersion;
  210 + if (mfAttTweakVersion != null) this.version = mfAttTweakVersion;
  211 + if (mfAttAuthor != null) this.author = mfAttAuthor;
  212 + if (mfAttTweakAuthor != null) this.author = mfAttTweakAuthor;
  213 +
  214 + if (mfAttMixinConfigs != null)
183 { 215 {
184 - this.displayName = manifestAttributes.getValue("Implementation-Title");  
185 - }  
186 -  
187 - if (manifestAttributes.getValue("TweakName") != null)  
188 - {  
189 - this.displayName = manifestAttributes.getValue("TweakName");  
190 - }  
191 -  
192 - if (manifestAttributes.getValue("Implementation-Version") != null)  
193 - {  
194 - this.version = manifestAttributes.getValue("Implementation-Version");  
195 - }  
196 -  
197 - if (manifestAttributes.getValue("TweakVersion") != null)  
198 - {  
199 - this.version = manifestAttributes.getValue("TweakVersion");  
200 - }  
201 -  
202 - if (manifestAttributes.getValue("Implementation-Vendor") != null)  
203 - {  
204 - this.author = manifestAttributes.getValue("Implementation-Vendor");  
205 - }  
206 -  
207 - if (manifestAttributes.getValue("TweakAuthor") != null)  
208 - {  
209 - this.author = manifestAttributes.getValue("TweakAuthor"); 216 + for (String config : mfAttMixinConfigs.split(","))
  217 + {
  218 + this.mixinConfigs.add(config);
  219 + }
210 } 220 }
211 221
212 - String tweakInjectionStrategy = manifestAttributes.getValue("TweakInjectionStrategy");  
213 - this.injectionStrategy = InjectionStrategy.parseStrategy(tweakInjectionStrategy, InjectionStrategy.TOP); 222 + this.injectionStrategy = InjectionStrategy.parseStrategy(mfAttInjectionStrategy, InjectionStrategy.TOP);
214 } 223 }
215 } 224 }
216 catch (Exception ex) 225 catch (Exception ex)
@@ -314,7 +323,19 @@ public class LoadableFile extends File implements TweakContainer&lt;File&gt; @@ -314,7 +323,19 @@ public class LoadableFile extends File implements TweakContainer&lt;File&gt;
314 @Override 323 @Override
315 public List<String> getClassTransformerClassNames() 324 public List<String> getClassTransformerClassNames()
316 { 325 {
317 - return new ArrayList<String>(); 326 + return Collections.<String>emptyList();
  327 + }
  328 +
  329 + @Override
  330 + public boolean hasMixins()
  331 + {
  332 + return this.mixinConfigs.size() > 0;
  333 + }
  334 +
  335 + @Override
  336 + public Set<String> getMixinConfigs()
  337 + {
  338 + return this.mixinConfigs;
318 } 339 }
319 340
320 @Override 341 @Override
@@ -337,6 +358,12 @@ public class LoadableFile extends File implements TweakContainer&lt;File&gt; @@ -337,6 +358,12 @@ public class LoadableFile extends File implements TweakContainer&lt;File&gt;
337 { 358 {
338 this.forceInjection = forceInjection; 359 this.forceInjection = forceInjection;
339 } 360 }
  361 +
  362 + @Override
  363 + public boolean requiresPreInitInjection()
  364 + {
  365 + return this.hasTweakClass() || this.hasClassTransformers() || this.hasMixins();
  366 + }
340 367
341 @Override 368 @Override
342 public boolean isInjected() 369 public boolean isInjected()
src/main/java/com/mumfrey/liteloader/interfaces/LoadableMod.java
@@ -3,8 +3,7 @@ package com.mumfrey.liteloader.interfaces; @@ -3,8 +3,7 @@ package com.mumfrey.liteloader.interfaces;
3 import java.io.File; 3 import java.io.File;
4 import java.net.MalformedURLException; 4 import java.net.MalformedURLException;
5 import java.net.URL; 5 import java.net.URL;
6 -import java.util.ArrayList;  
7 -import java.util.HashSet; 6 +import java.util.Collections;
8 import java.util.List; 7 import java.util.List;
9 import java.util.Set; 8 import java.util.Set;
10 9
@@ -287,7 +286,7 @@ public interface LoadableMod&lt;L&gt; extends Loadable&lt;L&gt;, Injectable @@ -287,7 +286,7 @@ public interface LoadableMod&lt;L&gt; extends Loadable&lt;L&gt;, Injectable
287 @Override 286 @Override
288 public Set<String> getMetaDataKeys() 287 public Set<String> getMetaDataKeys()
289 { 288 {
290 - return new HashSet<String>(); 289 + return Collections.<String>emptySet();
291 } 290 }
292 291
293 @Override 292 @Override
@@ -305,7 +304,7 @@ public interface LoadableMod&lt;L&gt; extends Loadable&lt;L&gt;, Injectable @@ -305,7 +304,7 @@ public interface LoadableMod&lt;L&gt; extends Loadable&lt;L&gt;, Injectable
305 @Override 304 @Override
306 public Set<String> getDependencies() 305 public Set<String> getDependencies()
307 { 306 {
308 - return new HashSet<String>(); 307 + return Collections.<String>emptySet();
309 } 308 }
310 309
311 @Override 310 @Override
@@ -316,13 +315,13 @@ public interface LoadableMod&lt;L&gt; extends Loadable&lt;L&gt;, Injectable @@ -316,13 +315,13 @@ public interface LoadableMod&lt;L&gt; extends Loadable&lt;L&gt;, Injectable
316 @Override 315 @Override
317 public Set<String> getMissingDependencies() 316 public Set<String> getMissingDependencies()
318 { 317 {
319 - return new HashSet<String>(); 318 + return Collections.<String>emptySet();
320 } 319 }
321 320
322 @Override 321 @Override
323 public Set<String> getRequiredAPIs() 322 public Set<String> getRequiredAPIs()
324 { 323 {
325 - return new HashSet<String>(); 324 + return Collections.<String>emptySet();
326 } 325 }
327 326
328 @Override 327 @Override
@@ -333,18 +332,24 @@ public interface LoadableMod&lt;L&gt; extends Loadable&lt;L&gt;, Injectable @@ -333,18 +332,24 @@ public interface LoadableMod&lt;L&gt; extends Loadable&lt;L&gt;, Injectable
333 @Override 332 @Override
334 public Set<String> getMissingAPIs() 333 public Set<String> getMissingAPIs()
335 { 334 {
336 - return new HashSet<String>(); 335 + return Collections.<String>emptySet();
337 } 336 }
338 337
339 @Override 338 @Override
340 public List<String> getContainedClassNames() 339 public List<String> getContainedClassNames()
341 { 340 {
342 - return new ArrayList<String>(); 341 + return Collections.<String>emptyList();
343 } 342 }
344 343
345 @Override 344 @Override
346 public void addContainedMod(String modName) 345 public void addContainedMod(String modName)
347 { 346 {
348 } 347 }
  348 +
  349 + @Override
  350 + public boolean requiresPreInitInjection()
  351 + {
  352 + return false;
  353 + }
349 } 354 }
350 } 355 }
src/main/java/com/mumfrey/liteloader/interfaces/MixinContainer.java 0 โ†’ 100644
  1 +/*
  2 + * This file is part of Sponge, licensed under the MIT License (MIT).
  3 + *
  4 + * Copyright (c) SpongePowered <https://www.spongepowered.org>
  5 + * Copyright (c) contributors
  6 + *
  7 + * Permission is hereby granted, free of charge, to any person obtaining a copy
  8 + * of this software and associated documentation files (the "Software"), to deal
  9 + * in the Software without restriction, including without limitation the rights
  10 + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11 + * copies of the Software, and to permit persons to whom the Software is
  12 + * furnished to do so, subject to the following conditions:
  13 + *
  14 + * The above copyright notice and this permission notice shall be included in
  15 + * all copies or substantial portions of the Software.
  16 + *
  17 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  20 + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22 + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  23 + * THE SOFTWARE.
  24 + */
  25 +package com.mumfrey.liteloader.interfaces;
  26 +
  27 +import java.util.Set;
  28 +
  29 +public interface MixinContainer<L> extends Loadable<L>, Injectable
  30 +{
  31 +
  32 + /**
  33 + * Get whether this container has any mixins
  34 + */
  35 + public abstract boolean hasMixins();
  36 +
  37 + /**
  38 + * Get this mod's list of mixin configs
  39 + */
  40 + public abstract Set<String> getMixinConfigs();
  41 +
  42 +}
src/main/java/com/mumfrey/liteloader/interfaces/TweakContainer.java
@@ -7,7 +7,7 @@ import java.util.List; @@ -7,7 +7,7 @@ import java.util.List;
7 * 7 *
8 * @author Adam Mummery-Smith 8 * @author Adam Mummery-Smith
9 */ 9 */
10 -public interface TweakContainer<L> extends Loadable<L>, Injectable 10 +public interface TweakContainer<L> extends MixinContainer<L>
11 { 11 {
12 /** 12 /**
13 * Get whether this tweak container has a defined tweak class in its 13 * Get whether this tweak container has a defined tweak class in its
src/main/resources/assets/liteloader/lang/en_US.lang
@@ -41,12 +41,14 @@ gui.description.missingapis=Missing APIs: %s @@ -41,12 +41,14 @@ gui.description.missingapis=Missing APIs: %s
41 gui.mod.providestweak=Tweak 41 gui.mod.providestweak=Tweak
42 gui.mod.providestransformer=Transformer 42 gui.mod.providestransformer=Transformer
43 gui.mod.providesevents=Injector 43 gui.mod.providesevents=Injector
  44 +gui.mod.providesmixins=Mixins
44 gui.mod.usingapi=Uses additional API 45 gui.mod.usingapi=Uses additional API
45 gui.mod.startuperror=%d startup error(s) 46 gui.mod.startuperror=%d startup error(s)
46 47
47 gui.mod.help.tweak=A tweaker is a special type of mod. Tweakers have almost unlimited control of the game and are usually mods which alter the game engine fundamentally, for example APIs or performance-enhancement mods like Optifine. Because they have the greatest amount of control, they are also the most likely to cause instability when not compatible with each other, if you are experiencing crashes or serious problems, you should always try disabling tweak mods first. 48 gui.mod.help.tweak=A tweaker is a special type of mod. Tweakers have almost unlimited control of the game and are usually mods which alter the game engine fundamentally, for example APIs or performance-enhancement mods like Optifine. Because they have the greatest amount of control, they are also the most likely to cause instability when not compatible with each other, if you are experiencing crashes or serious problems, you should always try disabling tweak mods first.
48 gui.mod.help.transformer=A transformer mod uses bytecode injection to hook extra functionality within the game which LiteLoader does not normally provide. Because transformers access functionality outside of LiteLoader's core, it is possible for them to have unforseen side-effects when combined with other mods. If you are experiencing crashes or other unexpected behaviour, you should disable transformer mods before regular mods to determine whether they are the source of the issue. Forge refers to this type of mod as a ยงlCoreMod 49 gui.mod.help.transformer=A transformer mod uses bytecode injection to hook extra functionality within the game which LiteLoader does not normally provide. Because transformers access functionality outside of LiteLoader's core, it is possible for them to have unforseen side-effects when combined with other mods. If you are experiencing crashes or other unexpected behaviour, you should disable transformer mods before regular mods to determine whether they are the source of the issue. Forge refers to this type of mod as a ยงlCoreMod
49 gui.mod.help.events=An injector mod uses a restricted form of bytecode injection which makes it somewhat safer than a full transformer mod, but can still cause instability under some circumstances. If you are experiencing crashes or other issues, then you should disable injector mods before regular mods to determine whether they are the source of the issue. 50 gui.mod.help.events=An injector mod uses a restricted form of bytecode injection which makes it somewhat safer than a full transformer mod, but can still cause instability under some circumstances. If you are experiencing crashes or other issues, then you should disable injector mods before regular mods to determine whether they are the source of the issue.
  51 +gui.mod.help.mixins=A mod with mixins uses a safe form of bytecode injection to hook into Minecraft
50 52
51 gui.settings.title=%s Settings 53 gui.settings.title=%s Settings
52 gui.saveandclose=Save & Close 54 gui.saveandclose=Save & Close
src/main/resources/assets/liteloader/textures/gui/about.png

42.5 KB | W: | H:

42.5 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin