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 }