    001package cpw.mods.fml.common;
    002
    003import com.google.common.base.Throwables;
    004
    005import cpw.mods.fml.common.event.FMLConstructionEvent;
    006import cpw.mods.fml.common.event.FMLEvent;
    007import cpw.mods.fml.common.event.FMLInitializationEvent;
    008import cpw.mods.fml.common.event.FMLLoadCompleteEvent;
    009import cpw.mods.fml.common.event.FMLPostInitializationEvent;
    010import cpw.mods.fml.common.event.FMLPreInitializationEvent;
    011import cpw.mods.fml.common.event.FMLServerAboutToStartEvent;
    012import cpw.mods.fml.common.event.FMLServerStartedEvent;
    013import cpw.mods.fml.common.event.FMLServerStartingEvent;
    014import cpw.mods.fml.common.event.FMLServerStoppedEvent;
    015import cpw.mods.fml.common.event.FMLServerStoppingEvent;
    016import cpw.mods.fml.common.event.FMLStateEvent;
    017
    018/**
    019 * The state enum used to help track state progression for the loader
    020 * @author cpw
    021 *
    022 */
    023public enum LoaderState
    024{
    025    NOINIT("Uninitialized",null),
    026    LOADING("Loading",null),
    027    CONSTRUCTING("Constructing mods",FMLConstructionEvent.class),
    028    PREINITIALIZATION("Pre-initializing mods", FMLPreInitializationEvent.class),
    029    INITIALIZATION("Initializing mods", FMLInitializationEvent.class),
    030    POSTINITIALIZATION("Post-initializing mods", FMLPostInitializationEvent.class),
    031    AVAILABLE("Mod loading complete", FMLLoadCompleteEvent.class),
    032    SERVER_ABOUT_TO_START("Server about to start", FMLServerAboutToStartEvent.class),
    033    SERVER_STARTING("Server starting", FMLServerStartingEvent.class),
    034    SERVER_STARTED("Server started", FMLServerStartedEvent.class),
    035    SERVER_STOPPING("Server stopping", FMLServerStoppingEvent.class),
    036    SERVER_STOPPED("Server stopped", FMLServerStoppedEvent.class),
    037    ERRORED("Mod Loading errored",null);
    038
    039
    040    private Class<? extends FMLStateEvent> eventClass;
    041    private String name;
    042
    043    private LoaderState(String name, Class<? extends FMLStateEvent> event)
    044    {
    045        this.name = name;
    046        this.eventClass = event;
    047    }
    048
    049    public LoaderState transition(boolean errored)
    050    {
    051        if (errored)
    052        {
    053            return ERRORED;
    054        }
    055        // stopping -> available
    056        if (this == SERVER_STOPPED)
    057        {
    058            return AVAILABLE;
    059        }
    060        return values()[ordinal() < values().length ? ordinal()+1 : ordinal()];
    061    }
    062
    063    public boolean hasEvent()
    064    {
    065        return eventClass != null;
    066    }
    067
    068    public FMLStateEvent getEvent(Object... eventData)
    069    {
    070        try
    071        {
    072            return eventClass.getConstructor(Object[].class).newInstance((Object)eventData);
    073        }
    074        catch (Exception e)
    075        {
    076            throw Throwables.propagate(e);
    077        }
    078    }
    079    public LoaderState requiredState()
    080    {
    081        if (this == NOINIT) return NOINIT;
    082        return LoaderState.values()[this.ordinal()-1];
    083    }
    084    public enum ModState
    085    {
    086        UNLOADED("Unloaded"),
    087        LOADED("Loaded"),
    088        CONSTRUCTED("Constructed"),
    089        PREINITIALIZED("Pre-initialized"),
    090        INITIALIZED("Initialized"),
    091        POSTINITIALIZED("Post-initialized"),
    092        AVAILABLE("Available"),
    093        DISABLED("Disabled"),
    094        ERRORED("Errored");
    095
    096        private String label;
    097
    098        private ModState(String label)
    099        {
    100            this.label = label;
    101        }
    102
    103        public String toString()
    104        {
    105            return this.label;
    106        }
    107    }
    108}