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