Merge pull request #270 from wabbajack-tools/revert-267-vortex-redone

Revert "Vortex Redone"
This commit is contained in:
Timothy Baldridge 2019-12-14 10:31:27 -07:00 committed by GitHub
commit 75b68e4095
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 151 additions and 197 deletions

View File

@ -10,7 +10,7 @@ namespace Wabbajack.Lib.Downloaders
{ {
public static readonly List<IDownloader> Downloaders = new List<IDownloader>() public static readonly List<IDownloader> Downloaders = new List<IDownloader>()
{ {
//new GameFileSourceDownloader(), new GameFileSourceDownloader(),
new MegaDownloader(), new MegaDownloader(),
new DropboxDownloader(), new DropboxDownloader(),
new GoogleDriveDownloader(), new GoogleDriveDownloader(),

View File

@ -1,4 +1,8 @@
using System.Threading.Tasks; using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Alphaleonis.Win32.Filesystem; using Alphaleonis.Win32.Filesystem;
using Wabbajack.Common; using Wabbajack.Common;
using Wabbajack.Lib.Validation; using Wabbajack.Lib.Validation;

View File

@ -1,7 +1,9 @@
using System; using System;
using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Wabbajack.Common; using Wabbajack.Common;

View File

@ -64,12 +64,8 @@ namespace Wabbajack.Lib
.Do(NoWrapText); .Do(NoWrapText);
} }
var archiveCount = lst.Archives.Count + lst.Directives.Count(d => d is SteamMeta);
var totalSize = lst.Archives.Sum(a => a.Size);
totalSize += lst.Directives.Where(d => d is SteamMeta).Cast<SteamMeta>().Sum(s => s.Size);
Text( Text(
$"#### Download Summary ({archiveCount} archives - {totalSize.ToFileSizeString()})"); $"#### Download Summary ({lst.Archives.Count} archives - {lst.Archives.Sum(a => a.Size).ToFileSizeString()})");
foreach (var archive in SortArchives(lst.Archives)) foreach (var archive in SortArchives(lst.Archives))
{ {
var hash = archive.Hash.FromBase64().ToHex(); var hash = archive.Hash.FromBase64().ToHex();
@ -82,8 +78,7 @@ namespace Wabbajack.Lib
if (f is SteamMeta s) if (f is SteamMeta s)
{ {
var link = $"https://steamcommunity.com/sharedfiles/filedetails/?id={s.ItemID}"; var link = $"https://steamcommunity.com/sharedfiles/filedetails/?id={s.ItemID}";
var size = ((long)s.Size).ToFileSizeString(); NoWrapText($"* Steam Workshop Item: [{s.ItemID}]({link}) | Size: {s.Size}");
NoWrapText($"* Steam Workshop Item: [{s.ItemID}]({link}) | Size: {size}");
} }
}); });

View File

