    001/*
    002 * Forge Mod Loader
    003 * Copyright (c) 2012-2013 cpw.
    004 * All rights reserved. This program and the accompanying materials
    005 * are made available under the terms of the GNU Lesser Public License v2.1
    006 * which accompanies this distribution, and is available at
    007 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
    008 *
    009 * Contributors:
    010 *     cpw - implementation
    011 */
    012
    013package cpw.mods.fml.relauncher;
    014
    015import java.lang.annotation.ElementType;
    016import java.lang.annotation.Retention;
    017import java.lang.annotation.RetentionPolicy;
    018import java.lang.annotation.Target;
    019import java.util.Map;
    020
    021/**
    022 * The base plugin that provides class name meta information to FML to
    023 * enhance the classloading lifecycle for mods in FML
    024 *
    025 * @author cpw
    026 *
    027 */
    028public interface IFMLLoadingPlugin
    029{
    030    /**
    031     * Return a list of classes that implement the ILibrarySet interface
    032     *
    033     * @return a list of classes that implement the ILibrarySet interface
    034     */
    035    String[] getLibraryRequestClass();
    036    /**
    037     * Return a list of classes that implements the IClassTransformer interface
    038     * @return a list of classes that implements the IClassTransformer interface
    039     */
    040    String[] getASMTransformerClass();
    041
    042    /**
    043     * Return a class name that implements "ModContainer" for injection into the mod list
    044     * The "getName" function should return a name that other mods can, if need be,
    045     * depend on.
    046     * Trivially, this modcontainer will be loaded before all regular mod containers,
    047     * which means it will be forced to be "immutable" - not susceptible to normal
    048     * sorting behaviour.
    049     * All other mod behaviours are available however- this container can receive and handle
    050     * normal loading events
    051     */
    052    String getModContainerClass();
    053
    054    /**
    055     * Return the class name of an implementor of "IFMLCallHook", that will be run, in the
    056     * main thread, to perform any additional setup this coremod may require. It will be
    057     * run <strong>prior</strong> to Minecraft starting, so it CANNOT operate on minecraft
    058     * itself. The game will deliberately crash if this code is detected to trigger a
    059     * minecraft class loading (TODO: implement crash ;) )
    060     */
    061    String getSetupClass();
    062
    063    /**
    064     * Inject coremod data into this coremod
    065     * This data includes:
    066     * "mcLocation" : the location of the minecraft directory,
    067     * "coremodList" : the list of coremods
    068     * "coremodLocation" : the file this coremod loaded from,
    069     */
    070    void injectData(Map<String, Object> data);
    071
    072
    073    /**
    074     * Annotate your load plugin with a list of package prefixes that will *not* be
    075     * processed by the ASM transformation stack.
    076     *
    077     * Your plugin, and any transformers should *definitely* be in this list, because
    078     * otherwise you can face problems with the classloader trying to transform classes
    079     * with your transformer, whilst it is *loading* your transformer. Not pretty.
    080     *
    081     * @author cpw
    082     *
    083     */
    084    @Retention(RetentionPolicy.RUNTIME)
    085    @Target(ElementType.TYPE)
    086    public @interface TransformerExclusions
    087    {
    088        public String[] value() default "";
    089    }
    090
    091    /**
    092     * Use this to target a specific minecraft version for your coremod. It will refuse to load with an error if
    093     * minecraft is not this exact version.
    094     *
    095     * @author cpw
    096     *
    097     */
    098    @Retention(RetentionPolicy.RUNTIME)
    099    @Target(ElementType.TYPE)
    100    public @interface MCVersion
    101    {
    102        public String value() default "";
    103    }
    104}