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