示例#1
0
        /// <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);
                }
            }
        }
示例#2
0
        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);
                }
            }
        }
示例#3
0
        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();
        }
示例#4
0
    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();
    }
示例#5
0
        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();
        }