void Start() { ModLoaderStats stats = ModLoaderStats.Instance; if (stats.WasLoaded) { return; } AddPiece = null; var console = gameObject.AddComponent <Console>(); // Attach the console before loading the config so it can display possible errors Configuration = Configuration.LoadOrCreateDefault(Configuration.CONFIG_FILE_NAME); Keys.LoadKeys(); gameObject.AddComponent <KeySettings>(); observer = gameObject.AddComponent <GameObserver>(); #if DEV_BUILD gameObject.AddComponent <ObjectExplorer>(); #endif console.EnableInterface(); // Enable the console interface since it can now ask the configuration for the correct keys to use stats.WasLoaded = true; FileInfo[] files = (new DirectoryInfo(Application.dataPath + "/Mods")).GetFiles("*.dll"); foreach (FileInfo fileInfo in files) { if (!fileInfo.Name.EndsWith(".no.dll") && fileInfo.Name != "SpaarModLoader.dll") { Debug.Log("Trying to load " + fileInfo.FullName); try { Assembly assembly = Assembly.LoadFrom(fileInfo.FullName); var types = assembly.GetExportedTypes(); bool foundAttrib = false; foreach (var type in types) { var attrib = Attribute.GetCustomAttribute(type, typeof(Mod)) as Mod; if (attrib != null) { gameObject.AddComponent(type); Debug.Log("Successfully loaded " + attrib.Name() + " (" + attrib.version + ") by " + attrib.author); foundAttrib = true; } } if (!foundAttrib) { // Continue to load a Mod class if not Mod attribute is found for now. // Otherwise all current mods would break and require an update. // TODO: Remove this fall-back after most mods have updated foreach (var type in types) { if (type.Name == "Mod") { gameObject.AddComponent(type); Debug.Log("Successfully loaded " + fileInfo.Name); break; } } } } catch (Exception exception) { Debug.Log("Could not load " + fileInfo.Name + ":"); Debug.LogException(exception); } } } }
/// <summary> /// Register an IGameStateObserver. Every registered observer is always /// notified of the supported status changes that occur in the game. /// </summary> /// <param name="observer">The observer to be registered.</param> public static void RegisterGameStateObserver(IGameStateObserver observer) { GameObserver.RegisterGameStateObserver(observer); }