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 }