/// <summary> /// Initialize, or re-initialize the mod database. /// </summary> public static void Initialize() { Log.ModDatabase.Info("Initializing mod database"); sModById = new Dictionary <Guid, Mod>(); sModsByGame = new Dictionary <Game, List <Mod> >(); foreach (Game value in Enum.GetValues(typeof(Game))) { sModsByGame[value] = new List <Mod>(); } var config = ConfigStore.Get <ModDatabaseConfig>(); ModDirectory = config.ModsDirectoryPath; if (!Directory.Exists(ModDirectory)) { Log.ModDatabase.Error("Mods directory doesn't exist; creating new directory..."); Directory.CreateDirectory(ModDirectory); } else { // Todo: Different mod types? var modLoader = new XmlModLoader(); foreach (var directory in Directory.EnumerateDirectories(ModDirectory)) { TryLoadModDirectory(modLoader, directory); } } }
private static void TryLoadModDirectory(XmlModLoader modLoader, string directory) { var localDirectoryPath = directory.Remove(0, ModDirectory.Length); bool notAModDirectory = false; Mod mod = null; try { mod = modLoader.Load(directory); } catch (ModXmlFileMissingException) { notAModDirectory = true; } catch (ModXmlFileInvalidException e) { Log.ModDatabase.Error($"Mod directory '{localDirectoryPath}' contains an invalid Mod.xml file: {e.Message}."); } catch (ModDataDirectoryMissingException) { Log.ModDatabase.Error($"Mod directory '{localDirectoryPath}' doesn't have a Data directory."); } catch (Exception e) { Log.ModDatabase.Error( $"Unhandled exception thrown while loading mod directory '{localDirectoryPath}':\n{e.Message}\n{e.StackTrace}"); #if DEBUG throw; #endif } if (mod != null) { sModById[mod.Id] = mod; foreach (var game in mod.Game) { sModsByGame[game].Add(mod); } } if (notAModDirectory) { // Recurse foreach (var subDirectory in Directory.EnumerateDirectories(directory)) { TryLoadModDirectory(modLoader, subDirectory); } } }
private void NewButton_Click(object sender, RoutedEventArgs e) { var newMod = new NewModDialog() { Owner = this }; var result = newMod.ShowDialog(); if (!result.HasValue || !result.Value) { return; } // Get unique directory string modPath = Path.Combine(ModDatabase.ModDirectory, SelectedGame.ToString(), newMod.ModTitle); if (Directory.Exists(modPath)) { var newModPath = modPath; int i = 0; while (Directory.Exists(newModPath)) { newModPath = modPath + "_" + i++; } modPath = newModPath; } // Build mod var mod = new ModBuilder() .SetGame(SelectedGame) .SetTitle(newMod.ModTitle) .SetDescription(newMod.Description) .SetVersion(newMod.Version) .SetDate(DateTime.UtcNow.ToShortDateString()) .SetAuthor(newMod.Author) .SetUrl(newMod.Url) .SetUpdateUrl(newMod.UpdateUrl) .SetBaseDirectoryPath(modPath) .Build(); // Do actual saving var modLoader = new XmlModLoader(); modLoader.Save(mod); // Reload RefreshModDatabase(); }
protected void newmodclick(object sender, EventArgs e) { GTKFrontend.NewModDialog newMod = new GTKFrontend.NewModDialog(); if (newMod.Run() != (int)ResponseType.Ok) { newMod.Destroy(); return; } // Get unique directory string modPath = System.IO.Path.Combine(ModDatabase.ModDirectory, SelectedGame.ToString(), newMod.ModTitle); if (Directory.Exists(modPath)) { var newModPath = modPath; int i = 0; while (Directory.Exists(newModPath)) { newModPath = modPath + "_" + i++; } modPath = newModPath; } // Build mod var mod = new ModBuilder() .SetGame(SelectedGame) .SetTitle(newMod.ModTitle) .SetDescription(newMod.Description) .SetVersion(newMod.Version) .SetDate(DateTime.UtcNow.ToShortDateString()) .SetAuthor(newMod.Author) .SetUrl(newMod.Url) .SetUpdateUrl(newMod.UpdateUrl) .SetBaseDirectoryPath(modPath) .Build(); // Do actual saving var modLoader = new XmlModLoader(); modLoader.Save(mod); // Reload RefreshModDatabase(); }
private void NewButton_Click(object sender, RoutedEventArgs e) { var newMod = new NewModDialog() { Owner = this }; var result = newMod.ShowDialog(); if (!result.HasValue || !result.Value) { return; } // Get unique directory string folderPath = Path.Combine(ModDatabase.ModDirectory, SelectedGame.ToString()); string[] gamePath = Directory.GetDirectories(folderPath, "*", SearchOption.AllDirectories); if (FolderComboBox.SelectedItem.ToString() != "All Folders") { foreach (string folder in gamePath) { if (Path.GetFileName(folder) == FolderComboBox.SelectedItem.ToString()) { folderPath = folder; } } } string modPath = Path.Combine(folderPath, newMod.ModTitle); if (Directory.Exists(modPath)) { var newModPath = modPath; int i = 0; while (Directory.Exists(newModPath)) { newModPath = modPath + "_" + i++; } modPath = newModPath; } // Build mod var mod = new ModBuilder() .SetGame(SelectedGame) .SetTitle(newMod.ModTitle) .SetDescription(newMod.Description) .SetVersion(newMod.Version) .SetDate(DateTime.UtcNow.ToShortDateString()) .SetAuthor(newMod.Author) .SetUrl(newMod.Url) .SetUpdateUrl(newMod.UpdateUrl) .SetBaseDirectoryPath(modPath) .Build(); // Do actual saving var modLoader = new XmlModLoader(); modLoader.Save(mod); // Reload RefreshModDatabase(); RefreshMods(); }