public void UpdateGameDirectory(RootDirectoryEntity updated, string outputDir, IProgress <int> progress)
        {
            ManagedGameVersion   oldMGV        = _mvs.GetManagedVersions().First(mvg => mvg.Version == updated.Version);
            RootDirectoryEntity  oldBuild      = new RootDirectoryEntityIO().Deserialize(oldMGV.GameXML);
            HashSet <FileEntity> oldFiles      = oldBuild.GetAllFileEntities(true).OfType <FileEntity>().ToHashSet();
            HashSet <FileEntity> newFiles      = updated.GetAllFileEntities(true).OfType <FileEntity>().ToHashSet();
            HashSet <FileEntity> changedFiles  = newFiles.Except(oldFiles).ToHashSet();
            HashSet <FileEntity> filesToRemove = oldFiles.Except(newFiles).ToHashSet();

            // Do not remove files that only changed location
            HashSet <string>     newFilesHashes  = newFiles.Select(x => x.Hash).ToHashSet();
            HashSet <FileEntity> movedFileHashes = filesToRemove.Where(f => newFilesHashes.Contains(f.Hash)).ToHashSet();

            filesToRemove.ExceptWith(movedFileHashes);

            string container = Settings.Default.ContainerDirectory;
            List <RootDirectoryEntity> otherVersions = new List <RootDirectoryEntity>();

            foreach (var mgv in _mvs.GetManagedVersions().Except(new List <ManagedGameVersion>()
            {
                oldMGV
            }))
            {
                RootDirectoryEntity data = new RootDirectoryEntityIO().Deserialize(mgv.GameXML);
                otherVersions.Add(data);
            }

            int            basePercent     = 0;
            Progress <int> partialProgress = new Progress <int>(percent =>
            {
                progress.Report(basePercent + percent / 2);
            });

            // Remove old unused files from cache
            GameFilesRemover.RemoveFiles(filesToRemove,
                                         otherVersions,
                                         Helpers.EntityToPath(container),
                                         _dirCache,
                                         partialProgress
                                         );
            SaveDirCache();
            basePercent = 50;
            // Remove old unused files from game directory
            foreach (FileEntity unusedFile in filesToRemove)
            {
                string path = Path.Combine(oldMGV.Path, unusedFile.RelativePath);
                try
                {
                    File.Delete(path);
                }
                catch (Exception ex) { }
            }

            // Update files in directory
            CreateGameDirectory(updated, oldMGV.Path, partialProgress);
            progress.Report(100);
        }
Exemple #2
0
        public void DeleteGameDirectory(ManagedGameVersion game, IProgress <int> progress)
        {
            progress.Report(10);
            if (Directory.Exists(game.Path))
            {
                Directory.Delete(game.Path, true);
            }

            RootDirectoryEntity        root          = new RootDirectoryEntityIO().Deserialize(game.GameXML);
            List <RootDirectoryEntity> otherVersions = new List <RootDirectoryEntity>();

            foreach (var mgv in _mvs.GetManagedVersions())
            {
                RootDirectoryEntity data = new RootDirectoryEntityIO().Deserialize(mgv.GameXML);
                otherVersions.Add(data);
            }

            Progress <int> partialProgress = new Progress <int>(prog =>
            {
                int percent = (int)(prog * 0.9);
                progress.Report(10 + percent);
            });

            string container = Settings.Default.ContainerDirectory;

            GameFilesRemover.RemoveFiles(root, otherVersions, container, Helpers.EntityToPath(container), _dirCache, partialProgress);
            SaveDirCache();

            System.Windows.Application.Current.Dispatcher.BeginInvoke((Action) delegate()
            {
                _mvs.Remove(game);
            });
            progress.Report(100);
        }
        public void PlayReplay(Replay replay, GameVersion version)
        {
            LocalGameVersion local = _localVersionsService.GetManagedVersions().FirstOrDefault(x => x.LocalVersion.Version == version.Version).LocalVersion;

            if (local is null)
            {
                throw new InvalidOperationException("This version is not available.");
            }

            PlayReplay(replay, local);
        }
Exemple #4
0
        public void Import(string path, bool copyMods, IProgress <int> progress)
        {
            ImportStatus status = CanImport(path);

            if (status == ImportStatus.INVALID_PATH)
            {
                return;
            }

            if (status == ImportStatus.ALREADY_EXISTS)
            {
                // Check if user attempted to import from managed directory
                bool isTargetDirectoryManaged = _mvs.GetManagedVersions().Select(v => Path.GetFullPath(v.Path)).Contains(Path.GetFullPath(path));
                if (isTargetDirectoryManaged)
                {
                    return;
                }
            }

            int            basePercent     = 0;
            Progress <int> partialProgress = new Progress <int>(percent =>
            {
                progress.Report(basePercent + percent / 3);
            });

            string gameVersion = Helpers.GetGameVersion(path);
            string xmlFilename = gameVersion.Replace(".", "_") + ".xml";
            string xml         = Path.Combine(Settings.Default.VersionDataDirectory, xmlFilename);
            string output      = Path.Combine(Settings.Default.GameOutputDirectory, "World of Tanks " + gameVersion);

            if (status == ImportStatus.CAN_IMPORT)
            {
                // Import new version
                CreateVersionXML(path, xml, partialProgress);
                basePercent = 33;
                _gds.ExtractToContainer(xml, path, partialProgress);
                basePercent = 66;
                _gds.CreateGameDirectory(xml, output, partialProgress);
            }
            else if (status == ImportStatus.ALREADY_EXISTS)
            {
                // Update version
                RootDirectoryEntity newBuild = Helpers.CreateRootEntityFromDirectory(path, true, partialProgress);
                basePercent = 33;
                _gds.ExtractToContainer(newBuild, path, partialProgress);
                basePercent = 66;
                _gds.UpdateGameDirectory(newBuild, output, partialProgress);
                new RootDirectoryEntityIO().Serialize(newBuild, xml);
            }


            if (copyMods)
            {
                CopyDirectory("mods", path, output);
                CopyDirectory("res_mods", path, output);
            }
            progress.Report(100);

            if (status == ImportStatus.CAN_IMPORT)
            {
                System.Windows.Application.Current.Dispatcher.BeginInvoke((Action) delegate()
                {
                    _mvs.Add(xml, output);
                });
            }
        }