mirror of
https://github.com/wabbajack-tools/wabbajack.git
synced 2024-08-30 18:42:17 +00:00
Merge pull request #270 from wabbajack-tools/revert-267-vortex-redone
Revert "Vortex Redone"
This commit is contained in:
commit
75b68e4095
@ -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(),
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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}");
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -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),
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user