protected int OnExecute() { using var hedStream = File.OpenRead(InputHed); var entries = Hed.Read(hedStream); foreach (var entry in entries) { var hash = EpicGamesAssets.ToString(entry.MD5); if (!Names.TryGetValue(hash, out var fileName)) { fileName = $"{hash}.dat"; } Console.WriteLine(fileName); } return(0); }
private void Extract(string inputHed, string output) { var outputDir = output ?? Path.GetFileNameWithoutExtension(inputHed); using var hedStream = File.OpenRead(inputHed); using var img = File.OpenRead(Path.ChangeExtension(inputHed, "pkg")); foreach (var entry in Hed.Read(hedStream)) { var hash = EpicGamesAssets.ToString(entry.MD5); if (!Names.TryGetValue(hash, out var fileName)) { fileName = $"{hash}.dat"; } var outputFileName = Path.Combine(outputDir, ORIGINAL_FILES_FOLDER_NAME, fileName); if (DoNotExtractAgain && File.Exists(outputFileName)) { continue; } Console.WriteLine(outputFileName); CreateDirectoryForFile(outputFileName); //File.Create(outputFileName).Using(stream => stream.Write(img.SetPosition(entry.Offset).ReadBytes(entry.DataLength))); var hdAsset = new EgsHdAsset(img.SetPosition(entry.Offset)); File.Create(outputFileName).Using(stream => stream.Write(hdAsset.ReadData())); outputFileName = Path.Combine(outputDir, REMASTERED_FILES_FOLDER_NAME, fileName); foreach (var asset in hdAsset.Assets) { var outputFileNameRemastered = Path.Combine(GetHDAssetFolder(outputFileName), asset); Console.WriteLine(outputFileNameRemastered); CreateDirectoryForFile(outputFileNameRemastered); var assetData = hdAsset.ReadRemasteredAsset(asset); File.Create(outputFileNameRemastered).Using(stream => stream.Write(assetData)); } } }
private void Patch(string pkgFile, string inputFolder, string outputFolder) { var outputDir = outputFolder ?? Path.GetFileNameWithoutExtension(pkgFile); // Get files to inject in the PKG var hedFile = Path.ChangeExtension(pkgFile, "hed"); using var hedStream = File.OpenRead(hedFile); using var pkgStream = File.OpenRead(pkgFile); if (!Directory.Exists(outputDir)) { Directory.CreateDirectory(outputDir); } using var patchedHedStream = File.Create(Path.Combine(outputDir, Path.GetFileName(hedFile))); using var patchedPkgStream = File.Create(Path.Combine(outputDir, Path.GetFileName(pkgFile))); var pkgOffset = 0L; pkgStream.SetPosition(0); foreach (var entry in Hed.Read(hedStream)) { var hash = EpicGamesAssets.ToString(entry.MD5); // We don't know this filename, we ignore it if (!Names.TryGetValue(hash, out var filename)) { Console.WriteLine($"No name for hash: {hash}!"); continue; } // Replace the found files var asset = new EgsHdAsset(pkgStream.SetPosition(entry.Offset)); var fileToInject = Path.Combine(inputFolder, filename); var newHedEntry = ReplaceFile(fileToInject, inputFolder, patchedHedStream, patchedPkgStream, asset, entry); pkgOffset += newHedEntry.DataLength; } }