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