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 }