001/* 002 * Forge Mod Loader 003 * Copyright (c) 2012-2013 cpw. 004 * All rights reserved. This program and the accompanying materials 005 * are made available under the terms of the GNU Lesser Public License v2.1 006 * which accompanies this distribution, and is available at 007 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html 008 * 009 * Contributors: 010 * cpw - implementation 011 */ 012 013package cpw.mods.fml.common; 014 015import com.google.common.base.Throwables; 016 017import cpw.mods.fml.common.event.FMLConstructionEvent; 018import cpw.mods.fml.common.event.FMLEvent; 019import cpw.mods.fml.common.event.FMLInitializationEvent; 020import cpw.mods.fml.common.event.FMLLoadCompleteEvent; 021import cpw.mods.fml.common.event.FMLPostInitializationEvent; 022import cpw.mods.fml.common.event.FMLPreInitializationEvent; 023import cpw.mods.fml.common.event.FMLServerAboutToStartEvent; 024import cpw.mods.fml.common.event.FMLServerStartedEvent; 025import cpw.mods.fml.common.event.FMLServerStartingEvent; 026import cpw.mods.fml.common.event.FMLServerStoppedEvent; 027import cpw.mods.fml.common.event.FMLServerStoppingEvent; 028import cpw.mods.fml.common.event.FMLStateEvent; 029 030/** 031 * The state enum used to help track state progression for the loader 032 * @author cpw 033 * 034 */ 035public enum LoaderState 036{ 037 NOINIT("Uninitialized",null), 038 LOADING("Loading",null), 039 CONSTRUCTING("Constructing mods",FMLConstructionEvent.class), 040 PREINITIALIZATION("Pre-initializing mods", FMLPreInitializationEvent.class), 041 INITIALIZATION("Initializing mods", FMLInitializationEvent.class), 042 POSTINITIALIZATION("Post-initializing mods", FMLPostInitializationEvent.class), 043 AVAILABLE("Mod loading complete", FMLLoadCompleteEvent.class), 044 SERVER_ABOUT_TO_START("Server about to start", FMLServerAboutToStartEvent.class), 045 SERVER_STARTING("Server starting", FMLServerStartingEvent.class), 046 SERVER_STARTED("Server started", FMLServerStartedEvent.class), 047 SERVER_STOPPING("Server stopping", FMLServerStoppingEvent.class), 048 SERVER_STOPPED("Server stopped", FMLServerStoppedEvent.class), 049 ERRORED("Mod Loading errored",null); 050 051 052 private Class<? extends FMLStateEvent> eventClass; 053 private String name; 054 055 private LoaderState(String name, Class<? extends FMLStateEvent> event) 056 { 057 this.name = name; 058 this.eventClass = event; 059 } 060 061 public LoaderState transition(boolean errored) 062 { 063 if (errored) 064 { 065 return ERRORED; 066 } 067 // stopping -> available 068 if (this == SERVER_STOPPED) 069 { 070 return AVAILABLE; 071 } 072 return values()[ordinal() < values().length ? ordinal()+1 : ordinal()]; 073 } 074 075 public boolean hasEvent() 076 { 077 return eventClass != null; 078 } 079 080 public FMLStateEvent getEvent(Object... eventData) 081 { 082 try 083 { 084 return eventClass.getConstructor(Object[].class).newInstance((Object)eventData); 085 } 086 catch (Exception e) 087 { 088 throw Throwables.propagate(e); 089 } 090 } 091 public LoaderState requiredState() 092 { 093 if (this == NOINIT) return NOINIT; 094 return LoaderState.values()[this.ordinal()-1]; 095 } 096 public enum ModState 097 { 098 UNLOADED("Unloaded"), 099 LOADED("Loaded"), 100 CONSTRUCTED("Constructed"), 101 PREINITIALIZED("Pre-initialized"), 102 INITIALIZED("Initialized"), 103 POSTINITIALIZED("Post-initialized"), 104 AVAILABLE("Available"), 105 DISABLED("Disabled"), 106 ERRORED("Errored"); 107 108 private String label; 109 110 private ModState(String label) 111 { 112 this.label = label; 113 } 114 115 public String toString() 116 { 117 return this.label; 118 } 119 } 120}