mirror of
https://github.com/wabbajack-tools/wabbajack.git
synced 2024-08-30 18:42:17 +00:00
Merge pull request #2198 from wabbajack-tools/meta-hide
Simplified #2195
This commit is contained in:
commit
9b4578e629
@ -107,7 +107,7 @@ public class StandardInstaller : AInstaller<StandardInstaller>
|
|||||||
_configuration.Downloads.CreateDirectory();
|
_configuration.Downloads.CreateDirectory();
|
||||||
|
|
||||||
await OptimizeModlist(token);
|
await OptimizeModlist(token);
|
||||||
|
|
||||||
await HashArchives(token);
|
await HashArchives(token);
|
||||||
|
|
||||||
await DownloadArchives(token);
|
await DownloadArchives(token);
|
||||||
@ -134,7 +134,7 @@ public class StandardInstaller : AInstaller<StandardInstaller>
|
|||||||
|
|
||||||
await InstallIncludedFiles(token);
|
await InstallIncludedFiles(token);
|
||||||
|
|
||||||
await InstallIncludedDownloadMetas(token);
|
await WriteMetaFiles(token);
|
||||||
|
|
||||||
await BuildBSAs(token);
|
await BuildBSAs(token);
|
||||||
|
|
||||||
@ -145,10 +145,8 @@ public class StandardInstaller : AInstaller<StandardInstaller>
|
|||||||
await RemapMO2File();
|
await RemapMO2File();
|
||||||
|
|
||||||
CreateOutputMods();
|
CreateOutputMods();
|
||||||
|
|
||||||
SetScreenSizeInPrefs();
|
|
||||||
|
|
||||||
SetDownloadMetasToHideInMO2(token);
|
SetScreenSizeInPrefs();
|
||||||
|
|
||||||
await ExtractedModlistFolder!.DisposeAsync();
|
await ExtractedModlistFolder!.DisposeAsync();
|
||||||
await _wjClient.SendMetric(MetricNames.FinishInstall, ModList.Name);
|
await _wjClient.SendMetric(MetricNames.FinishInstall, ModList.Name);
|
||||||
@ -177,7 +175,7 @@ public class StandardInstaller : AInstaller<StandardInstaller>
|
|||||||
// Non MO2 Installs won't have this
|
// Non MO2 Installs won't have this
|
||||||
var profileDir = _configuration.Install.Combine("profiles");
|
var profileDir = _configuration.Install.Combine("profiles");
|
||||||
if (!profileDir.DirectoryExists()) return;
|
if (!profileDir.DirectoryExists()) return;
|
||||||
|
|
||||||
profileDir
|
profileDir
|
||||||
.EnumerateFiles()
|
.EnumerateFiles()
|
||||||
.Where(f => f.FileName == Consts.SettingsIni)
|
.Where(f => f.FileName == Consts.SettingsIni)
|
||||||
@ -224,7 +222,7 @@ public class StandardInstaller : AInstaller<StandardInstaller>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task InstallIncludedDownloadMetas(CancellationToken token)
|
private async Task WriteMetaFiles(CancellationToken token)
|
||||||
{
|
{
|
||||||
_logger.LogInformation("Looking for downloads by size");
|
_logger.LogInformation("Looking for downloads by size");
|
||||||
var bySize = UnoptimizedArchives.ToLookup(x => x.Size);
|
var bySize = UnoptimizedArchives.ToLookup(x => x.Size);
|
||||||
@ -233,89 +231,87 @@ public class StandardInstaller : AInstaller<StandardInstaller>
|
|||||||
await _configuration.Downloads.EnumerateFiles()
|
await _configuration.Downloads.EnumerateFiles()
|
||||||
.PDoAll(async download =>
|
.PDoAll(async download =>
|
||||||
{
|
{
|
||||||
|
var metaFile = download.WithExtension(Ext.Meta);
|
||||||
|
|
||||||
var found = bySize[download.Size()];
|
var found = bySize[download.Size()];
|
||||||
var hash = await FileHashCache.FileHashCachedAsync(download, token);
|
var hash = await FileHashCache.FileHashCachedAsync(download, token);
|
||||||
var archive = found.FirstOrDefault(f => f.Hash == hash);
|
var archive = found.FirstOrDefault(f => f.Hash == hash);
|
||||||
if (archive == default) return;
|
|
||||||
|
|
||||||
var metaFile = download.WithExtension(Ext.Meta);
|
IEnumerable<string> meta;
|
||||||
if (metaFile.FileExists())
|
|
||||||
|
if (archive == default)
|
||||||
{
|
{
|
||||||
try
|
// archive is not part of the Modlist
|
||||||
|
|
||||||
|
if (metaFile.FileExists())
|
||||||
{
|
{
|
||||||
var parsed = metaFile.LoadIniFile();
|
try
|
||||||
if (parsed["General"] != null && parsed["General"]["unknownArchive"] == null)
|
{
|
||||||
|
var parsed = metaFile.LoadIniFile();
|
||||||
|
if (parsed["General"] is not null && (
|
||||||
|
parsed["General"]["removed"] is null ||
|
||||||
|
parsed["General"]["removed"].Equals(bool.FalseString, StringComparison.OrdinalIgnoreCase)))
|
||||||
|
{
|
||||||
|
// add removed=true to files not part of the Modlist so they don't show up in MO2
|
||||||
|
parsed["General"]["removed"] = "true";
|
||||||
|
|
||||||
|
_logger.LogInformation("Writing {FileName}", metaFile.FileName);
|
||||||
|
parsed.SaveIniFile(metaFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
catch (Exception)
|
|
||||||
|
// create new meta file if missing
|
||||||
|
meta = new[]
|
||||||
{
|
{
|
||||||
// Ignore
|
"[General]",
|
||||||
}
|
"removed=true"
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (metaFile.FileExists())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var parsed = metaFile.LoadIniFile();
|
||||||
|
if (parsed["General"] is not null && parsed["General"]["unknownArchive"] is null)
|
||||||
|
{
|
||||||
|
// meta doesn't have an associated archive
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
// ignored
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
meta = AddInstalled(_downloadDispatcher.MetaIni(archive));
|
||||||
|
}
|
||||||
|
|
||||||
_logger.LogInformation("Writing {FileName}", metaFile.FileName);
|
_logger.LogInformation("Writing {FileName}", metaFile.FileName);
|
||||||
var meta = AddInstalled(_downloadDispatcher.MetaIni(archive));
|
|
||||||
await metaFile.WriteAllLinesAsync(meta, token);
|
await metaFile.WriteAllLinesAsync(meta, token);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private IEnumerable<string> AddInstalled(IEnumerable<string> getMetaIni)
|
private static IEnumerable<string> AddInstalled(IEnumerable<string> getMetaIni)
|
||||||
{
|
{
|
||||||
yield return "[General]";
|
yield return "[General]";
|
||||||
yield return "installed=true";
|
yield return "installed=true";
|
||||||
|
|
||||||
foreach (var f in getMetaIni)
|
foreach (var f in getMetaIni)
|
||||||
{
|
{
|
||||||
yield return f;
|
yield return f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task SetDownloadMetasToHideInMO2(CancellationToken token)
|
|
||||||
{
|
|
||||||
_logger.LogInformation("Updating Metas To Hide");
|
|
||||||
await _configuration.Downloads.EnumerateFiles()
|
|
||||||
.PDoAll(async download =>
|
|
||||||
{
|
|
||||||
if (download == default) return;
|
|
||||||
if (download.Extension == Ext.Meta) return;
|
|
||||||
|
|
||||||
var linesToWriteNewFile = new HashSet<string>( );
|
|
||||||
linesToWriteNewFile.Add("[General]");
|
|
||||||
linesToWriteNewFile.Add("removed=true");
|
|
||||||
|
|
||||||
var lineToWriteAppendFile = new HashSet<string> {"removed=true"};
|
|
||||||
|
|
||||||
var metaFile = download.WithExtension(Ext.Meta);
|
|
||||||
if (metaFile.FileExists())
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var parsed = metaFile.LoadIniFile();
|
|
||||||
if (parsed["General"] != null)
|
|
||||||
{
|
|
||||||
_logger.LogInformation("Updating {FileName}", metaFile.FileName);
|
|
||||||
|
|
||||||
await metaFile.WriteAllLinesAsync(lineToWriteAppendFile,FileMode.Append,token);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
_logger.LogInformation("Re-Generating corrupted {FileName}", metaFile.FileName);
|
|
||||||
|
|
||||||
await metaFile.WriteAllLinesAsync(linesToWriteNewFile,FileMode.Create,token);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else //Generate new metas to hide files without metas.
|
|
||||||
{
|
|
||||||
_logger.LogInformation("Generating {FileName}", metaFile.FileName);
|
|
||||||
|
|
||||||
await metaFile.WriteAllLinesAsync(linesToWriteNewFile,FileMode.Create,token);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task BuildBSAs(CancellationToken token)
|
private async Task BuildBSAs(CancellationToken token)
|
||||||
{
|
{
|
||||||
var bsas = ModList.Directives.OfType<CreateBSA>().ToList();
|
var bsas = ModList.Directives.OfType<CreateBSA>().ToList();
|
||||||
@ -340,17 +336,17 @@ public class StandardInstaller : AInstaller<StandardInstaller>
|
|||||||
|
|
||||||
_logger.LogInformation("Writing {bsaTo}", bsa.To);
|
_logger.LogInformation("Writing {bsaTo}", bsa.To);
|
||||||
var outPath = _configuration.Install.Combine(bsa.To);
|
var outPath = _configuration.Install.Combine(bsa.To);
|
||||||
|
|
||||||
await using (var outStream = outPath.Open(FileMode.Create, FileAccess.Write, FileShare.None))
|
await using (var outStream = outPath.Open(FileMode.Create, FileAccess.Write, FileShare.None))
|
||||||
{
|
{
|
||||||
await a.Build(outStream, token);
|
await a.Build(outStream, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
streams.Do(s => s.Dispose());
|
streams.Do(s => s.Dispose());
|
||||||
|
|
||||||
await FileHashCache.FileHashWriteCache(outPath, bsa.Hash);
|
await FileHashCache.FileHashWriteCache(outPath, bsa.Hash);
|
||||||
sourceDir.DeleteDirectory();
|
sourceDir.DeleteDirectory();
|
||||||
|
|
||||||
_logger.LogInformation("Verifying {bsaTo}", bsa.To);
|
_logger.LogInformation("Verifying {bsaTo}", bsa.To);
|
||||||
var reader = await BSADispatch.Open(outPath);
|
var reader = await BSADispatch.Open(outPath);
|
||||||
var results = await reader.Files.PMapAllBatchedAsync(_limiter, async state =>
|
var results = await reader.Files.PMapAllBatchedAsync(_limiter, async state =>
|
||||||
@ -362,7 +358,7 @@ public class StandardInstaller : AInstaller<StandardInstaller>
|
|||||||
var astate = bsa.FileStates.First(f => f.Path == state.Path);
|
var astate = bsa.FileStates.First(f => f.Path == state.Path);
|
||||||
var srcDirective = indexedByDestination[Consts.BSACreationDir.Combine(bsa.TempID, astate.Path)];
|
var srcDirective = indexedByDestination[Consts.BSACreationDir.Combine(bsa.TempID, astate.Path)];
|
||||||
//DX10Files are lossy
|
//DX10Files are lossy
|
||||||
if (astate is not BA2DX10File && srcDirective.IsDeterministic)
|
if (astate is not BA2DX10File && srcDirective.IsDeterministic)
|
||||||
ThrowOnNonMatchingHash(bsa, srcDirective, astate, hash);
|
ThrowOnNonMatchingHash(bsa, srcDirective, astate, hash);
|
||||||
return (srcDirective, hash);
|
return (srcDirective, hash);
|
||||||
}).ToHashSet();
|
}).ToHashSet();
|
||||||
@ -408,7 +404,7 @@ public class StandardInstaller : AInstaller<StandardInstaller>
|
|||||||
private void SetScreenSizeInPrefs()
|
private void SetScreenSizeInPrefs()
|
||||||
{
|
{
|
||||||
var profilesPath = _configuration.Install.Combine("profiles");
|
var profilesPath = _configuration.Install.Combine("profiles");
|
||||||
|
|
||||||
// Don't remap files for Native Game Compiler games
|
// Don't remap files for Native Game Compiler games
|
||||||
if (!profilesPath.DirectoryExists()) return;
|
if (!profilesPath.DirectoryExists()) return;
|
||||||
if (_configuration.SystemParameters == null)
|
if (_configuration.SystemParameters == null)
|
||||||
@ -478,7 +474,7 @@ public class StandardInstaller : AInstaller<StandardInstaller>
|
|||||||
{
|
{
|
||||||
_logger.LogCritical(ex, "Skipping screen size remap for {file} due to parse error.", file);
|
_logger.LogCritical(ex, "Skipping screen size remap for {file} due to parse error.", file);
|
||||||
}
|
}
|
||||||
|
|
||||||
// The Witcher 3
|
// The Witcher 3
|
||||||
if (_configuration.Game == Game.Witcher3)
|
if (_configuration.Game == Game.Witcher3)
|
||||||
{
|
{
|
||||||
@ -586,4 +582,4 @@ public class StandardInstaller : AInstaller<StandardInstaller>
|
|||||||
ms.Position = 0;
|
ms.Position = 0;
|
||||||
return JsonSerializer.Deserialize<ModList>(ms, dtos.Options)!;
|
return JsonSerializer.Deserialize<ModList>(ms, dtos.Options)!;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user