    001package cpw.mods.fml.relauncher;
    002
    003import java.lang.annotation.ElementType;
    004import java.lang.annotation.Retention;
    005import java.lang.annotation.RetentionPolicy;
    006import java.lang.annotation.Target;
    007import java.util.Map;
    008
    009/**
    010 * The base plugin that provides class name meta information to FML to
    011 * enhance the classloading lifecycle for mods in FML
    012 *
    013 * @author cpw
    014 *
    015 */
    016public interface IFMLLoadingPlugin
    017{
    018    /**
    019     * Return a list of classes that implement the ILibrarySet interface
    020     *
    021     * @return a list of classes that implement the ILibrarySet interface
    022     */
    023    String[] getLibraryRequestClass();
    024    /**
    025     * Return a list of classes that implements the IClassTransformer interface
    026     * @return a list of classes that implements the IClassTransformer interface
    027     */
    028    String[] getASMTransformerClass();
    029
    030    /**
    031     * Return a class name that implements "ModContainer" for injection into the mod list
    032     * The "getName" function should return a name that other mods can, if need be,
    033     * depend on.
    034     * Trivially, this modcontainer will be loaded before all regular mod containers,
    035     * which means it will be forced to be "immutable" - not susceptible to normal
    036     * sorting behaviour.
    037     * All other mod behaviours are available however- this container can receive and handle
    038     * normal loading events
    039     */
    040    String getModContainerClass();
    041
    042    /**
    043     * Return the class name of an implementor of "IFMLCallHook", that will be run, in the
    044     * main thread, to perform any additional setup this coremod may require. It will be
    045     * run <strong>prior</strong> to Minecraft starting, so it CANNOT operate on minecraft
    046     * itself. The game will deliberately crash if this code is detected to trigger a
    047     * minecraft class loading (TODO: implement crash ;) )
    048     */
    049    String getSetupClass();
    050
    051    /**
    052     * Inject coremod data into this coremod
    053     * This data includes:
    054     * "mcLocation" : the location of the minecraft directory,
    055     * "coremodList" : the list of coremods
    056     * "coremodLocation" : the file this coremod loaded from,
    057     */
    058    void injectData(Map<String, Object> data);
    059
    060
    061    /**
    062     * Annotate your load plugin with a list of package prefixes that will *not* be
    063     * processed by the ASM transformation stack.
    064     *
    065     * Your plugin, and any transformers should *definitely* be in this list, because
    066     * otherwise you can face problems with the classloader trying to transform classes
    067     * with your transformer, whilst it is *loading* your transformer. Not pretty.
    068     *
    069     * @author cpw
    070     *
    071     */
    072    @Retention(RetentionPolicy.RUNTIME)
    073    @Target(ElementType.TYPE)
    074    public @interface TransformerExclusions
    075    {
    076        public String[] value() default "";
    077    }
    078}