@ -4,18 +4,15 @@ using System.IO;
using System.Linq; using System.Linq;
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Text; using System.Text;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Threading;
using DynamicData;
using Microsoft.WindowsAPICodePack.Shell; using Microsoft.WindowsAPICodePack.Shell;
using Newtonsoft.Json; using Newtonsoft.Json;
using Wabbajack.Common; using Wabbajack.Common;
using Wabbajack.Lib.CompilationSteps; using Wabbajack.Lib.CompilationSteps;
using Wabbajack.Lib.NexusApi; using Wabbajack.Lib.NexusApi;
using Wabbajack.Lib.Validation; using File = Alphaleonis.Win32.Filesystem.File;
using Directory = Alphaleonis.Win32.Filesystem.Directory;
using File = System.IO.File;
using Game = Wabbajack.Common.Game;
using Path = Alphaleonis.Win32.Filesystem.Path;
namespace Wabbajack.Lib namespace Wabbajack.Lib
{ {
@ -32,15 +29,15 @@ namespace Wabbajack.Lib
public Game Game { get; } public Game Game { get; }
public string GameName { get; } public string GameName { get; }
public bool IgnoreMissingFiles { get; set; }
public string VortexFolder { get; set; } public string VortexFolder { get; set; }
public string StagingFolder { get; set; } public string StagingFolder { get; set; }
public string DownloadsFolder { get; set; } public string DownloadsFolder { get; set; }
public bool IgnoreMissingFiles { get; set; }
public override ModManager ModManager => ModManager.Vortex; public override ModManager ModManager => ModManager.Vortex;
public override string GamePath { get; } public override string GamePath { get; }
public override string ModListOutputFolder => "output_folder"; public override string ModListOutputFolder { get; }
public override string ModListOutputFile { get; } public override string ModListOutputFile { get; }
public const string StagingMarkerName = "__vortex_staging_folder"; public const string StagingMarkerName = "__vortex_staging_folder";
@ -50,26 +47,19 @@ namespace Wabbajack.Lib
private SteamGame _steamGame; private SteamGame _steamGame;
private bool _hasSteamWorkshopItems; private bool _hasSteamWorkshopItems;
public VortexCompiler(Game game, string gamePath, string vortexFolder, string downloadsFolder, public VortexCompiler(Game game, string gamePath, string vortexFolder, string downloadsFolder, string stagingFolder, string outputFile)
string stagingFolder, string outputFile)
{ {
Game = game; Game = game;
GamePath = gamePath; GamePath = gamePath;
GameName = game.MetaData().NexusName;
VortexFolder = vortexFolder; VortexFolder = vortexFolder;
DownloadsFolder = downloadsFolder; DownloadsFolder = downloadsFolder;
StagingFolder = stagingFolder; StagingFolder = stagingFolder;
ModListOutputFolder = "output_folder";
ModListOutputFile = outputFile; ModListOutputFile = outputFile;
if (string.IsNullOrEmpty(ModListName)) // there can be max one game after filtering
{
ModListName = $"Vortex ModList for {Game.ToString()}";
ModListOutputFile = $"{ModListName}{ExtensionManager.Extension}";
}
GameName = Game.MetaData().NexusName;
ActiveArchives = new List<string>();
SteamHandler.Instance.Games.Where(g => g.Game != null && g.Game == game).Do(g => SteamHandler.Instance.Games.Where(g => g.Game != null && g.Game == game).Do(g =>
{ {
_isSteamGame = true; _isSteamGame = true;
@ -77,51 +67,52 @@ namespace Wabbajack.Lib
SteamHandler.Instance.LoadWorkshopItems(_steamGame); SteamHandler.Instance.LoadWorkshopItems(_steamGame);
_hasSteamWorkshopItems = _steamGame.WorkshopItems.Count > 0; _hasSteamWorkshopItems = _steamGame.WorkshopItems.Count > 0;
}); });
ActiveArchives = new List<string>();
} }
protected override async Task<bool> _Begin(CancellationToken cancel) protected override async Task<bool> _Begin(CancellationToken cancel)
{ {
if (cancel.IsCancellationRequested) return false; if (cancel.IsCancellationRequested) return false;
ConfigureProcessor(10);
if (string.IsNullOrEmpty(ModListName))
ModListName = $"Vortex ModList for {Game.ToString()}";
Info($"Starting Vortex compilation for {GameName} at {GamePath} with staging folder at {StagingFolder} and downloads folder at {DownloadsFolder}."); Info($"Starting Vortex compilation for {GameName} at {GamePath} with staging folder at {StagingFolder} and downloads folder at {DownloadsFolder}.");
ConfigureProcessor(12);
UpdateTracker.Reset();
if (cancel.IsCancellationRequested) return false; if (cancel.IsCancellationRequested) return false;
UpdateTracker.NextStep("Parsing deployment file");
ParseDeploymentFile(); ParseDeploymentFile();
if (cancel.IsCancellationRequested) return false; if (cancel.IsCancellationRequested) return false;
UpdateTracker.NextStep("Creating metas for archives"); Info("Starting pre-compilation steps");
await CreateMetaFiles(); await CreateMetaFiles();
if (cancel.IsCancellationRequested) return false; if (cancel.IsCancellationRequested) return false;
await VFS.IntegrateFromFile(_vfsCacheName); Info($"Indexing {StagingFolder}");
await VFS.AddRoot(StagingFolder);
var roots = new List<string> {StagingFolder, GamePath, DownloadsFolder}; Info($"Indexing {GamePath}");
AddExternalFolder(ref roots); await VFS.AddRoot(GamePath);
Info($"Indexing {DownloadsFolder}");
await VFS.AddRoot(DownloadsFolder);
if (cancel.IsCancellationRequested) return false; if (cancel.IsCancellationRequested) return false;
UpdateTracker.NextStep("Indexing folders"); await AddExternalFolder();
await VFS.AddRoots(roots);
await VFS.WriteToFile(_vfsCacheName);
if (cancel.IsCancellationRequested) return false; if (cancel.IsCancellationRequested) return false;
UpdateTracker.NextStep("Cleaning output folder"); Info("Cleaning output folder");
if (Directory.Exists(ModListOutputFolder)) if (Directory.Exists(ModListOutputFolder)) Utils.DeleteDirectory(ModListOutputFolder);
Utils.DeleteDirectory(ModListOutputFolder);
Directory.CreateDirectory(ModListOutputFolder); Directory.CreateDirectory(ModListOutputFolder);
UpdateTracker.NextStep("Finding Install Files");
var vortexStagingFiles = Directory.EnumerateFiles(StagingFolder, "*", SearchOption.AllDirectories) var vortexStagingFiles = Directory.EnumerateFiles(StagingFolder, "*", SearchOption.AllDirectories)
.Where(p => p.FileExists() && p != StagingMarkerName) .Where(p => p.FileExists() && p != StagingMarkerName)
.Select(p => new RawSourceFile(VFS.Index.ByRootPath[p]) .Select(p => new RawSourceFile(VFS.Index.ByRootPath[p])
{Path = p.RelativeTo(StagingFolder)}); {Path = p.RelativeTo(StagingFolder)});
var vortexDownloads = Directory.EnumerateFiles(DownloadsFolder, "*", SearchOption.AllDirectories) var vortexDownloads = Directory.EnumerateFiles(DownloadsFolder, "*", SearchOption.AllDirectories)
.Where(p => p.FileExists() && p != DownloadMarkerName) .Where(p => p.FileExists())
.Select(p => new RawSourceFile(VFS.Index.ByRootPath[p]) .Select(p => new RawSourceFile(VFS.Index.ByRootPath[p])
{Path = p.RelativeTo(DownloadsFolder)}); {Path = p.RelativeTo(DownloadsFolder)});
@ -148,6 +139,7 @@ namespace Wabbajack.Lib
.GroupBy(f => f.Hash) .GroupBy(f => f.Hash)
.ToDictionary(f => f.Key, f => f.AsEnumerable()); .ToDictionary(f => f.Key, f => f.AsEnumerable());
Info("Searching for mod files");
AllFiles = vortexStagingFiles.Concat(vortexDownloads) AllFiles = vortexStagingFiles.Concat(vortexDownloads)
.Concat(gameFiles) .Concat(gameFiles)
.DistinctBy(f => f.Path) .DistinctBy(f => f.Path)
@ -156,8 +148,7 @@ namespace Wabbajack.Lib
Info($"Found {AllFiles.Count} files to build into mod list"); Info($"Found {AllFiles.Count} files to build into mod list");
if (cancel.IsCancellationRequested) return false; if (cancel.IsCancellationRequested) return false;
UpdateTracker.NextStep("Verifying destinations"); Info("Verifying destinations");
var duplicates = AllFiles.GroupBy(f => f.Path) var duplicates = AllFiles.GroupBy(f => f.Path)
.Where(fs => fs.Count() > 1) .Where(fs => fs.Count() > 1)
.Select(fs => .Select(fs =>
@ -194,9 +185,9 @@ namespace Wabbajack.Lib
if(targetArchive.IniData?.General?.tag == null || targetArchive.IniData?.General?.tag != Consts.WABBAJACK_VORTEX_MANUAL) if(targetArchive.IniData?.General?.tag == null || targetArchive.IniData?.General?.tag != Consts.WABBAJACK_VORTEX_MANUAL)
continue; continue;
#if DEBUG #if DEBUG
Utils.Log($"Double hash for: {f.AbsolutePath}"); Utils.Log($"Double hash for: {f.AbsolutePath}");
#endif #endif
var replace = f; var replace = f;
var name = replace.File.Name; var name = replace.File.Name;
@ -213,9 +204,9 @@ namespace Wabbajack.Lib
//AllFiles.Replace(f, replace); //AllFiles.Replace(f, replace);
} }
if (cancel.IsCancellationRequested) return false;
var stack = MakeStack(); var stack = MakeStack();
UpdateTracker.NextStep("Running Compilation Stack");
Info("Running Compilation Stack");
var results = await AllFiles.PMap(Queue, f => RunStack(stack.Where(s => s != null), f)); var results = await AllFiles.PMap(Queue, f => RunStack(stack.Where(s => s != null), f));
IEnumerable<NoMatch> noMatch = results.OfType<NoMatch>().ToList(); IEnumerable<NoMatch> noMatch = results.OfType<NoMatch>().ToList();
@ -237,17 +228,17 @@ namespace Wabbajack.Lib
InstallDirectives = results.Where(i => !(i is IgnoredDirectly)).ToList(); InstallDirectives = results.Where(i => !(i is IgnoredDirectly)).ToList();
Info("Getting Nexus api_key, please click authorize if a browser window appears"); // TODO: nexus stuff
/*Info("Getting Nexus api_key, please click authorize if a browser window appears");
if (IndexedArchives.Any(a => a.IniData?.General?.gameName != null)) if (IndexedArchives.Any(a => a.IniData?.General?.gameName != null))
{ {
var nexusClient = await NexusApiClient.Get(); var nexusClient = new NexusApiClient();
if (!await nexusClient.IsPremium()) Error($"User {await nexusClient.Username()} is not a premium Nexus user, so we cannot access the necessary API calls, cannot continue"); if (!nexusClient.IsPremium) Error($"User {nexusClient.Username} is not a premium Nexus user, so we cannot access the necessary API calls, cannot continue");
} }
*/
if (cancel.IsCancellationRequested) return false; if (cancel.IsCancellationRequested) return false;
UpdateTracker.NextStep("Gathering Archives");
await GatherArchives(); await GatherArchives();
ModList = new ModList ModList = new ModList
@ -264,45 +255,15 @@ namespace Wabbajack.Lib
GameType = Game GameType = Game
}; };
UpdateTracker.NextStep("Running Validation");
await ValidateModlist.RunValidation(Queue, ModList);
UpdateTracker.NextStep("Generating Report");
GenerateReport(); GenerateReport();
UpdateTracker.NextStep("Exporting ModList");
ExportModList(); ExportModList();
ResetMembers(); Info("Done Building ModList");
ShowReport(); ShowReport();
UpdateTracker.NextStep("Done Building ModList");
return true; return true;
} }
/// <summary>
/// Clear references to lists that hold a lot of data.
/// </summary>
private void ResetMembers()
{
AllFiles = null;
InstallDirectives = null;
SelectedArchives = null;
}
private void AddExternalFolder(ref List<string> roots)
{
var currentGame = Game.MetaData();
if (currentGame.AdditionalFolders == null || currentGame.AdditionalFolders.Count == 0) return;
foreach (var path in currentGame.AdditionalFolders.Select(f => f.Replace("%documents%", KnownFolders.Documents.Path)))
{
if (!Directory.Exists(path)) return;
roots.Add(path);
}
}
private void ParseDeploymentFile() private void ParseDeploymentFile()
{ {
Info("Searching for vortex.deployment.json..."); Info("Searching for vortex.deployment.json...");
@ -319,10 +280,10 @@ namespace Wabbajack.Lib
if (string.IsNullOrEmpty(deploymentFile)) if (string.IsNullOrEmpty(deploymentFile))
{ {
Error("vortex.deployment.json not found!"); Info("vortex.deployment.json not found!");
return; return;
} }
Info($"vortex.deployment.json found at {deploymentFile}"); Info("vortex.deployment.json found at "+deploymentFile);
Info("Parsing vortex.deployment.json..."); Info("Parsing vortex.deployment.json...");
try try
@ -345,29 +306,50 @@ namespace Wabbajack.Lib
}); });
} }
/// <summary>
/// Some have mods outside their game folder located
/// </summary>
private async Task AddExternalFolder()
{
var currentGame = Game.MetaData();
if (currentGame.AdditionalFolders == null || currentGame.AdditionalFolders.Count == 0) return;
foreach (var f in currentGame.AdditionalFolders)
{
var path = f.Replace("%documents%", KnownFolders.Documents.Path);
if (!Directory.Exists(path)) return;
Info($"Indexing {path}");
await VFS.AddRoot(path);
}
}
private async Task CreateMetaFiles() private async Task CreateMetaFiles()
{ {
Utils.Log("Getting Nexus api_key, please click authorize if a browser window appears"); Utils.Log("Getting Nexus api_key, please click authorize if a browser window appears");
var nexusClient = await NexusApiClient.Get(); var nexusClient = await NexusApiClient.Get();
var archives = Directory.EnumerateFiles(DownloadsFolder, "*", SearchOption.TopDirectoryOnly).Where(f => await Task.WhenAll(
File.Exists(f) && Path.GetExtension(f) != ".meta" && Path.GetExtension(f) != ".xxHash" && Directory.EnumerateFiles(DownloadsFolder, "*", SearchOption.TopDirectoryOnly)
!File.Exists($"{f}.meta") && ActiveArchives.Contains(Path.GetFileNameWithoutExtension(f))); .Where(File.Exists)
.Select(async f =>
await archives.PMap(Queue, async f =>
{ {
Info($"Creating meta file for {Path.GetFileName(f)}"); if (Path.GetExtension(f) != ".meta" && Path.GetExtension(f) != ".xxHash" && !File.Exists($"{f}.meta") && ActiveArchives.Contains(Path.GetFileNameWithoutExtension(f)))
{
Utils.Log($"Trying to create meta file for {Path.GetFileName(f)}");
var metaString = "[General]\n" + var metaString = "[General]\n" +
"repository=Nexus\n" + "repository=Nexus\n" +
"installed=true\n" +
"uninstalled=false\n" +
"paused=false\n" +
"removed=false\n" +
$"gameName={GameName}\n"; $"gameName={GameName}\n";
string hash; string hash;
using(var md5 = MD5.Create()) using(var md5 = MD5.Create())
using (var stream = File.OpenRead(f)) using (var stream = File.OpenRead(f))
{ {
Info($"Calculating hash for {Path.GetFileName(f)}"); Utils.Log($"Calculating hash for {Path.GetFileName(f)}");
var cH = md5.ComputeHash(stream); var cH = md5.ComputeHash(stream);
hash = BitConverter.ToString(cH).Replace("-", "").ToLowerInvariant(); hash = BitConverter.ToString(cH).Replace("-", "").ToLowerInvariant();
Info($"Hash is {hash}"); Utils.Log($"Hash is {hash}");
} }
var md5Response = await nexusClient.GetModInfoFromMD5(Game, hash); var md5Response = await nexusClient.GetModInfoFromMD5(Game, hash);
@ -375,25 +357,23 @@ namespace Wabbajack.Lib
{ {
var modInfo = md5Response[0].mod; var modInfo = md5Response[0].mod;
metaString += $"modID={modInfo.mod_id}\n" + metaString += $"modID={modInfo.mod_id}\n" +
$"modName={modInfo.name}\n" + $"modName={modInfo.name}\nfileID={md5Response[0].file_details.file_id}";
$"fileID={md5Response[0].file_details.file_id}\n" +
$"version={md5Response[0].file_details.version}\n";
File.WriteAllText(f+".meta",metaString, Encoding.UTF8); File.WriteAllText(f+".meta",metaString, Encoding.UTF8);
} }
else else
{ {
Error("Error while getting information from NexusMods via MD5 hash!"); Error("Error while getting information from NexusMods via MD5 hash!");
} }
}); }
else
var otherFiles = Directory.EnumerateFiles(DownloadsFolder, "*", SearchOption.TopDirectoryOnly).Where(f =>
Path.GetExtension(f) == ".meta" && !ActiveArchives.Contains(Path.GetFileNameWithoutExtension(f)));
await otherFiles.PMap(Queue, async f =>
{ {
Info($"File {f} is not in ActiveArchives"); if (Path.GetExtension(f) != ".meta" ||
ActiveArchives.Contains(Path.GetFileNameWithoutExtension(f)))
return;
Utils.Log($"File {f} is not in ActiveArchives");
var lines = File.ReadAllLines(f); var lines = File.ReadAllLines(f);
if (lines.Length == 0 || !lines.Any(line => lines.Contains("directURL="))) if (lines.Length == 0 || !lines.Any(line => line.Contains("directURL=")))
{ {
if (lines.Length == 0) if (lines.Length == 0)
return; return;
@ -407,19 +387,20 @@ namespace Wabbajack.Lib
if (tag != Consts.WABBAJACK_VORTEX_MANUAL) if (tag != Consts.WABBAJACK_VORTEX_MANUAL)
return; return;
Info($"File {f} contains the {Consts.WABBAJACK_VORTEX_MANUAL} tag, adding to ActiveArchives"); Utils.Log($"File {f} contains the {Consts.WABBAJACK_VORTEX_MANUAL} tag, adding to ActiveArchives");
ActiveArchives.Add(Path.GetFileNameWithoutExtension(f)); ActiveArchives.Add(Path.GetFileNameWithoutExtension(f));
}); });
} }
else else
{ {
Info($"File {f} appears to not be from the Nexus, adding to ActiveArchives"); Utils.Log($"File {f} appears to not come from the Nexus, adding to ActiveArchives");
ActiveArchives.Add(Path.GetFileNameWithoutExtension(f)); ActiveArchives.Add(Path.GetFileNameWithoutExtension(f));
} }
}); }
}));
Info($"Checking for Steam Workshop Items..."); Utils.Log($"Checking for Steam Workshop Items...");
if (!_isSteamGame || _steamGame == null || !_hasSteamWorkshopItems) if (!_isSteamGame || _steamGame == null || _steamGame.WorkshopItems.Count <= 0)
return; return;
_steamGame.WorkshopItems.Do(item => _steamGame.WorkshopItems.Do(item =>
@ -434,6 +415,7 @@ namespace Wabbajack.Lib
Utils.Log($"Creating meta file for {item.ItemID}"); Utils.Log($"Creating meta file for {item.ItemID}");
var metaString = "[General]\n" + var metaString = "[General]\n" +
"repository=Steam\n" + "repository=Steam\n" +
"installed=true\n" +
$"gameName={GameName}\n" + $"gameName={GameName}\n" +
$"steamID={_steamGame.AppId}\n" + $"steamID={_steamGame.AppId}\n" +
$"itemID={item.ItemID}\n" + $"itemID={item.ItemID}\n" +
@ -458,22 +440,20 @@ namespace Wabbajack.Lib
var stack = MakeStack(); var stack = MakeStack();
var compilationSteps = stack.ToList(); File.WriteAllText(Path.Combine(s, "_current_compilation_stack.yml"),
File.WriteAllText(Path.Combine(s, "_current_compilation_stack.yml"), Serialization.Serialize(compilationSteps)); Serialization.Serialize(stack));
return compilationSteps; return stack;
} }
public override IEnumerable<ICompilationStep> MakeStack() public override IEnumerable<ICompilationStep> MakeStack()
{ {
Info("Generating compilation stack"); Utils.Log("Generating compilation stack");
return new List<ICompilationStep> return new List<ICompilationStep>
{ {
new IncludePropertyFiles(this), new IncludePropertyFiles(this),
new IncludeSteamWorkshopItems(this, _steamGame), new IncludeSteamWorkshopItems(this, _steamGame),
_hasSteamWorkshopItems ? new IncludeRegex(this, "^steamWorkshopItem_\\d*\\.meta$") : null, _hasSteamWorkshopItems ? new IncludeRegex(this, "^steamWorkshopItem_\\d*\\.meta$") : null,
new IgnoreDisabledVortexMods(this), new IgnoreDisabledVortexMods(this),
new IncludeVortexDeployment(this), new IncludeVortexDeployment(this),
new IgnoreVortex(this), new IgnoreVortex(this),

View File

@ -19,14 +19,12 @@ namespace Wabbajack.Lib
public override ModManager ModManager => ModManager.Vortex; public override ModManager ModManager => ModManager.Vortex;
public string GameFolder { get; set; }
public VortexInstaller(string archive, ModList modList, string outputFolder, string downloadFolder) public VortexInstaller(string archive, ModList modList, string outputFolder, string downloadFolder)
: base( : base(
archive, archive: archive,
modList, modList: modList,
outputFolder, outputFolder: outputFolder,
downloadFolder) downloadFolder: downloadFolder)
{ {
#if DEBUG #if DEBUG
// TODO: only for testing // TODO: only for testing
@ -45,33 +43,17 @@ namespace Wabbajack.Lib
"for support.", "Warning", "for support.", "Warning",
MessageBoxButton.OK); MessageBoxButton.OK);
if (GameFolder == null)
GameFolder = GameInfo.GameLocation();
if (GameFolder == null)
{
MessageBox.Show(
$"In order to do a proper install Wabbajack needs to know where your {GameInfo.NexusName} folder resides. We tried looking the" +
"game location up but were unable to find it, please make sure you launch the game once before running this installer. ",
"Could not find game location", MessageBoxButton.OK);
Error("Exiting because we couldn't find the game folder.");
return false;
}
if (cancel.IsCancellationRequested) return false; if (cancel.IsCancellationRequested) return false;
ConfigureProcessor(10, await RecommendQueueSize()); ConfigureProcessor(10, await RecommendQueueSize());
Directory.CreateDirectory(DownloadFolder); Directory.CreateDirectory(DownloadFolder);
if (cancel.IsCancellationRequested) return false; if (cancel.IsCancellationRequested) return false;
UpdateTracker.NextStep("Hashing Archives");
await HashArchives(); await HashArchives();
if (cancel.IsCancellationRequested) return false; if (cancel.IsCancellationRequested) return false;
UpdateTracker.NextStep("Downloading Missing Archives");
await DownloadArchives(); await DownloadArchives();
if (cancel.IsCancellationRequested) return false; if (cancel.IsCancellationRequested) return false;
UpdateTracker.NextStep("Hashing Remaining Archives");
await HashArchives(); await HashArchives();
if (cancel.IsCancellationRequested) return false; if (cancel.IsCancellationRequested) return false;
@ -86,34 +68,25 @@ namespace Wabbajack.Lib
Error("Cannot continue, was unable to download one or more archives"); Error("Cannot continue, was unable to download one or more archives");
} }
if (cancel.IsCancellationRequested) return false;
UpdateTracker.NextStep("Priming VFS");
await PrimeVFS(); await PrimeVFS();
if (cancel.IsCancellationRequested) return false; if (cancel.IsCancellationRequested) return false;
UpdateTracker.NextStep("Building Folder Structure");
BuildFolderStructure(); BuildFolderStructure();
if (cancel.IsCancellationRequested) return false; if (cancel.IsCancellationRequested) return false;
UpdateTracker.NextStep("Installing Archives");
await InstallArchives(); await InstallArchives();
if (cancel.IsCancellationRequested) return false; if (cancel.IsCancellationRequested) return false;
UpdateTracker.NextStep("Installing Included files");
await InstallIncludedFiles(); await InstallIncludedFiles();
if (cancel.IsCancellationRequested) return false; if (cancel.IsCancellationRequested) return false;
UpdateTracker.NextStep("Installing Manual files");
await InstallManualGameFiles(); await InstallManualGameFiles();
if (cancel.IsCancellationRequested) return false; if (cancel.IsCancellationRequested) return false;
UpdateTracker.NextStep("Installing SteamWorkshopItems");
await InstallSteamWorkshopItems(); await InstallSteamWorkshopItems();
//InstallIncludedDownloadMetas(); //InstallIncludedDownloadMetas();
UpdateTracker.NextStep("Installation complete! You may exit the program."); Info("Installation complete! You may exit the program.");
return true; return true;
} }