コード例 #1
0
        // Refresh both PackageList and DisplayedPackages
        private void Refresh()
        {
            Metadata metadata;

            // First remove all deleted packages and update package id's to match metadata
            foreach (var package in PackageList.ToList())
            {
                if (!Directory.Exists($@"Packages\{package.path}"))
                {
                    PackageList.Remove(package);
                    List <DisplayedMetadata> temp = DisplayedPackages.ToList();
                    temp.RemoveAll(x => x.path == package.path);
                    DisplayedPackages = new ObservableCollection <DisplayedMetadata>(temp);
                }
                if (File.Exists($@"Packages\{package.path}\Package.xml"))
                {
                    try
                    {
                        using (FileStream streamWriter = File.Open($@"Packages\{package.path}\Package.xml", FileMode.Open))
                        {
                            metadata   = (Metadata)xsp.Deserialize(streamWriter);
                            package.id = metadata.id;
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine($"[ERROR] Invalid Package.xml for {package.path} ({ex.Message})");
                    }
                }
            }

            UpdateMetadata();

            // Get all packages from Packages folder (Adding packages)
            foreach (var package in Directory.EnumerateDirectories("Packages"))
            {
                if (File.Exists($@"{package}\Package.xml"))
                {
                    using (FileStream streamWriter = File.Open($@"{package}\Package.xml", FileMode.Open))
                    {
                        metadata = (Metadata)xsp.Deserialize(streamWriter);
                        // Add package to list if it doesn't exist
                        if (!PackageList.ToList().Any(x => x.path == Path.GetFileName(package)) &&
                            !DisplayedPackages.ToList().Any(x => x.path == Path.GetFileName(package)))
                        {
                            // Add new package to both collections
                            DisplayedMetadata dm = InitDisplayedMetadata(metadata);
                            Package           p  = new Package();
                            p.enabled = false;
                            p.id      = metadata.id;
                            p.path    = Path.GetFileName(package);
                            PackageList.Add(p);
                            dm.enabled = false;
                            dm.path    = Path.GetFileName(package);
                            DisplayedPackages.Add(dm);
                        }
                    }
                }
                // Create Package.xml
                else
                {
                    Console.WriteLine($"[WARNING] No Package.xml found for {Path.GetFileName(package)}, creating a simple one...");
                    // Create metadata
                    Metadata newMetadata = new Metadata();
                    newMetadata.name = Path.GetFileName(package);
                    newMetadata.id   = newMetadata.name.Replace(" ", "").ToLower();

                    List <string> dirFiles   = Directory.GetFiles(package).ToList();
                    List <string> dirFolders = Directory.GetDirectories(package, "*", SearchOption.TopDirectoryOnly).ToList();
                    dirFiles = dirFiles.Concat(dirFolders).ToList();
                    if (dirFiles.Any(x => Path.GetFileName(x).Equals("Mod.xml")) && dirFiles.Any(x => Path.GetFileName(x).Equals("Data")))
                    {
                        //If mod folder contains Data folder and mod.xml, import mod compendium mod.xml...
                        string modXml = dirFiles.First(x => Path.GetFileName(x).Equals("Mod.xml"));
                        using (FileStream streamWriter = File.Open(modXml, FileMode.Open))
                        {
                            //Deserialize Mod.xml & Use metadata
                            ModXmlMetadata m = (ModXmlMetadata)xsm.Deserialize(streamWriter);
                            newMetadata.id          = m.Author.ToLower().Replace(" ", "") + "." + m.Title.ToLower().Replace(" ", "");
                            newMetadata.author      = m.Author;
                            newMetadata.version     = m.Version;
                            newMetadata.link        = m.Url;
                            newMetadata.description = m.Description;
                        }
                        //Move files out of Data folder
                        string dataDir = dirFiles.First(x => Path.GetFileName(x).Equals("Data"));
                        if (Directory.Exists(dataDir))
                        {
                            MoveDir(dataDir, Path.GetDirectoryName(dataDir));
                        }
                        //Delete prebuild.bat if exists
                        if (dirFiles.Any(x => Path.GetFileName(x).Equals("prebuild.bat")))
                        {
                            File.Delete(dirFiles.First(x => Path.GetFileName(x).Equals("prebuild.bat")));
                        }
                        //Make sure Data folder is gone
                        if (Directory.Exists(dataDir))
                        {
                            Directory.Delete(dataDir, true);
                        }
                        //Goodbye old friend
                        File.Delete(modXml);
                    }
                    else
                    {
                        newMetadata.author      = "";
                        newMetadata.version     = "";
                        newMetadata.link        = "";
                        newMetadata.description = "";
                    }
                    using (FileStream streamWriter = File.Create($@"{package}\Package.xml"))
                    {
                        xsp.Serialize(streamWriter, newMetadata);
                    }
                    if (!PackageList.ToList().Any(x => x.path == Path.GetFileName(package)) &&
                        !DisplayedPackages.ToList().Any(x => x.path == Path.GetFileName(package)))
                    {
                        // Create package
                        Package newPackage = new Package();
                        newPackage.enabled = false;
                        newPackage.path    = Path.GetFileName(package);
                        newPackage.id      = newMetadata.id;
                        PackageList.Add(newPackage);
                        // Create displayedmetadata
                        DisplayedMetadata newDisplayedMetadata = InitDisplayedMetadata(newMetadata);
                        newDisplayedMetadata.enabled = false;
                        newDisplayedMetadata.path    = newPackage.path;
                        DisplayedPackages.Add(newDisplayedMetadata);
                    }
                    else
                    {
                        UpdateMetadata();
                    }
                }
            }

            // Update DisplayedPackages
            App.Current.Dispatcher.Invoke((Action) delegate
            {
                ModGrid.ItemsSource = DisplayedPackages;
                // Trigger select event to refresh description and Preview.png
                ModGrid.SetSelectedItem(ModGrid.GetSelectedItem());
            });
            Console.WriteLine($"[INFO] Refreshed!");
        }
コード例 #2
0
        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;

            outputter.WriteEvent     += consoleWriter_WriteEvent;
            outputter.WriteLineEvent += consoleWriter_WriteLineEvent;
            Console.SetOut(outputter);

            binMerger         = new binMerge();
            tblPatcher        = new tblPatch();
            pacUnpacker       = new PacUnpacker();
            DisplayedPackages = new ObservableCollection <DisplayedMetadata>();
            PackageList       = new ObservableCollection <Package>();

            // Retrieve initial thumbnail from embedded resource
            Assembly asm        = Assembly.GetExecutingAssembly();
            Stream   iconStream = asm.GetManifestResourceStream("AemulusModManager.Preview.png");

            bitmap = new BitmapImage();
            bitmap.BeginInit();
            bitmap.StreamSource = iconStream;
            bitmap.EndInit();
            Preview.Source = bitmap;

            // Initialize config
            config = new Config();

            // Initialize xml serializers
            xs  = new XmlSerializer(typeof(Config));
            xsp = new XmlSerializer(typeof(Metadata));
            xsm = new XmlSerializer(typeof(ModXmlMetadata));

            Console.WriteLine("[INFO] Initializing packages from Config.xml");
            // Load in Config if it exists
            if (File.Exists(@"Config.xml"))
            {
                try
                {
                    using (FileStream streamWriter = File.Open(@"Config.xml", FileMode.Open))
                    {
                        // Call the Deserialize method and cast to the object type.
                        config       = (Config)xs.Deserialize(streamWriter);
                        reloadedPath = config.reloadedPath;
                        p4gPath      = config.exePath;
                        modPath      = config.modDir;
                        emptySND     = config.emptySND;
                        // Compatibility with old Config.xml
                        List <Package> temp = config.package.ToList();
                        foreach (var p in temp)
                        {
                            if (p.name != null && p.path == null)
                            {
                                p.path = p.name;
                                p.name = null;
                            }
                        }
                        PackageList = new ObservableCollection <Package>(temp);
                        tbl         = config.tbl;
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"Invalid Config.xml ({ex.Message})");
                }

                // Create displayed metadata from packages in PackageList and their respective Package.xml's
                foreach (var package in PackageList)
                {
                    string            xml = $@"Packages\{package.path}\Package.xml";
                    Metadata          m;
                    DisplayedMetadata dm = new DisplayedMetadata();
                    try
                    {
                        if (File.Exists(xml))
                        {
                            m = new Metadata();
                            try
                            {
                                using (FileStream streamWriter = File.Open(xml, FileMode.Open))
                                {
                                    m              = (Metadata)xsp.Deserialize(streamWriter);
                                    dm.name        = m.name;
                                    dm.id          = m.id;
                                    dm.author      = m.author;
                                    dm.version     = m.version;
                                    dm.link        = m.link;
                                    dm.description = m.description;
                                }
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine($"[ERROR] Invalid Package.xml for {package.path} ({ex.Message})");
                            }
                        }

                        dm.path    = package.path;
                        dm.enabled = package.enabled;
                        DisplayedPackages.Add(dm);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine($"[ERROR] Invalid Package.xml for package {package.id} ({ex.Message})");
                        continue;
                    }
                }
                ModGrid.ItemsSource = DisplayedPackages;
            }

            if (modPath == null)
            {
                MergeButton.IsEnabled = false;
            }

            if (config.modDir != null)
            {
                modPath = config.modDir;
            }

            // Create Packages directory if it doesn't exist
            if (!Directory.Exists("Packages"))
            {
                Directory.CreateDirectory("Packages");
            }

            if (!Directory.Exists("Original"))
            {
                Directory.CreateDirectory("Original");
            }

            Refresh();
            updateConfig();

            // Check if Original Folder is unpacked
            if (!Directory.EnumerateFileSystemEntries("Original").Any())
            {
                Console.WriteLine("[WARNING] Aemulus can't find your Vanilla files in the Original folder.");
                Console.WriteLine("Please click the Config button and select \"Unpack data00004.pac\" before building.");
            }
        }